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:
naruse 2015-01-22 02:46:06 +00:00
parent a45cd37557
commit 0ee6afe2c1
7 changed files with 232 additions and 209 deletions

View file

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