mirror of
https://github.com/ruby/ruby.git
synced 2025-08-23 13:04:13 +02:00
* vm.c (rb_iter_break_value): new function to break a block with
the value. [ruby-dev:45132] [Feature #5895] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@34369 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d03199b6d6
commit
04726dd749
7 changed files with 43 additions and 4 deletions
15
vm.c
15
vm.c
|
@ -987,23 +987,29 @@ rb_vm_jump_tag_but_local_jump(int state, VALUE val)
|
|||
JUMP_TAG(state);
|
||||
}
|
||||
|
||||
NORETURN(static void vm_iter_break(rb_thread_t *th));
|
||||
NORETURN(static void vm_iter_break(rb_thread_t *th, VALUE val));
|
||||
|
||||
static void
|
||||
vm_iter_break(rb_thread_t *th)
|
||||
vm_iter_break(rb_thread_t *th, VALUE val)
|
||||
{
|
||||
rb_control_frame_t *cfp = th->cfp;
|
||||
VALUE *dfp = GC_GUARDED_PTR_REF(*cfp->dfp);
|
||||
|
||||
th->state = TAG_BREAK;
|
||||
th->errinfo = (VALUE)NEW_THROW_OBJECT(Qnil, (VALUE)dfp, TAG_BREAK);
|
||||
th->errinfo = (VALUE)NEW_THROW_OBJECT(val, (VALUE)dfp, TAG_BREAK);
|
||||
TH_JUMP_TAG(th, TAG_BREAK);
|
||||
}
|
||||
|
||||
void
|
||||
rb_iter_break(void)
|
||||
{
|
||||
vm_iter_break(GET_THREAD());
|
||||
vm_iter_break(GET_THREAD(), Qnil);
|
||||
}
|
||||
|
||||
void
|
||||
rb_iter_break_value(VALUE val)
|
||||
{
|
||||
vm_iter_break(GET_THREAD(), val);
|
||||
}
|
||||
|
||||
/* optimization: redefine management */
|
||||
|
@ -1352,6 +1358,7 @@ vm_exec(rb_thread_t *th)
|
|||
#endif
|
||||
}
|
||||
th->errinfo = Qnil;
|
||||
th->state = 0;
|
||||
goto vm_loop_start;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue