From: Makoto Kuwata Date: 2010-10-10T01:25:09+09:00 Subject: [ruby-dev:42354] Re: [Ruby 1.9-Feature#3917][Open] [proposal] called_from() which is much faster than caller() 桑田です。日本語が文字化けしてたようで申し訳ないです。 2010/10/8 SASADA Koichi : >  ささだです。 > > 基本的に賛成なんですが、alternative なアイデアということで。 > > > (1) caller の拡張案 > > (a) 配列の要素数を指定するオプショナル引数を加える > > caller(n, m) => n 個上の caller から、m 個だけ情報を取り出す > caller(0, 1) => ['...'] > caller(0, 2) => ['...', '...'] > もとのproposalにもcallerの拡張案を載せていますが、 それと同じという解釈でいいでしょうか。 私としてはcallerの拡張でも結構です。 > *一個しかほしくない時に、1要素の配列になってしまうのが嬉しくない。 確か似そうですが、さほど困るほどでもないと思います。'.first' を付けるだけだし。 もともと、caller()やcalled_from()は主にライブラリ作成者が使うことが多く、 ライブラリ使用者であるユーザがcaller()を直接使う頻度は少ないので、 多少使いにくくてもいいかなと思います。 それより戻り値に一貫性があることや、妙なルールが導入されないことの ほうが重要だと思いました。 > *1 を指定したら配列じゃ無くす、というのは、きっと良くないんだろうな。 そうですね、戻り値に一貫性がなくなるのはあまりよくないと思います。 > (b) 配列の要素をFrameInfo オブジェクトとかいうものをでっちあげる > > caller => [frameinfo1, frameinfo2, ...] > > FrameInfo#type # iseq->type 相当(でいいのか?) > FrameInfo#name # iseq->name 相当、メソッド名とか > FrameInfo#line_no # これまでと同じ行番号 > FrameInfo#filename # これまでと同じファイル名 > > FrameInfo#to_str を定義することで、文字列を期待していた今までのコード > もそのまま動く(ほんとかな?)。 > > iseq を持たせるような実装になるのかしらん。 > > FrameInfo#binding とかやると、caller_binding みたいな話になるんだけ > ど、これはやらない。 > > *CallerEntry とかの名前のほうがいいのかしらん。 > > > (2) called_from の返値を FrameInfo みたいなのにする > > FrameInfo の定義は上記の通り。 > これについては私のほうでは善し悪しが判断できないので、開発陣の判断にお任せします。 > > 以上です。 > > > vm_backtrace_each の順番は変えちゃうかも。でも、今 iseq 周りの実装をそ > う取っ替えしているので、この変更はもうちょっと待ってほしいかも。 > 了解です。 -- makoto kuwata