summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--eval.c6
-rw-r--r--test/ruby/test_settracefunc.rb5
-rw-r--r--version.h2
4 files changed, 16 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 6041012872..75fd658d92 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Dec 14 03:21:59 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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 <mame@tsg.ne.jp>
* hash.c (rb_hash): always return a fixnum value because a return
diff --git a/eval.c b/eval.c
index 2541e2e2e7..24267b033e 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 14d6679407..765600f34d 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
diff --git a/version.h b/version.h
index f968dfc1b7..23fbc0dd04 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