diff --git a/src/vm.c b/src/vm.c index 078796539..483c6422d 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1521,7 +1521,14 @@ prepare_tagged_break(mrb_state *mrb, uint32_t tag, const mrb_callinfo *return_ci #define CASE(insn,ops) case insn: { const mrb_code *pc = ci->pc+1; FETCH_ ## ops (); ci->pc = pc; } L_ ## insn ## _BODY: #define NEXT goto L_END_DISPATCH #define JUMP NEXT +#ifdef MRB_USE_TASK_SCHEDULER +#define END_DISPATCH L_END_DISPATCH: \ + if (mrb->task->switching || mrb->c->status == MRB_TASK_STOPPED) \ + return mrb_nil_value(); \ + }} +#else #define END_DISPATCH L_END_DISPATCH:;}} +#endif #else @@ -1530,10 +1537,24 @@ prepare_tagged_break(mrb_state *mrb, uint32_t tag, const mrb_callinfo *return_ci #define NEXT insn=BYTECODE_DECODER(*ci->pc); CODE_FETCH_HOOK(mrb, irep, ci->pc, regs); goto *optable[insn] #define JUMP NEXT +#ifdef MRB_USE_TASK_SCHEDULER +#define END_DISPATCH \ + if (mrb->task->switching || mrb->c->status == MRB_TASK_STOPPED) \ + return mrb_nil_value(); +#else #define END_DISPATCH +#endif #endif +#ifdef MRB_USE_TASK_SCHEDULER +#define TASK_STOP(mrb) \ + if (mrb->c->status == MRB_TASK_CREATED) \ + mrb->c->status = MRB_TASK_STOPPED; +#else +#define TASK_STOP(mrb) +#endif + /** * @brief Executes a mruby bytecode sequence (iseq) within the VM. * @@ -3342,9 +3363,11 @@ RETRY_TRY_BLOCK: mrb->jmp = prev_jmp; if (!mrb_nil_p(v)) { mrb->exc = mrb_obj_ptr(v); + TASK_STOP(mrb); return v; } mrb->exc = NULL; + TASK_STOP(mrb); return regs[irep->nlocals]; } }