diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | KNOWNBUGS.rb | 2 | ||||
-rw-r--r-- | test/ruby/test_settracefunc.rb | 14 | ||||
-rw-r--r-- | vm_trace.c | 10 |
4 files changed, 22 insertions, 9 deletions
@@ -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; } } |