summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--KNOWNBUGS.rb2
-rw-r--r--test/ruby/test_settracefunc.rb14
-rw-r--r--vm_trace.c10
4 files changed, 22 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 4ab0191ce5..4e3cf85f2f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Dec 10 15:23:35 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_trace.c (rb_threadptr_exec_event_hooks): exceptions in event
+ hooks should not propagate outside.
+
Mon Dec 10 15:11:06 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* compile.c (iseq_compile_each): count flip-flop state in local iseq
diff --git a/KNOWNBUGS.rb b/KNOWNBUGS.rb
index 4a1ea23896..b97a08d928 100644
--- a/KNOWNBUGS.rb
+++ b/KNOWNBUGS.rb
@@ -3,5 +3,3 @@
# So all tests will cause failure.
#
-assert_equal('ok', "TracePoint.new(:line) {raise}.enable {\n 1\n}\n'ok'")
-assert_finish(3, 'def m; end; TracePoint.new(:return) {raise}.enable {m}')
diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb
index 6775b72b89..788253834e 100644
--- a/test/ruby/test_settracefunc.rb
+++ b/test/ruby/test_settracefunc.rb
@@ -798,4 +798,18 @@ class TestSetTraceFunc < Test::Unit::TestCase
end
}
end
+
+ def test_tracepoint_exception_at_line
+ assert_nothing_raised do
+ TracePoint.new(:line) {raise}.enable {
+ 1
+ }
+ end
+ end
+
+ def test_tracepoint_exception_at_return
+ assert_nothing_raised(Timeout::Error, 'infinite trace') do
+ assert_normal_exit('def m; end; TracePoint.new(:return) {raise}.enable {m}', '', timeout: 3)
+ end
+ end
end
diff --git a/vm_trace.c b/vm_trace.c
index 160005220f..161c5d1528 100644
--- a/vm_trace.c
+++ b/vm_trace.c
@@ -286,14 +286,14 @@ rb_threadptr_exec_event_hooks(rb_trace_arg_t *targ)
if (th->trace_running == 0 &&
targ->self != rb_mRubyVMFrozenCore /* skip special methods. TODO: remove it. */) {
const int vm_tracing = th->vm->trace_running;
+ const VALUE errinfo = th->errinfo;
+ const int outer_state = th->state;
int state = 0;
- int outer_state = th->state;
th->state = 0;
th->vm->trace_running = 1;
th->trace_running = 1;
{
- const VALUE errinfo = th->errinfo;
rb_hook_list_t *list;
/* thread local traces */
@@ -309,15 +309,11 @@ rb_threadptr_exec_event_hooks(rb_trace_arg_t *targ)
state = exec_hooks(th, list, targ, !vm_tracing);
if (state) goto terminate;
}
- th->errinfo = errinfo;
}
terminate:
+ th->errinfo = errinfo;
th->trace_running = 0;
th->vm->trace_running = vm_tracing;
-
- if (state) {
- TH_JUMP_TAG(th, state);
- }
th->state = outer_state;
}
}