From: shugo@... Date: 2017-11-18T06:58:56+00:00 Subject: [ruby-core:83813] [Ruby trunk Bug#14068] Unused refinement breaks method search Issue #14068 has been updated by shugo (Shugo Maeda). Assignee changed from shugo (Shugo Maeda) to ko1 (Koichi Sasada) mame (Yusuke Endoh) wrote: > But, defining UnusedRefinement that refines M2, breaks the behavior, even if it is entirely not used. When a method is refined, a VM_METHOD_TYPE_REFINED entry is defined at the target module even if the refinement is not used. When the method is called, and if the refinement is not used in the scope, vm_call_method_each_type() falls back to the following code: ``` no_refinement_dispatch: if (cc->me->def->body.refined.orig_me) { cc->me = refined_method_callable_without_refinement(cc->me); } else { VALUE klass = RCLASS_SUPER(cc->me->owner); cc->me = klass ? rb_callable_method_entry(klass, ci->mid) : NULL; } return vm_call_method(ec, cfp, calling, ci, cc); } ``` However, cc-me->owner is not an iclass, but a module, so the method entry is not found. Is there any way to get an iclass here, ko1? Otherwise, we may have to abandon refining modules.... ---------------------------------------- Bug #14068: Unused refinement breaks method search https://bugs.ruby-lang.org/issues/14068#change-67846 * Author: mame (Yusuke Endoh) * Status: Assigned * Priority: Normal * Assignee: ko1 (Koichi Sasada) * Target version: 2.5 * ruby -v: ruby 2.5.0dev (2017-10-30 trunk 60565) [x86_64-linux] * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- The following is an expected behavior. ~~~ module M1 def foo p "M1#foo" end end module M2 end include M1 include M2 foo() #=> "M1#foo" ~~~ But, defining UnusedRefinement that refines M2, breaks the behavior, even if it is entirely not used. ~~~ module M1 def foo p "M1#foo" end end module M2 end module UnusedRefinement # <=== INSERTED refine(M2) do def foo p "M2#foo" end end end include M1 include M2 foo() #=> test.rb:20:in `
': undefined method `foo' for main:Object (NoMethodError) ~~~ -- https://bugs.ruby-lang.org/ Unsubscribe: