[#46902] [ruby-trunk - Feature #7767][Open] Tempfileで自動的にファイルを削除する — "kyanagi (Kouhei Yanagita)" <redmine@...>
8 messages
2013/02/01
[#46908] [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV — "ktsj (Kazuki Tsujimoto)" <kazuki@...>
16 messages
2013/02/03
[#46921] Re: [ruby-dev:46908] [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV
— SASADA Koichi <ko1@...>
2013/02/05
> Issue #7774 has been reported by ktsj (Kazuki Tsujimoto).
[#46960] Re: [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV
— Kazuki Tsujimoto <kazuki@...>
2013/02/09
辻本です。
[#46929] Re: [ruby-changes:27041] usa:r39093 (ruby_1_9_3): merge revision(s) 33210,33212: [Backport #5278] — Kouhei Sutou <kou@...>
須藤です。
4 messages
2013/02/06
[#46930] Re: [ruby-changes:27041] usa:r39093 (ruby_1_9_3): merge revision(s) 33210,33212: [Backport #5278]
— "U.Nakamura" <usa@...>
2013/02/06
こんにちは、なかむら(う)です。
[#46933] Re: [ruby-cvs:46289] zzak:r39120 (trunk): * doc/security.rb: Translate japanese kanji to english — "Martin J. Dürst" <duerst@...>
Hello Zachary,
3 messages
2013/02/07
[#46990] [ruby-trunk - Bug #7101] 拡張ライブラリの質問 — "mame (Yusuke Endoh)" <mame@...>
1 message
2013/02/15
[#47075] [ruby-trunk - Bug #7924][Open] r39232 以降 net/http で正しく reponse を取得出来ないケースがある — "hsbt (Hiroshi SHIBATA)" <shibata.hiroshi@...>
15 messages
2013/02/23
[#47088] Test on NetBSD/amd64 6.0_STABLE — Takahiro Kambe <taca@...>
こんにちは。
3 messages
2013/02/24
[ruby-dev:46961] Re: [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV
From:
SASADA Koichi <ko1@...>
Date:
2013-02-09 04:12:59 UTC
List:
ruby-dev #46961
(2013/02/09 12:12), Kazuki Tsujimoto wrote:
> たびたびすみません。この修正ですが、下記の変更は意図されたものでしょうか。
>
> * r39067より前では、+メソッド/injectメソッドで例外が起きた場合は両方ともメソッド起動時のコンテキスト(例ではmain)のbindingが返ってきていた。
> * r39067以降は、injectメソッドで例外が起きた場合の動きが変更されレシーバのbindingが返ってくるようになった。(+メソッドは変更なし)
>
> 個人的にはこれまでの挙動のほうが便利でした。
確かに.挙動は変わらないと思っていたんだけど,binding の位置はずれます
な.どうしたものですかねぇ.
正直,どの binding を返すか,ってきちんとしたコンセンサスが取れてない
と思うのですよ.たまたま,C で実装されたものだった場合には,その上のフ
レームの binding が帰ってきている感じです.
例えば,Ruby で + を実装した XYZZY というクラスが例外を吐く場合,やは
り呼び出し側のフレームではなく,XYZZY#+ のフレームの Binding オブジェク
トが返ります.
def m1(arg)
arg + nil
rescue
end
def m2(arg)
arg.inject(:+)
rescue
end
class XYZZY
def +(o)
raise
end
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)
m1(XYZZY.new)
p X: eval('self', $b)
p Y: 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)
m1(XYZZY.new)
p XX: eval('self', $b)
p YY: eval('arg rescue nil', $b)
#=>
ruby 2.0.0dev (2012-12-21 trunk 38515) [i386-mswin32_100]
t.rb:19: warning: shadowing outer local variable - tp
{:A=>main}
{:B=>0}
{:C=>main}
{:D=>[0, nil]}
{:X=>#<XYZZY:0xb2a0d4>}
{:Y=>nil}
{:E=>main}
{:F=>0}
{:G=>main}
{:H=>[0, nil]}
{:XX=>#<XYZZY:0xb12a60>}
{:YY=>nil}
とまぁ,こんな感じで,「呼び出し側のフレームを返す」という仕様ではな
かったわけです.
もし,以前の挙動に戻すなら,ifuc の binding を作りつつ,ruby-level フ
レームまで遡って,その ruby-level フレームの binding を返す,というのが
思いつきました.これで解決しそうではあります.
どうしたもんでしょうか?
--
// SASADA Koichi at atdot dot net