[#46908] [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV — "ktsj (Kazuki Tsujimoto)" <kazuki@...>

16 messages 2013/02/03

[#47075] [ruby-trunk - Bug #7924][Open] r39232 以降 net/http で正しく reponse を取得出来ないケースがある — "hsbt (Hiroshi SHIBATA)" <shibata.hiroshi@...>

15 messages 2013/02/23

[ruby-dev:46960] Re: [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV

From: Kazuki Tsujimoto <kazuki@...>
Date: 2013-02-09 03:12:39 UTC
List: ruby-dev #46960
辻本です。

Subject: [ruby-dev:46921] Re: [ruby-dev:46908] [ruby-trunk - Bug#7774][Assigned] IFUNC上のbinding呼び出しでSEGV
From: SASADA Koichi <ko1@atdot.net>
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


In This Thread