Bug #7668
closedset_trace_func and TracePoint don't handle exception in finish frame
Description
The following code should trap exception correctly (should output ":ok"):
def m
a = 1
b = 2
c = 3
raise
end
trace = TracePoint.new{|tp|
p tp
raise # if tp.event == :c_return # if tp.event == :b_return
}
begin
trace.enable{
m
}
rescue => e
p :ok
end
¶
But it outputs same event hook infinite:
#TracePoint:b_call@/home/ko1/src/ruby/trunk/test.rb:15
#TracePoint:b_return@/home/ko1/src/ruby/trunk/test.rb:15
#<TracePoint:c_return enable'@/home/ko1/src/ruby/trunk/test.rb:15> #<TracePoint:c_return enable'@/home/ko1/src/ruby/trunk/test.rb:15>
#<TracePoint:c_return `enable'@/home/ko1/src/ruby/trunk/test.rb:15>
...
It is a bug.
This patch solve this issue:
Index: vm_trace.c¶
--- vm_trace.c (revision 38718)
+++ vm_trace.c (working copy)
@@ -316,7 +316,12 @@ rb_threadptr_exec_event_hooks_orig(rb_tr
th->vm->trace_running--;
-
}
th->state = outer_state;
Output:
#TracePoint:b_call@../trunk/test.rb:15
#TracePoint:b_return@../trunk/test.rb:15
:ok