From 69682e3d41113f109567679bf99e27f42e5da4df Mon Sep 17 00:00:00 2001 From: dearblue Date: Sun, 31 Dec 2023 14:18:54 +0900 Subject: [PATCH] Fixed when combined `mrb_fiber_resume()` and `Fiber#transfer` For example, the following code was crashing. ```c #include #include #include int main(int argc, char *argv[]) { mrb_state *mrb = mrb_open(); mrb_value fiber = mrb_load_string(mrb, "Fiber.new { Fiber.new { 12345.6789 }.transfer }"); mrb_value res = mrb_fiber_resume(mrb, fiber, 0, NULL); mrb_p(mrb, res); mrb_close(mrb); return 0; } ``` --- src/vm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vm.c b/src/vm.c index 759fd977a..a5c1dee9c 100644 --- a/src/vm.c +++ b/src/vm.c @@ -2399,7 +2399,8 @@ RETRY_TRY_BLOCK: mrb->c = c->prev ? c->prev : mrb->root_c; c->prev = NULL; mrb->c->status = MRB_FIBER_RUNNING; - if (c->vmexec) { + if (c->vmexec || + (mrb->c == mrb->root_c && mrb->c->ci == mrb->c->cibase) /* case using Fiber#transfer in mrb_fiber_resume() */) { mrb_gc_arena_restore(mrb, ai); c->vmexec = FALSE; mrb->jmp = prev_jmp;