From: Shugo Maeda Date: 2012-11-15T11:17:32+09:00 Subject: [ruby-dev:46516] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): 前田です。 2012年11月14日 17:28 Nobuyoshi Nakada : >> > のとき,たしか C のメソッドテーブルを null にしておいて云々,と聞いたと >> > 思うんですが,ここでもう,refinement check only なメソッドエントリを置く >> > ようにするとどうですかね. >> >> ああ、そこにメソッドエントリを置いていいなら、その方がいいかもしれないですね。 >> どうでしょうか? > なかださん > > 通常のメソッドテーブルとrefine用メソッドテーブルが一つのRClass中 > に同居するんですか? 複数usingしたときのsuperなどがうまくいくか疑 > 問なのですが。 refineされたクラスのメソッドテーブルに置くのはrefinementのチェックが必要という 印だけで、実際のメソッドはcrefから辿るので複数usingしても今と同じように探索できる と思っています。 > 私は、refined methodだけのiclassをprependする、という方略かと思っ > ていました。 それでもいいかもしれませんが、他のモジュールをprependした時に挿入位置を調整したり するのが面倒じゃないです? また、usingを使っていないコンテキストで呼ばれた時に、メソッド探索のコストが増えるように 思います。 prependよりrefinementを常に優先するなら、refineされたクラスのメソッドテーブルに 直接追加してしまってもいいように思います。 ただその場合、現状はprependされたクラスのメソッドテーブルが0になっているのを やめて、代りにフラグか何かでprependされたクラスかどうかを区別して必要な時に RCLASS_ORIGINを見るようにする必要がありますが。