メモ
息抜きに ruby をいじった感じ
rb_clear_cache_by_class
が rb_clear_cache
と変わらない挙動ですべてのメソッドキャッシュ(というかキャッシュ全般)をクリアしてるのが extend や unextend を遅くする原因なので、これを解決しないといけないんだけど、とりあえず書いてみたパッチだと定数とかのインラインキャッシュ周りで破滅してる。
かといって安易に全体の VM STATE とインラインキャッシュ用の VM STATE などを分離すると多分キャッシュの消し漏れとかが出てくるし、うまくいかない気がする。
今回のコケたテストの場合だと variables.c の 2238 〜 2253 行で rb_clear_cache_by_class
を使うのをやめて rb_clear_cache
を使うようにすればうまくいきそう。これは定数の visibility を変更する部分だけど、ここを本当に rb_clear_cache_by_class
でなくしていいのかというのは一応疑問が残る。