fix: wrap mrb_task_run in MRB_TRY/MRB_CATCH

This commit is contained in:
0x1eef
2026-05-27 23:19:43 -03:00
parent 819156e678
commit ee82a7fcc6
+13
View File
@@ -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();