Skip to content
  • Eileen M. Uchitelle's avatar
    cba152ff
    Backport cvar clone bug fix for 19379 to 3.1 (#7889) · cba152ff
    Eileen M. Uchitelle authored
    * Copy cvar table on clone
    
    When a class with a class variable is cloned we need to also copy the
    cvar cache table from the original table to the clone. I found this bug
    while working on fixing [Bug #19379]. While this does not fix that bug
    directly it is still a required change to fix another bug revealed by
    the fix in https://github.com/ruby/ruby/pull/7265
    
    
    
    This needs to be backported to 3.2.x and 3.1.x.
    
    Co-authored-by: default avatarAaron Patterson <tenderlove@ruby-lang.org>
    
    * Fix cvar caching when class is cloned
    
    The class variable cache that was added in
    https://github.com/ruby/ruby/pull/4544
    
     changed the behavior of class
    variables on cloned classes. As reported when a class is cloned AND a
    class variable was set, and the class variable was read from the
    original class, reading a class variable from the cloned class would
    return the value from the original class.
    
    This was happening because the IC (inline cache) is stored on the ISEQ
    which is shared between the original and cloned class, therefore they
    share the cache too.
    
    To fix this we are now storing the `cref` in the cache so that we can
    check if it's equal to the current `cref`. If it's different we don't
    want to read from the cache. If it's the same we do. Cloned classes
    don't share the same cref with their original class.
    
    This will need to be backported to 3.1 in addition to 3.2 since the bug
    exists in both versions.
    
    We also added a marking function which was missing.
    
    Fixes [Bug #19379]
    
    Co-authored-by: default avatarAaron Patterson <tenderlove@ruby-lang.org>
    
    * Add missing write barrier
    
    We were missing the write barrier for class_value to cref. This should
    fix the segv we were seeing in http://ci.rvm.jp/logfiles/brlog.trunk-gc-asserts.20230601-165052
    
    
    
    Co-authored-by: default avatarAaron Patterson <tenderlove@ruby-lang.org>
    
    ---------
    
    Co-authored-by: default avatarAaron Patterson <tenderlove@ruby-lang.org>
    cba152ff
    Backport cvar clone bug fix for 19379 to 3.1 (#7889)
    Eileen M. Uchitelle authored
    * Copy cvar table on clone
    
    When a class with a class variable is cloned we need to also copy the
    cvar cache table from the original table to the clone. I found this bug
    while working on fixing [Bug #19379]. While this does not fix that bug
    directly it is still a required change to fix another bug revealed by
    the fix in https://github.com/ruby/ruby/pull/7265
    
    
    
    This needs to be backported to 3.2.x and 3.1.x.
    
    Co-authored-by: default avatarAaron Patterson <tenderlove@ruby-lang.org>
    
    * Fix cvar caching when class is cloned
    
    The class variable cache that was added in
    https://github.com/ruby/ruby/pull/4544
    
     changed the behavior of class
    variables on cloned classes. As reported when a class is cloned AND a
    class variable was set, and the class variable was read from the
    original class, reading a class variable from the cloned class would
    return the value from the original class.
    
    This was happening because the IC (inline cache) is stored on the ISEQ
    which is shared between the original and cloned class, therefore they
    share the cache too.
    
    To fix this we are now storing the `cref` in the cache so that we can
    check if it's equal to the current `cref`. If it's different we don't
    want to read from the cache. If it's the same we do. Cloned classes
    don't share the same cref with their original class.
    
    This will need to be backported to 3.1 in addition to 3.2 since the bug
    exists in both versions.
    
    We also added a marking function which was missing.
    
    Fixes [Bug #19379]
    
    Co-authored-by: default avatarAaron Patterson <tenderlove@ruby-lang.org>
    
    * Add missing write barrier
    
    We were missing the write barrier for class_value to cref. This should
    fix the segv we were seeing in http://ci.rvm.jp/logfiles/brlog.trunk-gc-asserts.20230601-165052
    
    
    
    Co-authored-by: default avatarAaron Patterson <tenderlove@ruby-lang.org>
    
    ---------
    
    Co-authored-by: default avatarAaron Patterson <tenderlove@ruby-lang.org>
Loading