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 ]