前田です。

2012/11/11 SASADA Koichi <ko1 / atdot.net>:
> refinement を導入するときの性能に対する excuse が「method cache に殆どあ
> たるから,(refinement に関係無い部分の)性能低下はない」という話だった
> と思うのですが,今回のコードを見ると,それなりにメソッド探索コストが増え
> そうな気がするんですが,いかがでしょうか.
>
> 昨日相談させて頂いたとおり,実装としては refinement は
>  - メソッド探索から refinement 関係の処理を削除
>  - 探索したメソッドが refine されたメソッドだったら,
>    その時点で適切なメソッドを呼び出す
> のが良いと思います.

上記の変更の前に、とりあえずテストの追加と、それが通るような修正をしています。
ただ、上記の変更って私が実装するという話なんでしたっけ?

だとすると、もうちょっと細かいところを確認したいです。

基本的なアイデアは、refine対象のクラス(refineの引数)のメソッドにrefineされたこと
を表す印を付けておいて、通常のメソッド探索でそのメソッドが見つかった時にはじめて
refinements専用のパスで探索するということですよね。

以下のような疑問があります。

* refineされたことを表すmethod entryの構造をどうするか
  rb_method_type_tにVM_METHOD_TYPE_REFINEDみたいなのを追加するんでしたっけ。
  もとのmethod entryはrb_method_entry_t::def->bodyとかから参照するんですかね。
* refineした時にrefine対象クラスにメソッドがない時はどうするか
  メソッドがない時も常にrefineされたことを示すmethod entryを追加する?
* refineされたメソッドの呼出時にrb_call_info_tにどういう情報を格納するか
  Twitterでは、refineされたことを示すmethod entryを入れておくということでしたが、
  今のvm_call_methodの構造だとrb_call_info_tの中身を書き換えてgotoするような
  形になっているので、どういう変更を意図されているのかよくわかりませんでした。

-- 
Shugo Maeda