メソッドの再定義に対応しました
メソッドが再定義された場合に、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
具体的な実装についてはいつか記事にするかもしれません。