[前][次][番号順一覧][スレッド一覧][生データ]

yarv-dev:38

From: SASADA Koichi <ko1 atdot.net>
Date: Wed, 19 May 2004 20:12:08 +0900
Subject: [yarv-dev:38] Re: how to initialize ruby environment?

 matz ruby-lang.org (Yukihiro Matsumoto)
 Wed, 19 May 2004 11:59:25 +0900 / [yarv-dev:36] Re: how to initialize ruby environment?
 への返信です。

 ささだです。
 ありがとうございます。

>eval.cの中なら
>
>    NODE *saved_cref = ruby_cref;
>
>    PUSH_VARS();
>    PUSH_CLASS(klass);
>    ruby_cref = top_cref;
>    PUSH_ITER(ITER_NOT);
>    PUSH_FRAME();
>    ruby_frame->last_func = 0;
>    ruby_frame->last_class = 0;
>    ruby_frame->self = self;
>    PUSH_SCOPE();
>    PUSH_TAG(PROT_NONE);
>
>で待避して
>
>    POP_TAG();
>    ruby_cref = saved_cref;
>    POP_SCOPE();
>    POP_FRAME();
>    POP_ITER();
>    POP_CLASS();
>    POP_VARS();
>
>で復旧すればよいと思います。必要に応じてそういう関数を作って
>もよいかもしれません。

 「eval.c の中なら」という部分を読み飛ばして撃沈しました。基本的に
ruby にパッチをあてなきゃいけないのはいやだなぁ(インストールコスト
が高くなる)と思っているので、出来れば避けたいところです。

 となると、無理なのですねぇ。


 で、ふと思いついたので、次のようにして単純に回避しようと思います。

def parse_in_toplevel prog
eval(<<__EOMP__, TOPLEVEL_BINDING)
YARVCore.parse(<<'__EOP__')
#{prog}
__EOP__
__EOMP__
end

def eval_in_toplevel prog
eval(<<__EOMP__, TOPLEVEL_BINDING)
YARVCore.eval(<<'__EOP__')
#{prog}
__EOP__
__EOMP__
end


 いやー、ruby 便利ですね。VM としてこれでいいのか非常に疑問ですが。


>と大差ないですから(正確には内部で定義されたクラスにwrapperが
>インクルードされる点が違う)。

 include されるんですか。
 そうか、だからトップレベルを汚さないんですね。


--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]

        35 2004-05-18 23:57 [ko1 atdot.net       ] how to initialize ruby environment?     
        36 2004-05-19 11:59 ┗[matz ruby-lang.org  ]                                       
        37 2004-05-19 12:14  ┣[shugo ruby-lang.org ]                                     
        39 2004-05-19 20:14  ┃┗[ko1 atdot.net       ]                                   
->      38 2004-05-19 20:12  ┗[ko1 atdot.net       ]