[ruby-dev:48306] [ruby-trunk - Bug #9964] [Closed] TracePoint invoke unexpected b_call events with redo
From:
ko1@...
Date:
2014-06-19 22:09:32 UTC
List:
ruby-dev #48306
Issue #9964 has been updated by Koichi Sasada.
Status changed from Open to Closed
% Done changed from 0 to 100
Applied in changeset r46471.
----------
* compile.c (rb_iseq_compile_node): put start label of block after
trace (b_call).
[Bug #9964]
* test/ruby/test_settracefunc.rb: add a test.
added assert_consistent_call_return() method check call/return
consistency.
----------------------------------------
Bug #9964: TracePoint invoke unexpected b_call events with redo
https://bugs.ruby-lang.org/issues/9964#change-47306
* 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: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
次のようなプログラムで、無限に b_call が発生し、対応する b_return が発生しません。
```ruby
1.times{
redo
}
```
これは、redo で b_call イベントを発生するところまで戻ってしまうためです。
redo した時、b_call イベントを発生する trace の *後* へ戻るように変更することで解決できます。
```diff
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 まで同じような問題があります。
--
https://bugs.ruby-lang.org/