チケット #2777 が更新されました。 (by Yusuke Endoh)

担当者 Koichi Sasadaにセット
優先度 LowからNormalに変更
Target version 1.9.2にセット
ruby -v -にセット

遠藤です。

> % cat tst.rb
> module Kernel
>   def load(*args)
>   end
> end
> raise
> % valgrind ./ruby -ve 'load "tst.rb"'
*snip*

というオリジナルの問題は r27393 で巧妙に回避されましたが、本質的には
解決しておらず、以下で SEGV します。

  class C
    define_method(:foo) do
      C.class_eval { remove_method(:foo) }
      super()
    end
  end
  C.new.foo

あと、r27393 だと rb_method_definition_t の参照を減らしていないので
メモリリークするような気がします。

diff --git a/vm_method.c b/vm_method.c
index 04b62f2..c9d99db 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -215,6 +215,14 @@ rb_add_method_def(VALUE klass, ID mid, rb_method_type_t type, rb_method_definiti
 	 * another problem when the usage is changed.
 	 */
 	me = old_me;
+
+	if (me->def) {
+	    if (me->def->alias_count == 0)
+		xfree(me->def);
+	    else if (me->def->alias_count > 0)
+		me->def->alias_count--;
+	    me->def = 0;
+	}
     }
     else {
 	me = ALLOC(rb_method_entry_t);

-- 
Yusuke Endoh <mame / tsg.ne.jp>
----------------------------------------
http://redmine.ruby-lang.org/issues/show/2777

----------------------------------------
http://redmine.ruby-lang.org