ruby-changes:31158
From: ko1 <ko1@a...>
Date: Thu, 10 Oct 2013 17:31:55 +0900 (JST)
Subject: [ruby-changes:31158] ko1:r43237 (trunk): * vm.c (vm_exec): support :b_return event for "lambda{return}.call".
ko1 2013-10-10 17:31:48 +0900 (Thu, 10 Oct 2013) New Revision: 43237 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=43237 Log: * vm.c (vm_exec): support :b_return event for "lambda{return}.call". [Bug #8622] * test/ruby/test_settracefunc.rb: add a test. Modified files: trunk/ChangeLog trunk/test/ruby/test_settracefunc.rb trunk/vm.c Index: ChangeLog =================================================================== --- ChangeLog (revision 43236) +++ ChangeLog (revision 43237) @@ -1,3 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Thu Oct 10 17:25:28 2013 Koichi Sasada <ko1@a...> + + * vm.c (vm_exec): support :b_return event for "lambda{return}.call". + [Bug #8622] + + * test/ruby/test_settracefunc.rb: add a test. + Thu Oct 10 13:52:37 2013 Koichi Sasada <ko1@a...> * vm_trace.c (postponed_job): use preallocated buffer. Index: vm.c =================================================================== --- vm.c (revision 43236) +++ vm.c (revision 43237) @@ -1290,6 +1290,13 @@ vm_exec(rb_thread_t *th) https://github.com/ruby/ruby/blob/trunk/vm.c#L1290 if (!catch_iseqval) { result = GET_THROWOBJ_VAL(err); th->errinfo = Qnil; + + switch (VM_FRAME_TYPE(cfp)) { + case VM_FRAME_MAGIC_LAMBDA: + EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_B_RETURN, th->cfp->self, 0, 0, Qnil); + break; + } + vm_pop_frame(th); goto finish_vme; } @@ -1435,6 +1442,7 @@ vm_exec(rb_thread_t *th) https://github.com/ruby/ruby/blob/trunk/vm.c#L1442 EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_RETURN, th->cfp->self, 0, 0, Qnil); break; case VM_FRAME_MAGIC_BLOCK: + case VM_FRAME_MAGIC_LAMBDA: EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_B_RETURN, th->cfp->self, 0, 0, Qnil); break; case VM_FRAME_MAGIC_CLASS: Index: test/ruby/test_settracefunc.rb =================================================================== --- test/ruby/test_settracefunc.rb (revision 43236) +++ test/ruby/test_settracefunc.rb (revision 43237) @@ -966,4 +966,29 @@ class TestSetTraceFunc < Test::Unit::Tes https://github.com/ruby/ruby/blob/trunk/test/ruby/test_settracefunc.rb#L966 assert_equal 4, n end + + def test_tracepoint_b_return_with_lambda + n = 0 + TracePoint.new(:b_return){ + n+=1 + }.enable{ + lambda{ + return + }.call # n += 1 #=> 1 + 3.times{ + lambda{ + return # n += 3 #=> 4 + }.call + } # n += 3 #=> 7 + begin + lambda{ + raise + }.call # n += 1 #=> 8 + rescue + # ignore + end # n += 1 #=> 9 + } + + assert_equal 9, n + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/