Forum: Ruby-dev TracePoint invoke unexpected b_call events with redo

5cf8f058a4c094bb708174fb43e7a387?d=identicon&s=25 unknown (Guest)
on 2014-06-20 14:28
(Received via mailing list)
Issue #9964 has been updated by Tomoyuki Chikanaga.

Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN to 2.0.0: REQUIRED,
2.1: REQUIRED

----------------------------------------
Bug #9964: TracePoint invoke unexpected b_call events with redo
https://bugs.ruby-lang.org/issues/9964#change-47308

* 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: REQUIRED, 2.1: REQUIRED
----------------------------------------

次のようなプログラムで、無限に 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 まで同じような問題があります。
This topic is locked and can not be replied to.