From: Kazuki Tsujimoto Date: 2013-02-09T12:12:39+09:00 Subject: [ruby-dev:46960] Re: [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV 辻本です。 Subject: [ruby-dev:46921] Re: [ruby-dev:46908] [ruby-trunk - Bug#7774][Assigned] IFUNC上のbinding呼び出しでSEGV From: SASADA Koichi Date: Tue, 5 Feb 2013 15:15:30 +0900 >  ご報告,ありがとうございました.多分,治ったんじゃないかと思います. たびたびすみません。この修正ですが、下記の変更は意図されたものでしょうか。 * r39067より前では、+メソッド/injectメソッドで例外が起きた場合は両方ともメソッド起動時のコンテキスト(例ではmain)のbindingが返ってきていた。 * r39067以降は、injectメソッドで例外が起きた場合の動きが変更されレシーバのbindingが返ってくるようになった。(+メソッドは変更なし) 個人的にはこれまでの挙動のほうが便利でした。 def m1(arg) arg + nil rescue end def m2(arg) arg.inject(:+) rescue end # TracePoint tp = TracePoint.new(:raise) do |tp| $b = tp.binding end tp.enable do m1(0) p A: eval('self', $b) p B: eval('arg rescue nil', $b) m2([0, nil]) p C: eval('self', $b) p D: eval('arg rescue nil', $b) end # set_trace_func set_trace_func ->(event, file, line, id, binding, klass) do if event == 'raise' $b = binding end end m1(0) p E: eval('self', $b) p F: eval('arg rescue nil', $b) m2([0, nil]) p G: eval('self', $b) p H: eval('arg rescue nil', $b) # r39066 # {:A=>main} # {:B=>0} # {:C=>main} # {:D=>[0, nil]} # {:E=>main} # {:F=>0} # {:G=>main} # {:H=>[0, nil]} # r39067 # {:A=>main} # {:B=>0} # {:C=>[0, nil]} # {:D=>nil} # {:E=>main} # {:F=>0} # {:G=>[0, nil]} # {:H=>nil} -- Kazuki Tsujimoto