diff --git a/ChangeLog b/ChangeLog index 604101287..75fd658d9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Dec 14 03:21:59 2009 Nobuyoshi Nakada + + * eval.c (call_trace_func): remove the trace hook if any exception + raised. [ruby-list:46515] + Mon Dec 14 02:27:32 2009 Yusuke Endoh * hash.c (rb_hash): always return a fixnum value because a return diff --git a/eval.c b/eval.c index 2541e2e2e..24267b033 100644 --- a/eval.c +++ b/eval.c @@ -2772,7 +2772,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 14d667940..765600f34 100644 --- a/test/ruby/test_settracefunc.rb +++ b/test/ruby/test_settracefunc.rb @@ -135,4 +135,9 @@ def test_event 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 diff --git a/version.h b/version.h index f968dfc1b..23fbc0dd0 100644 --- a/version.h +++ b/version.h @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2009-12-14" #define RUBY_VERSION_CODE 187 #define RUBY_RELEASE_CODE 20091214 -#define RUBY_PATCHLEVEL 228 +#define RUBY_PATCHLEVEL 229 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8