[#30408] Ruby 1.8.6 preview2 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.6 preview2 をリリースしました。

20 messages 2007/02/24
[#30414] fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Hidetoshi NAGAI <nagai@...> 2007/02/25

永井@知能.九工大です.

[#30418] Re: fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Nobuyoshi Nakada <nobu@...> 2007/02/25

なかだです。

[ruby-dev:30241] 質問: 関数風メソッド呼び出しのYARV命令列について

From: "Yoshinori Sano" <yoshinori.sano@...>
Date: 2007-02-01 17:47:50 UTC
List: ruby-dev #30241
さの よしのり です

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: <ISeq:<main>@test.rb>========================================
local scope table (size: 1, argc: 0)

0000 putnil                                                           (   1)
0001 putstring        "hello, world"
0003 send             :puts, 1, nil, 8, <ic>
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 <[email protected]>

In This Thread

Prev Next