mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
fix: wrap mrb_task_run in MRB_TRY/MRB_CATCH
This commit is contained in:
@@ -14,6 +14,7 @@
|
|||||||
#include <mruby/internal.h>
|
#include <mruby/internal.h>
|
||||||
#include <mruby/proc.h>
|
#include <mruby/proc.h>
|
||||||
#include <mruby/string.h>
|
#include <mruby/string.h>
|
||||||
|
#include <mruby/throw.h>
|
||||||
#include <mruby/variable.h>
|
#include <mruby/variable.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -443,6 +444,8 @@ mrb_tick(mrb_state *mrb)
|
|||||||
MRB_API mrb_value
|
MRB_API mrb_value
|
||||||
mrb_task_run(mrb_state *mrb)
|
mrb_task_run(mrb_state *mrb)
|
||||||
{
|
{
|
||||||
|
struct mrb_jmpbuf *prev_jmp;
|
||||||
|
struct mrb_jmpbuf c_jmp;
|
||||||
mrb_task *t;
|
mrb_task *t;
|
||||||
|
|
||||||
if (mrb->task.loop_running) {
|
if (mrb->task.loop_running) {
|
||||||
@@ -450,6 +453,10 @@ mrb_task_run(mrb_state *mrb)
|
|||||||
}
|
}
|
||||||
mrb->task.loop_running = TRUE;
|
mrb->task.loop_running = TRUE;
|
||||||
|
|
||||||
|
prev_jmp = mrb->jmp;
|
||||||
|
MRB_TRY(&c_jmp) {
|
||||||
|
mrb->jmp = &c_jmp;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
t = q_ready_;
|
t = q_ready_;
|
||||||
|
|
||||||
@@ -485,6 +492,12 @@ mrb_task_run(mrb_state *mrb)
|
|||||||
mrb_incremental_gc(mrb);
|
mrb_incremental_gc(mrb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mrb->jmp = prev_jmp;
|
||||||
|
} MRB_CATCH(&c_jmp) {
|
||||||
|
mrb->task.loop_running = FALSE;
|
||||||
|
mrb->jmp = prev_jmp;
|
||||||
|
MRB_THROW(prev_jmp);
|
||||||
|
} MRB_END_EXC(&c_jmp);
|
||||||
|
|
||||||
mrb->task.loop_running = FALSE;
|
mrb->task.loop_running = FALSE;
|
||||||
return mrb_nil_value();
|
return mrb_nil_value();
|
||||||
|
|||||||
Reference in New Issue
Block a user