From: Yoshinori Sano Date: 2007-02-02T02:47:50+09:00 Subject: [ruby-dev:30241] 質問: 関数風メソッド呼び出しのYARV命令列について さの よしのり です puts("hello")のような関数風メソッド(NODE_FCALL)呼び出しの YARV命令列は、YARV Maniacsの説明によると、まずputselfから 始まるはずなのですが、現状のtrunk(r11608)ではputnilになっています。 これは、問題無いのでしょうか? http://jp.rubyist.net/magazine/?0009-YarvManiacs % cat test.rb puts "hello, world" % ./ruby tool/parse.rb test.rb # ---------------------------------------------------------------------- # target program: # ---------------------------------------------------------------------- puts "hello, world" # ---------------------------------------------------------------------- # disasm result: # ---------------------------------------------------------------------- == disasm: @test.rb>======================================== local scope table (size: 1, argc: 0) 0000 putnil ( 1) 0001 putstring "hello, world" 0003 send :puts, 1, nil, 8, 0009 leave # ---------------------------------------------------------------------- insns.defで定義されているsend命令を見ると、関数風メソッドの 呼び出しでは、recv = GET_SELF();でselfを取得しています。 ここでGET_SELF()しているために、putselfではなくputnil でも、現状で問題無く動作しているのでしょうか? そう考えると、関数風メソッドの呼び出し時に、まずputnilする 意味があまり無いように思うのですが、何か設計上の意図が あるのでしょうか? よろしくお願いいたします。 % vim insns.def [...] DEFINE_INSN send (ID op_id, num_t op_argc, ISEQ blockiseq, num_t op_flag, IC ic) (...) (VALUE val) // inc += - (op_argc + ((op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? 1 : 0)); { NODE *mn; VALUE recv; VALUE klass; yarv_block_t *blockptr = 0; num_t num = op_argc; num_t flag = op_flag; ID id = op_id; macro_eval_setup_send_arguments(num, blockptr, flag, blockiseq); if (flag & VM_CALL_FCALL_BIT) { /* method(...) */ recv = GET_SELF(); } [...] -- Yoshinori Sano