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
Updated by ko1 (Koichi Sasada) almost 12 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r38721.
Koichi, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- vm_trace.c (rb_threadptr_exec_event_hooks_orig): pop tag before
JUMP_TAG() if frame is `finish' frame.
Without this patch, there is an inconsistency between control
frame stack and tags stack.
[Bug #7668] - test/ruby/test_settracefunc.rb: add a test for above.