From: "Nobuyoshi.Nakada" Date: 2000-11-15T19:38:26+09:00 Subject: [ruby-dev:11537] Re: method_added by attr なかだです。 At Wed, 15 Nov 2000 14:45:22 +0900 Kenichi Komiya wrote: > attrからmethod_addedがよばれた際に、メソッドキャッシュがクリアされてない > ような気がします。以下のコードを実行するとmethod_added内でNameErrorが発 > 生します。 Ruby コードを呼ぶ前にクリアしないとまずいですね。 diff -pruPX ./.excludes current/eval.c devel/eval.c --- current/eval.c Wed Nov 8 14:29:21 2000 +++ devel/eval.c Wed Nov 15 19:33:20 2000 @@ -477,15 +477,15 @@ rb_attr(klass, id, read, write, ex) attriv = rb_intern(buf); if (read) { rb_add_method(klass, id, NEW_IVAR(attriv), noex); - rb_funcall(klass, added, 1, ID2SYM(id)); rb_clear_cache_by_id(id); + rb_funcall(klass, added, 1, ID2SYM(id)); } sprintf(buf, "%s=", name); id = rb_intern(buf); if (write) { rb_add_method(klass, id, NEW_ATTRSET(attriv), noex); - rb_funcall(klass, added, 1, ID2SYM(id)); rb_clear_cache_by_id(id); + rb_funcall(klass, added, 1, ID2SYM(id)); } } @@ -2855,12 +2855,12 @@ rb_eval(self, n) noex |= NOEX_UNDEF; } rb_add_method(ruby_class, node->nd_mid, node->nd_defn, noex); + rb_clear_cache_by_id(node->nd_mid); if (scope_vmode == SCOPE_MODFUNC) { rb_add_method(rb_singleton_class(ruby_class), node->nd_mid, node->nd_defn, NOEX_PUBLIC); rb_funcall(ruby_class, singleton_added, 1, ID2SYM(node->nd_mid)); } - rb_clear_cache_by_id(node->nd_mid); if (FL_TEST(ruby_class, FL_SINGLETON)) { rb_funcall(rb_iv_get(ruby_class, "__attached__"), singleton_added, 1, ID2SYM(node->nd_mid)); @@ -2900,8 +2900,8 @@ rb_eval(self, n) } rb_add_method(klass, node->nd_mid, node->nd_defn, NOEX_PUBLIC|(body?body->nd_noex&NOEX_UNDEF:0)); - rb_funcall(recv, singleton_added, 1, ID2SYM(node->nd_mid)); rb_clear_cache_by_id(node->nd_mid); + rb_funcall(recv, singleton_added, 1, ID2SYM(node->nd_mid)); result = Qnil; } break; @@ -5374,8 +5374,8 @@ rb_mod_modfunc(argc, argv, module) rb_bug("undefined method `%s'; can't happen", rb_id2name(id)); } rb_add_method(rb_singleton_class(module), id, body->nd_body, NOEX_PUBLIC); - rb_funcall(module, singleton_added, 1, ID2SYM(id)); rb_clear_cache_by_id(id); + rb_funcall(module, singleton_added, 1, ID2SYM(id)); } return module; } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦