Merge pull request #6184 from dearblue/L_STOP
authorYukihiro "Matz" Matsumoto <[email protected]>
Wed, 6 Mar 2024 09:02:34 +0000 (6 18:02 +0900)
committerGitHub <[email protected]>
Wed, 6 Mar 2024 09:02:34 +0000 (6 18:02 +0900)
Remove the `L_STOP` label

1  2 
src/vm.c

diff --combined src/vm.c
+++ b/src/vm.c
@@@ -1780,7 -1780,8 +1780,8 @@@ RETRY_TRY_BLOCK
            }
            else if (mrb->c == mrb->root_c) {
              mrb->c->ci->stack = mrb->c->stbase;
-             goto L_STOP;
+             mrb->jmp = prev_jmp;
+             return mrb_obj_value(mrb->exc);
            }
            else {
              struct mrb_context *c = mrb->c;
        mrb_gc_arena_shrink(mrb, ai);
        if (mrb->exc) goto L_RAISE;
        ci = mrb->c->ci;
 -      if (!ci->u.target_class) { /* return from context modifying method (resume/yield) */
 +      if (!ci->u.keep_context) { /* return from context modifying method (resume/yield) */
          if (ci->cci == CINFO_RESUMED) {
            mrb->jmp = prev_jmp;
            return recv;
        if (MRB_PROC_ENV_P(dst)) {
          struct REnv *e = MRB_PROC_ENV(dst);
  
 -        if (!MRB_ENV_ONSTACK_P(e) || (e->cxt && e->cxt != mrb->c)) {
 +        if (!MRB_ENV_ONSTACK_P(e) || e->cxt != mrb->c) {
            localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
            goto L_RAISE;
          }
            struct mrb_context *c = mrb->c;
            if (c == mrb->root_c) {
              /* toplevel return */
-             regs[irep->nlocals] = v;
-             goto L_STOP;
+             mrb_gc_arena_restore(mrb, ai);
+             mrb->jmp = prev_jmp;
+             return v;
            }
  
            /* fiber termination should automatic yield or transfer to root */
            ci = mrb->c->ci;
          }
  
 -        if (mrb->c->vmexec && !CI_TARGET_CLASS(ci)) {
 +        if (mrb->c->vmexec && !ci->u.keep_context) {
            mrb_gc_arena_restore(mrb, ai);
            mrb->c->vmexec = FALSE;
            mrb->jmp = prev_jmp;
          UNWIND_ENSURE(mrb, mrb->c->ci, mrb->c->ci->pc, RBREAK_TAG_STOP, mrb->c->ci, mrb_nil_value());
        }
        CHECKPOINT_END(RBREAK_TAG_STOP);
-     L_STOP:
        mrb->jmp = prev_jmp;
        if (mrb->exc) {
          mrb_assert(mrb->exc->tt == MRB_TT_EXCEPTION);