@@@ -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);