[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 メーリングリストの案内