mirror of
https://github.com/ruby/ruby.git
synced 2025-09-16 09:04:05 +02:00
merge revision(s) 49266: [Backport #10689]
* eval_intern.h, vm.c, vm_eval.c, vm_insnhelper.c: change throw mechanism (not save target ep, but save target cfp). It fixes `unexpected break' bug that occurs when TracePoint#binding is called. [ruby-dev:48797] [Bug #10689] * test/ruby/test_settracefunc.rb: add a test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@49374 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a45cd37557
commit
0ee6afe2c1
7 changed files with 232 additions and 209 deletions
10
vm_eval.c
10
vm_eval.c
|
@ -1100,10 +1100,9 @@ rb_iterate(VALUE (* it_proc) (VALUE), VALUE data1,
|
|||
else {
|
||||
VALUE err = th->errinfo;
|
||||
if (state == TAG_BREAK) {
|
||||
VALUE *escape_ep = GET_THROWOBJ_CATCH_POINT(err);
|
||||
VALUE *cep = cfp->ep;
|
||||
rb_control_frame_t *escape_cfp = GET_THROWOBJ_CATCH_POINT(err);
|
||||
|
||||
if (cep == escape_ep) {
|
||||
if (cfp == escape_cfp) {
|
||||
state = 0;
|
||||
th->state = 0;
|
||||
th->errinfo = Qnil;
|
||||
|
@ -1116,10 +1115,9 @@ rb_iterate(VALUE (* it_proc) (VALUE), VALUE data1,
|
|||
}
|
||||
}
|
||||
else if (state == TAG_RETRY) {
|
||||
VALUE *escape_ep = GET_THROWOBJ_CATCH_POINT(err);
|
||||
VALUE *cep = cfp->ep;
|
||||
rb_control_frame_t *escape_cfp = GET_THROWOBJ_CATCH_POINT(err);
|
||||
|
||||
if (cep == escape_ep) {
|
||||
if (cfp == escape_cfp) {
|
||||
rb_vm_rewind_cfp(th, cfp);
|
||||
|
||||
state = 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue