Bug #7290
closed 
    Overriding method_added on a refinement's anonymous module can cause the opt_* opcodes to behave incorrectly
Description
Ruby stores flags in (({ruby_vm_redefined_flag})) to track whether certain methods have been redefined on particular classes. If the redefined flag for a certain class and operator is not set, Ruby will skip method lookup and directly call the method implementing that operator.
The current implementation of refinements uses the (({method_added})) callback to set these flags. If this method is overridden, the flags are not set properly.
This code should raise a RuntimeError with the message "addition is not allowed". Instead it outputs "3". If line 3 is removed, it behaves correctly.
module Test
refine Fixnum do
def self.method_added(id); end
  def +(other)
    raise "addition is not allowed"
  end
end
end
using Test
puts 1 + 2
        
           Updated by ko1 (Koichi Sasada) almost 13 years ago
          Updated by ko1 (Koichi Sasada) almost 13 years ago
          
          
        
        
      
      - Category set to core
- Assignee set to shugo (Shugo Maeda)
- Target version set to 2.0.0
        
           Updated by shugo (Shugo Maeda) almost 13 years ago
          Updated by shugo (Shugo Maeda) almost 13 years ago
          
          
        
        
      
      - Status changed from Open to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r37534.
Charlie, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- 
eval.c (rb_mod_refine): set RMODULE_IS_REFINEMENT to a created 
 refinement module, and don't override method_added.
- 
vm_method.c (rb_method_entry_make): check redefinition of 
 optimized methods when a method is added to a refinement module.
 [ruby-core:48970] [Bug #7290]
- 
test/ruby/test_refinement.rb: related test.