[Yarv-devel] GC Tech. on Script Lang.
K.Sasada
ko1 @ namikilab.tuat.ac.jp
2004年 2月 9日 (月) 21:37:53 EST
nobu.nakada at nifty.ne.jp wrote :
[ Re: [Yarv-devel] GC Tech. on Script Lang. ]
at Mon, 09 Feb 2004 21:15:56 +0900
ささだです。
> 標準ライブラリでも書き換えるものはあります。mathn.rbとか。
はい。でも、メソッド呼ぶ回数よりは少ないと思います。トップ
レベルで require しておけば、トップの命令列しか書き換えないで
すむし("問題" になりますが)。
> そういう用途には、どっちかというとRegexpのoオプションを汎化させ
> たものを…とか。
すみません、寡聞にして知らないんですが、ポインタなど教えて
いただけませんか。
>> 問題:畳み込んだ命令列実行中、String#+ などを再定義されたとき、処理が復
>> 帰できますか?(命令位置の補正ができますか?)
>
> 「処理が復帰」というのがよく分かりませんが、すでにdispatchされ
> たメソッドはそのまま継続するんじゃないでしょうか。全然違うこと
> をいってるかも知れませんが。
私が意図していたことはこういうことです。
def m
p 10+10
Fixnum.module_eval{
def +(obj)
self*obj
end
}
p 10+10
end
m
## pseudo assembler(optimized) L1
0: put 20
2: send :p, 1
... !!
X: put 20
Y: send :p, 1
!! を実行すると、L1 は最適化前に戻る
## ## pseudo assembler L1'
0: put 10
2: put 10
4: send :+,1
... !!
X': put 10 # offset が X から X' に変わった
Y': put 10
Z : send :+, 1
たとえば、module_eval からの返り番地は X として積んであっ
たのですが、これを X' と変更しなければならないと思うのですが
(でないと、結果が意図したものにならない)、これを実現できる
かなぁ、とかです。
今は module_eval の返り値だけ気にしてますけど、全ての命令列
に効いてきますから、スタック全部、別スレッドのまで含めて検査が
要りそうです。
ああ、やっぱりダメポ。
戻るとき全部にチェック(変更されているかどうか)入れるのも
馬鹿っぽいしなぁ。
--
// SASADA Koichi @ namikilab.tuat.ac.jp
//
Yarv-devel メーリングリストの案内