From: nagachika00@... Date: 2014-07-30T17:06:29+00:00 Subject: [ruby-dev:48456] [ruby-trunk - Bug #9964] TracePoint invoke unexpected b_call events with redo Issue #9964 has been updated by Tomoyuki Chikanaga. Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED to 2.0.0: REQUIRED, 2.1: DONE Backported into `ruby_2_1` branch at r47014. ---------------------------------------- Bug #9964: TracePoint invoke unexpected b_call events with redo https://bugs.ruby-lang.org/issues/9964#change-48140 * 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: DONE ---------------------------------------- 次のようなプログラムで、無限に 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/