summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-11-18 11:17:54 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-11-18 11:17:54 +0000
commitbc090868b8e480ac4d179bc6b7d2ba65d4f82aef (patch)
treeb1b18236a6438dadae5681413b8dddef419da13f /test
parent69e671aa966f7d9ef67513141f593e61be58e2d3 (diff)
merge revision(s) 51713: [Backport #11492] [Backport #11646]
* vm.c (hook_before_rewind): prevent kicking :return event while finishing vm_exec func because invoke_block_from_c() kick a :return event for bmethods. [Bug #11492] * test/ruby/test_settracefunc.rb: add a test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@52639 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r--test/ruby/test_settracefunc.rb68
1 files changed, 68 insertions, 0 deletions
diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb
index 722228d0a1..ba9e618ea9 100644
--- a/test/ruby/test_settracefunc.rb
+++ b/test/ruby/test_settracefunc.rb
@@ -1184,6 +1184,74 @@ class TestSetTraceFunc < Test::Unit::TestCase
end
end
+ class C11492
+ define_method(:foo_return){
+ return true
+ }
+ define_method(:foo_break){
+ break true
+ }
+ end
+
+ def test_define_method_on_return
+ # return
+ events = []
+ obj = C11492.new
+ TracePoint.new(:call, :return){|tp|
+ next unless target_thread?
+ events << [tp.event, tp.method_id]
+ }.enable{
+ obj.foo_return
+ }
+ assert_equal([[:call, :foo_return], [:return, :foo_return]], events, 'Bug #11492')
+
+ # break
+ events = []
+ obj = C11492.new
+ TracePoint.new(:call, :return){|tp|
+ next unless target_thread?
+ events << [tp.event, tp.method_id]
+ }.enable{
+ obj.foo_break
+ }
+ assert_equal([[:call, :foo_break], [:return, :foo_break]], events, 'Bug #11492')
+
+ # set_trace_func
+ # return
+ events = []
+ begin
+ set_trace_func(lambda{|event, file, lineno, mid, binding, klass|
+ next unless target_thread?
+ case event
+ when 'call', 'return'
+ events << [event, mid]
+ end
+ })
+ obj.foo_return
+ set_trace_func(nil)
+
+ assert_equal([['call', :foo_return], ['return', :foo_return]], events, 'Bug #11492')
+ ensure
+ end
+
+ # break
+ events = []
+ begin
+ set_trace_func(lambda{|event, file, lineno, mid, binding, klass|
+ next unless target_thread?
+ case event
+ when 'call', 'return'
+ events << [event, mid]
+ end
+ })
+ obj.foo_break
+ set_trace_func(nil)
+
+ assert_equal([['call', :foo_break], ['return', :foo_break]], events, 'Bug #11492')
+ ensure
+ end
+ end
+
def test_recursive
assert_ruby_status [], %q{
stack = []