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

yarv-dev:36

From: (Yukihiro Matsumoto) <matz ruby-lang.org>
Date: Wed, 19 May 2004 11:59:25 +0900
Subject: [yarv-dev:36] Re: how to initialize ruby environment?



In message "[yarv-dev:35] how to initialize ruby environment?"
    on 04/05/18, SASADA Koichi <ko1 atdot.net> writes:
|
| ささだです。
|
| Kernel#load では、環境が一時リセットされた状態(という表現が
|正しいかはわかりませんが)でスクリプトをパースし、実行している
|ように思います。
|
| つまり、
|
|class C
|  def m
|    load 'hoge'
|  end
|end
|
|C.new.m
|
| すると、self = instanceof(C) の環境で実行されるわけではなく、
|バインディングがトップレベルで実行されます。ああ、釈迦に説法。
|
| で、YARVCore.load みたいなの(トップレベル環境でパースして、
|そいつを YARV で実行)を作りたいのですが、パース時の環境
|(ruby_frame みたいなの)をトップレベルに戻す方法がわかり
|ません。
|
| ruby.c とか eval.c とかその辺を見てみたんですが、状態用変数
|についていろんなことしてるようで、どれがどれだかさっぱりわかり
|ません。
|
| パーサをトップレベルの環境で走らせるために、どの辺のグローバ
|ル変数の退避が必要か、アドバイス頂けませんでしょうか。

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();

で復旧すればよいと思います。必要に応じてそういう関数を作って
もよいかもしれません。

| 関係ないんですけど、load(file, true) はファイルを渡しますが、
|これに文字列を渡して priv=true 環境で eavl するようなことはし
|ないのでしょうか。

とりあえず考えてませんでした。

  module.instance_eval{...}

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

                                まつもと ゆきひろ /:|)

--
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       ]