msumimz's diary

RubyにJITコンパイラを実装する個人プロジェクトの情報発信ブログです。

メソッドの再定義に対応しました

メソッドが再定義された場合に、JITコンパイルされたメソッドが正しく動作するための仕組みを導入しました。

この仕組みはさまざまな実装方針が考えられ、実行速度・メモリ使用量・コンパイル速度・実装の容易さの間でトレードオフがあります。

とはいえ、実装の良し悪しはベンチマークをとって判断するべきであり、まともなベンチマークが動かない状態で悩んでもしかたありません。そこで、今回は比較的実装が容易な方法にしています。

こんなコードや、

def inlined
  3
end

def m
  inlined
end

precompile Object, :m  # 型解析され、inlinedがインライン化される

puts m   # => 3

def inlined  # inlinedを再定義する
  5
end

puts m   # => 5

こんなコードが正しく動くようになります。

def m(a, s)
  a += 1
  eval s  # 任意のコードが実行される
  a += 2
end

具体的な実装についてはいつか記事にするかもしれません。