From aaa0f124c3850bcf53dd0a1497b24fd46fb82441 Mon Sep 17 00:00:00 2001 From: dearblue Date: Mon, 4 Dec 2023 21:48:56 +0900 Subject: [PATCH] Restore the value of `ci->cci` with `fiber_switch()` If `mrb_fiber_resume()` was called from a C function as a method definition, the mruby VM was not processed afterwards. Called Fiber.yield mrb_vm_exec() <<-- returns from the function by CINFO_RESUMED fiber_switch() <<-- this patch causes the value to return to its pre-call state mrb_fiber_resume() mrb_vm_exec() <<-- previously, returns from the function immediately as it was CINFO_RESUMED ... main() --- mrbgems/mruby-fiber/src/fiber.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c index d9718121d..893a0c960 100644 --- a/mrbgems/mruby-fiber/src/fiber.c +++ b/mrbgems/mruby-fiber/src/fiber.c @@ -277,9 +277,11 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr } if (vmexec) { + int cci = old_c->ci->cci; c->vmexec = TRUE; value = mrb_vm_exec(mrb, c->ci->proc, c->ci->pc); mrb->c = old_c; + old_c->ci->cci = cci; /* restore values as they may have changed in Fiber.yield */ } else { MARK_CONTEXT_MODIFY(c);