diff options
author | Nobuyoshi Nakada <[email protected]> | 2025-06-13 14:15:14 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2025-06-13 14:22:06 +0900 |
commit | 2e7e78cd590d20aa9d41422e96302f3edd73f623 (patch) | |
tree | fda33dc697f15ac6ce4628089a02fd3dca809cc4 | |
parent | 64c421db20f391a893d53cc098ec2dbbe9d45962 (diff) |
[Bug #21440] Stop caching member list in frozen Data/Struct class
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/13603
-rw-r--r-- | struct.c | 3 | ||||
-rw-r--r-- | test/ruby/test_data.rb | 6 | ||||
-rw-r--r-- | test/ruby/test_struct.rb | 6 |
3 files changed, 14 insertions, 1 deletions
@@ -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 ecd8ed196c..db591c306e 100644 --- a/test/ruby/test_struct.rb +++ b/test/ruby/test_struct.rb @@ -550,6 +550,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 |