From: Yoshinori Sano Date: 2007-02-06T01:20:49+09:00 Subject: [ruby-dev:30268] Re: 質問: 関数風メソッド呼び出しのYARV命令列について さの よしのりです 丁寧なご返答ありがとうございます。 > > そう考えると、関数風メソッドの呼び出し時に、まずputnilする > > 意味があまり無いように思うのですが、何か設計上の意図が > > あるのでしょうか? > >  あります.具体的には method_missing 対策です.また,スタックレイアウト > が異なると嫌なことがあるかもしれないので,それを避けるためでもあります. 了解しました。 でも、それがなぜmethod_missing 対策になるのか、まだ理解できません。。。 もう少し頑張ってコードリーディングします! 07/02/04 に SASADA Koichi さんは書きました: >  ささだです. > > Yoshinori Sano wrote: > > puts("hello")のような関数風メソッド(NODE_FCALL)呼び出しの > > YARV命令列は、YARV Maniacsの説明によると、まずputselfから > > 始まるはずなのですが、現状のtrunk(r11608)ではputnilになっています。 > > > > これは、問題無いのでしょうか? > >  最近変えました.send(:foo)としたとき,私は self.foo() と同じ意味だと思 > うのですが,そうではない,ということで対処した結果がこれです.1.9 では, > これは foo() と同じ意味なんだそうで,それに対応するため,send() での判断 > 時,nilが詰まれていたら関数風メソッド呼び出し foo(),そうでなければ > recv.foo() を呼ぶ,ということになります. > > > > insns.defで定義されているsend命令を見ると、関数風メソッドの > > 呼び出しでは、recv = GET_SELF();でselfを取得しています。 > > ここでGET_SELF()しているために、putselfではなくputnil > > でも、現状で問題無く動作しているのでしょうか? > >  そうです. > > > > そう考えると、関数風メソッドの呼び出し時に、まずputnilする > > 意味があまり無いように思うのですが、何か設計上の意図が > > あるのでしょうか? > >  あります.具体的には method_missing 対策です.また,スタックレイアウト > が異なると嫌なことがあるかもしれないので,それを避けるためでもあります. > > -- > // SASADA Koichi at atdot dot net > > > -- Yoshinori Sano