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--;
if (state) {
-
if (pop_p) th->cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp);
-
if (pop_p) {
-
if (VM_FRAME_TYPE_FINISH_P(th->cfp)) {
-
th->tag = th->tag->prev;
-
}
-
th->cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp);
-
}} TH_JUMP_TAG(th, state);
th->state = outer_state;
Output:
#TracePoint:b_call@../trunk/test.rb:15
#TracePoint:b_return@../trunk/test.rb:15
:ok