diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-06-17 19:27:24 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-06-17 19:27:24 +0000 |
commit | 00e4fd42f36fa23de04cccb9cea3c3e5d14c9ae9 () | |
tree | 0012d083c6af5721147cdd7ed7d21d260f38b811 | |
parent | e2f37fb9c6c9df54b2be78d09de00aa7da0d694f (diff) |
* vm.c, vm_insnhelper.c: fix escape process with "braek" and "return"
syntax in "lambda". [ ruby-Bugs-19304 ], [ruby-core:17164] * KNOWNBUGS.rb, bootstraptest/test_proc.rb: add/move solved test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17390 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | KNOWNBUGS.rb | 21 | ||||
-rw-r--r-- | bootstraptest/test_proc.rb | 88 | ||||
-rw-r--r-- | vm.c | 4 | ||||
-rw-r--r-- | vm_insnhelper.c | 28 |
5 files changed, 125 insertions, 23 deletions
@@ -1,3 +1,10 @@ Wed Jun 18 01:51:10 2008 Hidetoshi NAGAI <[email protected]> * ext/tk/lib/multi-tk.rb: cannot access class variable from @@ -3,15 +3,18 @@ # So all tests will cause failure. # -assert_equal %q{[:bar, :foo]}, %q{ - def foo - klass = Class.new do - define_method(:bar) do - return :bar - end end - [klass.new.bar, :foo] end - foo -}, "[ ruby-Bugs-19304 ]" @@ -276,3 +276,91 @@ assert_equal 'ok', %q{ :ng }.call }, '[ruby-dev:34646]' @@ -525,9 +525,9 @@ vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc, VALUE self, if (state == TAG_RETURN && proc->is_lambda) { VALUE err = th->errinfo; VALUE *escape_dfp = GET_THROWOBJ_CATCH_POINT(err); - VALUE *cdfp = proc->block.dfp; - if (escape_dfp == cdfp) { state = 0; th->errinfo = Qnil; th->cfp = cfp; @@ -1044,7 +1044,8 @@ vm_get_cvar_base(NODE *cref) { VALUE klass; - while (cref && cref->nd_next && (NIL_P(cref->nd_clss) || FL_TEST(cref->nd_clss, FL_SINGLETON))) { cref = cref->nd_next; if (!cref->nd_next) { @@ -1221,7 +1222,7 @@ vm_throw(rb_thread_t *th, rb_control_frame_t *reg_cfp, if (cfp->dfp == dfp) { goto search_parent; } - cfp++; } rb_bug("VM (throw): can't find break base."); } @@ -1229,7 +1230,7 @@ vm_throw(rb_thread_t *th, rb_control_frame_t *reg_cfp, if (VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_LAMBDA) { /* lambda{... break ...} */ is_orphan = 0; - pt = GET_LFP(); state = TAG_RETURN; } else { @@ -1261,7 +1262,7 @@ vm_throw(rb_thread_t *th, rb_control_frame_t *reg_cfp, is_orphan = 0; break; } - cfp++; } } @@ -1284,26 +1285,29 @@ vm_throw(rb_thread_t *th, rb_control_frame_t *reg_cfp, * check orphan: */ while ((VALUE *) cfp < th->stack + th->stack_size) { - if (GET_DFP() == dfp) { if (VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_LAMBDA) { /* in lambda */ is_orphan = 0; break; } } - if (GET_LFP() == cfp->lfp && - cfp->iseq->type == ISEQ_TYPE_METHOD) { - is_orphan = 0; - break; - } - cfp++; } if (is_orphan) { vm_localjump_error("unexpected return", throwobj, TAG_RETURN); } - pt = GET_LFP(); } else { rb_bug("isns(throw): unsupport throw type"); |