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 ]