From: shugo@... Date: 2015-12-17T01:23:40+00:00 Subject: [ruby-core:72197] [Ruby trunk - Bug #11826] [Assigned] After prepending a module, rewrite Hash#[] takes no effect for calls like Hash.new[:a] Issue #11826 has been updated by Shugo Maeda. Status changed from Open to Assigned Assignee set to Koichi Sasada cichol tsai wrote: > It seems like an issue only for [] method, maybe something about syntax. > But if use 'include' instead of 'prepend', the 'h[:a]' can give an output. > Please help me check if it is a bug, sorry for bothering. It seems that redefinition check of optimized methods doesn't work properly for prepended classes. Is the following patch correct, ko1? ```diff diff --git a/vm.c b/vm.c index a03e068..cf528e8 100644 --- a/vm.c +++ b/vm.c @@ -1400,6 +1400,9 @@ static void rb_vm_check_redefinition_opt_method(const rb_method_entry_t *me, VALUE klass) { st_data_t bop; + if (RB_TYPE_P(klass, T_ICLASS) && FL_TEST(klass, RICLASS_IS_ORIGIN)) { + klass = RBASIC_CLASS(klass); + } if (me->def->type == VM_METHOD_TYPE_CFUNC) { if (st_lookup(vm_opt_method_table, (st_data_t)me, &bop)) { int flag = vm_redefinition_check_flag(klass); ``` ---------------------------------------- Bug #11826: After prepending a module, rewrite Hash#[] takes no effect for calls like Hash.new[:a] https://bugs.ruby-lang.org/issues/11826#change-55609 * Author: cichol tsai * Status: Assigned * Priority: Normal * Assignee: Koichi Sasada * ruby -v: ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- ~~~ module M def self.prepended(clz) clz.class_eval do def [](k) p 1 end end end end module N def self.included(clz) clz.class_eval do def []=(k, v) p 2 end end end end class Hash prepend M include N end Hash.new[1] Hash.new[1]=1 ~~~ Running this example gives no output, which is expected to be '1 2'. I am using 'ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32]'. Thanks in advanced. -- https://bugs.ruby-lang.org/