ささだです.

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