Issue #9964 has been updated by Usaku NAKAMURA.
Backport changed from 2.0.0: REQUIRED, 2.1: DONE to 2.0.0: DONE, 2.1:
DONE
backported into ruby_2_0_0
at r47340.
(note that ruby 2.0.0 doesn’t have a_call/a_return events.)
Bug #9964: TracePoint invoke unexpected b_call events with redo
- Author: Koichi Sasada
- Status: Closed
- Priority: Normal
- Assignee: Koichi Sasada
- Category: core
- Target version: current: 2.2.0
- ruby -v: ruby 2.2
- Backport: 2.0.0: DONE, 2.1: DONE
次のようなプログラムで、無限に b_call が発生し、対応する b_return が発生しません。
1.times{
redo
}
これは、redo で b_call イベントを発生するところまで戻ってしまうためです。
redo した時、b_call イベントを発生する trace の 後 へ戻るように変更することで解決できます。
Index: compile.c
===================================================================
--- compile.c (revision 46468)
+++ compile.c (working copy)
@@ -483,8 +483,8 @@
LABEL *start = iseq->compile_data->start_label = NEW_LABEL(0);
LABEL *end = iseq->compile_data->end_label = NEW_LABEL(0);
+ ADD_TRACE(ret, FIX2INT(iseq->location.first_lineno),
RUBY_EVENT_B_CALL);
ADD_LABEL(ret, start);
- ADD_TRACE(ret, FIX2INT(iseq->location.first_lineno),
RUBY_EVENT_B_CALL);
COMPILE(ret, "block body", node->nd_body);
ADD_LABEL(ret, end);
ADD_TRACE(ret, nd_line(node), RUBY_EVENT_B_RETURN);
例によって 2.0 まで同じような問題があります。