diff --git a/ChangeLog b/ChangeLog index 807ba7fc61..53a3ee8d87 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Nov 6 11:01:34 2009 Nobuyoshi Nakada + + * eval.c (call_trace_func): remove the trace hook if any exception + raised. [ruby-list:46515] + Fri Nov 6 10:56:21 2009 Nobuyoshi Nakada * eval.c (get_event_name): added thread events. diff --git a/eval.c b/eval.c index a0141aa612..d96f7e1290 100644 --- a/eval.c +++ b/eval.c @@ -2828,7 +2828,11 @@ call_trace_func(event, node, self, id, klass) tracing = 0; ruby_current_node = node_save; SET_CURRENT_SOURCE(); - if (state) JUMP_TAG(state); + if (state) { + trace_func = 0; + rb_remove_event_hook(call_trace_func); + JUMP_TAG(state); + } } static VALUE diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb index 756a0acf3d..b0db91136f 100644 --- a/test/ruby/test_settracefunc.rb +++ b/test/ruby/test_settracefunc.rb @@ -135,4 +135,9 @@ class TestSetTraceFunc < Test::Unit::TestCase assert_equal(["c-call", 131, :set_trace_func, Kernel], events.shift) assert_equal([], events) end + + def test_bad_trace + e = Class.new(RuntimeError) + assert_raise(e) {set_trace_func proc{raise e}} + end end