mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* vm.c (vm_exec): support :b_return event for "lambda{return}.call".
[Bug #8622] * test/ruby/test_settracefunc.rb: add a test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43237 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d63f9e933c
commit
4599d3efd7
3 changed files with 40 additions and 0 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
Thu Oct 10 17:25:28 2013 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* 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@atdot.net>
|
Thu Oct 10 13:52:37 2013 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* vm_trace.c (postponed_job): use preallocated buffer.
|
* vm_trace.c (postponed_job): use preallocated buffer.
|
||||||
|
|
|
@ -966,4 +966,29 @@ class TestSetTraceFunc < Test::Unit::TestCase
|
||||||
|
|
||||||
assert_equal 4, n
|
assert_equal 4, n
|
||||||
end
|
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
|
end
|
||||||
|
|
8
vm.c
8
vm.c
|
@ -1290,6 +1290,13 @@ vm_exec(rb_thread_t *th)
|
||||||
if (!catch_iseqval) {
|
if (!catch_iseqval) {
|
||||||
result = GET_THROWOBJ_VAL(err);
|
result = GET_THROWOBJ_VAL(err);
|
||||||
th->errinfo = Qnil;
|
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);
|
vm_pop_frame(th);
|
||||||
goto finish_vme;
|
goto finish_vme;
|
||||||
}
|
}
|
||||||
|
@ -1435,6 +1442,7 @@ vm_exec(rb_thread_t *th)
|
||||||
EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_RETURN, th->cfp->self, 0, 0, Qnil);
|
EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_RETURN, th->cfp->self, 0, 0, Qnil);
|
||||||
break;
|
break;
|
||||||
case VM_FRAME_MAGIC_BLOCK:
|
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);
|
EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_B_RETURN, th->cfp->self, 0, 0, Qnil);
|
||||||
break;
|
break;
|
||||||
case VM_FRAME_MAGIC_CLASS:
|
case VM_FRAME_MAGIC_CLASS:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue