From a976792832887ee2ae1380ab0e2244067126f017 Mon Sep 17 00:00:00 2001 From: nagachika Date: Sun, 29 Jun 2025 12:27:54 +0900 Subject: [PATCH] merge revision(s) 2e7e78cd590d20aa9d41422e96302f3edd73f623: [Backport #21440] [Bug #21440] Stop caching member list in frozen Data/Struct class --- struct.c | 3 ++- test/ruby/test_data.rb | 6 ++++++ test/ruby/test_struct.rb | 6 ++++++ version.h | 2 +- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/struct.c b/struct.c index c54dc12a04..23420d5e8c 100644 --- a/struct.c +++ b/struct.c @@ -52,7 +52,8 @@ struct_ivar_get(VALUE c, ID id) RUBY_ASSERT(RB_TYPE_P(c, T_CLASS)); ivar = rb_attr_get(c, id); if (!NIL_P(ivar)) { - return rb_ivar_set(orig, id, ivar); + if (!OBJ_FROZEN(orig)) rb_ivar_set(orig, id, ivar); + return ivar; } } } diff --git a/test/ruby/test_data.rb b/test/ruby/test_data.rb index bb38f8ec91..dd698fdcc4 100644 --- a/test/ruby/test_data.rb +++ b/test/ruby/test_data.rb @@ -280,4 +280,10 @@ class TestData < Test::Unit::TestCase assert_not_same(test, loaded) assert_predicate(loaded, :frozen?) end + + def test_frozen_subclass + test = Class.new(Data.define(:a)).freeze.new(a: 0) + assert_kind_of(Data, test) + assert_equal([:a], test.members) + end end diff --git a/test/ruby/test_struct.rb b/test/ruby/test_struct.rb index 3d727adf04..e6fd6af8ec 100644 --- a/test/ruby/test_struct.rb +++ b/test/ruby/test_struct.rb @@ -548,6 +548,12 @@ module TestStruct CODE end + def test_frozen_subclass + test = Class.new(@Struct.new(:a)).freeze.new(a: 0) + assert_kind_of(@Struct, test) + assert_equal([:a], test.members) + end + class TopStruct < Test::Unit::TestCase include TestStruct diff --git a/version.h b/version.h index ca7065b653..9aec743969 100644 --- a/version.h +++ b/version.h @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 8 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 161 +#define RUBY_PATCHLEVEL 162 #include "ruby/version.h" #include "ruby/internal/abi.h"