Issue #10689 has been updated by Koichi Sasada.
ありがとうございます!
頂いたパッチを元に、cfp を使うように整理してみました。
http://www.atdot.net/sp/view/e5ivhn
- vm_throw() を簡素化
- マクロっぽい名前を関数っぽく
一応、test-all/test-rubyspec は通っていますが、良さそうでしたらコミットしてもらえないでしょうか。
Bug #10689: `unexpected break’ occurs when TracePoint#binding is called
- Author: Kazuki Tsujimoto
- Status: Open
- Priority: Normal
- Assignee:
- Category: core
- Target version:
- ruby -v: ruby 2.3.0dev (2015-01-02 trunk 49102) [x86_64-linux]
- Backport: 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED
以下のコードでunexpected breakになります。
class Bug
include Enumerable
def each
[0].each do
yield
end
end
end
TracePoint.trace(:c_return) do |tp|
tp.binding
end
Bug.new.all? { false }
all?中のrb_iter_breakによってth->errinfoがセットされた後に、
TracePoint#binding呼び出しによってcfpのepがヒープを指すようになってしまうのが原因です。
とりあえずTracePoint呼び出し後にth->errinfoのepを書き換えるようにしてみたパッチを添付します。
—Files--------------------------------
fix-unexpected-break.patch (3.32 KB)
save-target-cfp-in-errinfo.patch (6.26 KB)