mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* compile.c (rb_iseq_compile_node): put start label of block after
trace (b_call). [Bug #9964] * test/ruby/test_settracefunc.rb: add a test. added assert_consistent_call_return() method check call/return consistency. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46471 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
500f9777c9
commit
13f0b628d7
3 changed files with 60 additions and 1 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
Fri Jun 20 07:07:28 2014 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* compile.c (rb_iseq_compile_node): put start label of block after
|
||||||
|
trace (b_call).
|
||||||
|
[Bug #9964]
|
||||||
|
|
||||||
|
* test/ruby/test_settracefunc.rb: add a test.
|
||||||
|
|
||||||
|
added assert_consistent_call_return() method check call/return
|
||||||
|
consistency.
|
||||||
|
|
||||||
Fri Jun 20 05:26:27 2014 Koichi Sasada <ko1@atdot.net>
|
Fri Jun 20 05:26:27 2014 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* vm_eval.c (rb_catch_protect): fix same problem of [Bug #9961].
|
* vm_eval.c (rb_catch_protect): fix same problem of [Bug #9961].
|
||||||
|
|
|
@ -483,8 +483,8 @@ rb_iseq_compile_node(VALUE self, NODE *node)
|
||||||
LABEL *start = iseq->compile_data->start_label = NEW_LABEL(0);
|
LABEL *start = iseq->compile_data->start_label = NEW_LABEL(0);
|
||||||
LABEL *end = iseq->compile_data->end_label = NEW_LABEL(0);
|
LABEL *end = iseq->compile_data->end_label = NEW_LABEL(0);
|
||||||
|
|
||||||
ADD_LABEL(ret, start);
|
|
||||||
ADD_TRACE(ret, FIX2INT(iseq->location.first_lineno), RUBY_EVENT_B_CALL);
|
ADD_TRACE(ret, FIX2INT(iseq->location.first_lineno), RUBY_EVENT_B_CALL);
|
||||||
|
ADD_LABEL(ret, start);
|
||||||
COMPILE(ret, "block body", node->nd_body);
|
COMPILE(ret, "block body", node->nd_body);
|
||||||
ADD_LABEL(ret, end);
|
ADD_LABEL(ret, end);
|
||||||
ADD_TRACE(ret, nd_line(node), RUBY_EVENT_B_RETURN);
|
ADD_TRACE(ret, nd_line(node), RUBY_EVENT_B_RETURN);
|
||||||
|
|
|
@ -1308,4 +1308,52 @@ class TestSetTraceFunc < Test::Unit::TestCase
|
||||||
[:c_return, :===],
|
[:c_return, :===],
|
||||||
[:b_return, :test_rb_rescue]], events
|
[:b_return, :test_rb_rescue]], events
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def method_prefix event
|
||||||
|
case event
|
||||||
|
when :call, :return
|
||||||
|
:n
|
||||||
|
when :c_call, :c_return
|
||||||
|
:c
|
||||||
|
when :b_call, :b_return
|
||||||
|
:b
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def method_label tp
|
||||||
|
"#{method_prefix(tp.event)}##{tp.method_id}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def assert_consistent_call_return message='', check_events: nil
|
||||||
|
check_events ||= %i(a_call a_return)
|
||||||
|
call_events = []
|
||||||
|
return_events = []
|
||||||
|
|
||||||
|
TracePoint.new(*check_events){|tp|
|
||||||
|
next unless target_thread?
|
||||||
|
|
||||||
|
case tp.event.to_s
|
||||||
|
when /call/
|
||||||
|
call_events << method_label(tp)
|
||||||
|
when /return/
|
||||||
|
return_events << method_label(tp)
|
||||||
|
end
|
||||||
|
}.enable do
|
||||||
|
yield
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_equal false, call_events.empty?
|
||||||
|
assert_equal false, return_events.empty?
|
||||||
|
assert_equal call_events, return_events.reverse, message
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_b_call_with_redo
|
||||||
|
assert_consistent_call_return do
|
||||||
|
i = 0
|
||||||
|
1.times{
|
||||||
|
break if (i+=1) > 10
|
||||||
|
redo
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue