From: Shugo Maeda Date: 2012-11-19T00:53:34+09:00 Subject: [ruby-dev:46536] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): 前田です。 2012年11月16日 18:07 Shugo Maeda : >>> どちらかというと、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 色々と罠があって思ったより大変でした…。