monoruby:メソッドキャッシュの再利用
メソッドキャッシュとは、(メソッド名、レシーバのクラス、class_version)と(呼ばれる関数のID)の対応表。
インラインキャッシュはメソッド呼び出しのポイントごとに設置されているキャッシュで、メソッド名が固定となるため(レシーバのクラス、class_version、呼ばれる関数のID)の組が一つだけ記録される。
クラスやメソッドが定義される毎にclass_versionがインクリメントされ、全てのメソッドキャッシュが無効になる。
インラインキャッシュが無効になるため、JITコード全体の再コンパイルが必要となる。
ただ、実際にメソッドが無効になることはほとんどなく、無駄な再コンパイルが発生する。
そこで、
メソッドが定義され、class_versionカウンタがインクリメントされる
JITコード実行時にインラインキャッシュの cache miss が発生する
その時点でコード内部で利用している全てのインラインキャッシュを再計算
無効になったメソッドがあった場合のみ deoptimizeしてインタプリタへfall back & 後で再コンパイル