トップ «前の日記(2006-06-29 (Thu)) 最新 次の日記(2006-07-03 (Mon))» 編集   RSS 1.0 FEED  

Journal InTime


2006-06-30 (Fri) [長年日記]

_ [Ruby] Binding.of_caller

Binding.of_callerを実装しようと思い立った。

SCOPEのflagsをprevにしてRBasicのflagsを使うようにしたところまでは よかった*1のだが、ruby_dyna_varsどう しようと思ってPUSH_FRAME時にFRAMEに突っ込んでしまったり、vis_mode とかもあるじゃん、とか思ったらもう面倒になって挫折。

とりあえず、パッチを放置しとこう。

binding_of_caller.diff

以下のコードくらいなら期待通り動く。

def Object.foo
  eval("p [self, x, y, z]", Binding.of_caller)
end
x = 1
1.times do
  y = 2
  1.times do
    z = 3
    Object.foo
  end
end

*1  本当は予期せぬ所でRBasicのflagsを書き換えてしまった せいでGCで落ちて大変だったんだけど。