前田です。

2012年11月16日 18:07 Shugo Maeda <shugo / ruby-lang.org>:
>>> どちらかというと、rb_method_definition_t::bodyに元のメソッドエントリを保存する方法だと
>>> メモリ管理の面で面倒(メソッドエントリはメモリ管理が特殊なので)な気がしてきたので、
>>> そういう意味でprependベースの方がすっきりするかもしれないですね。
>>
>>  えーと,特殊かなぁ.たんに,refine type な definition が消えたときに,
>> 一緒に original_definition を消せばいいだけのような.
>
> rb_method_entry_tじゃなくてrb_method_definition_tの情報だけ保存して、flagとかは
> refinedなメソッドエントリ(rb_method_entry_t)の方に持たせるということですか?
> オリジナルのrb_method_entry_tを保存しておくという話だと思っていたので面倒そうだな
> と思っていました。
>
> original_definitionを消すというのはalias_countが0になったら、ということで合ってます?
> 呼び出し時には新しいrb_method_entry_tを用意してrefinedなメソッドエントリの情報を
> コピーする感じですかね。

とりあえず、上記の方針で実装してみました。

  http://shugo.net/tmp/refinement_fix_1119.diff

色々と罠があって思ったより大変でした…。