summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-08-28 01:20:32 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-08-28 01:20:32 +0000
commit868c98dccfb433772546e9abba935e0625ef310b (patch)
tree245208dfa8236d754fcc09c8d06ea68823dfda27 /test
parent0277e7e8f3c097661172029f47d0c2aadf019655 (diff)
* 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/trunk@51713 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 8308f31f55..ef5a0c0620 100644
--- a/test/ruby/test_settracefunc.rb
+++ b/test/ruby/test_settracefunc.rb
@@ -1211,6 +1211,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_in_out_err([], %q{\
TracePoint.new(:c_call){|tp|