Skip to content
  • nagachika's avatar
    d47df506
    merge revision(s) 39a2ba5c: [Backport #17806] · d47df506
    nagachika authored
    	Method cache: fix refinement entry handling
    
    	To invalidate some callable method entries, we replace the entry in the
    	class. Most types of method entries are on the method table of the
    	origin class, but refinement entries without an orig_me are housed in
    	the method table of the class itself. They are there because refinements
    	take priority over prepended methods.
    
    	By unconditionally inserting a copy of the refinement entry into the
    	origin class, clearing the method cache created situations where there
    	are refinement entry duplicates in the lookup chain, leading to infinite
    	loops and other problems.
    
    	Update the replacement logic to use the right class that houses the
    	method entry. Also, be more selective about cache invalidation when
    	moving refinement entries for prepend. This avoids calling
    	clear_method_cache_by_id_in_class() before refinement entries are in the
    	place it expects.
    
    	[Bug #17806]
    	---
    	 class.c                      |  4 +++-
    	 test/ruby/test_refinement.rb | 49 ++++++++++++++++++++++++++++++++++++++++++++
    	 vm_method.c                  | 13 ++++++++++--
    	 3 files changed, 63 insertions(+), 3 deletions(-)
    d47df506
    merge revision(s) 39a2ba5c: [Backport #17806]
    nagachika authored
    	Method cache: fix refinement entry handling
    
    	To invalidate some callable method entries, we replace the entry in the
    	class. Most types of method entries are on the method table of the
    	origin class, but refinement entries without an orig_me are housed in
    	the method table of the class itself. They are there because refinements
    	take priority over prepended methods.
    
    	By unconditionally inserting a copy of the refinement entry into the
    	origin class, clearing the method cache created situations where there
    	are refinement entry duplicates in the lookup chain, leading to infinite
    	loops and other problems.
    
    	Update the replacement logic to use the right class that houses the
    	method entry. Also, be more selective about cache invalidation when
    	moving refinement entries for prepend. This avoids calling
    	clear_method_cache_by_id_in_class() before refinement entries are in the
    	place it expects.
    
    	[Bug #17806]
    	---
    	 class.c                      |  4 +++-
    	 test/ruby/test_refinement.rb | 49 ++++++++++++++++++++++++++++++++++++++++++++
    	 vm_method.c                  | 13 ++++++++++--
    	 3 files changed, 63 insertions(+), 3 deletions(-)
Loading