diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index f807be1e4..0a9da0e36 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -6764,6 +6764,7 @@ mrbc_cleanup_local_variables(mrb_state *mrb, mrbc_context *c) c->syms = NULL; c->slen = 0; } + c->keep_lv = FALSE; } MRB_API void diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c index 0bb243887..9d0b70a3b 100644 --- a/mrbgems/mruby-compiler/core/y.tab.c +++ b/mrbgems/mruby-compiler/core/y.tab.c @@ -12964,6 +12964,7 @@ mrbc_cleanup_local_variables(mrb_state *mrb, mrbc_context *c) c->syms = NULL; c->slen = 0; } + c->keep_lv = FALSE; } MRB_API void diff --git a/src/vm.c b/src/vm.c index b9ff95e5d..ec92fabdf 100644 --- a/src/vm.c +++ b/src/vm.c @@ -3097,7 +3097,11 @@ mrb_top_run(mrb_state *mrb, const struct RProc *proc, mrb_value self, mrb_int st return mrb_vm_run(mrb, proc, self, stack_keep); } if (mrb->c->ci == mrb->c->cibase) { - mrb_vm_ci_env_set(mrb->c->ci, NULL); + if (stack_keep == 0) { + struct REnv *e = mrb_vm_ci_env(mrb->c->ci); + mrb_vm_ci_env_set(mrb->c->ci, NULL); + mrb_env_unshare(mrb, e, FALSE); + } return mrb_vm_run(mrb, proc, self, stack_keep); } cipush(mrb, 0, CINFO_SKIP, mrb->object_class, NULL, NULL, 0, 0);