• KOBAYASHI Shuji's avatar
    Fix potentially use of wrong method cache · 0b2d54f4
    KOBAYASHI Shuji authored
    #### Example (with `MRB_METHOD_CACHE`)
    
      ```ruby
      GC.start
      c = Class.new
      p c            #=> #<Class:0x7fd6a180e790>
      c.new          #=> cache `c.new`
      c = nil
      GC.start       #=> `c` is GCed
      r = Range.dup
      p r            #=> #<Class:0x7fd6a180e790>
                     #   [same pointer as `c`]
      r.new(2, 3)    #=> ArgumentError: 'initialize':
                     #   wrong number of arguments (2 for 0)
                     #   [`c.new` is called instead of `r.new`]
      ```
    
    #### Cause
    
      An entry of method cache is identified by class pointer and method
      id. However, reusing memory after GC may create a class with the same
      pointer as the cached class.
    
    #### Treatment
    
      Cleared method caches of the class when the class is GCed.
    0b2d54f4
class.c 60.3 KB