summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <[email protected]>2025-06-13 14:15:14 +0900
committerNobuyoshi Nakada <[email protected]>2025-06-13 14:22:06 +0900
commit2e7e78cd590d20aa9d41422e96302f3edd73f623 (patch)
treefda33dc697f15ac6ce4628089a02fd3dca809cc4
parent64c421db20f391a893d53cc098ec2dbbe9d45962 (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.c3
-rw-r--r--test/ruby/test_data.rb6
-rw-r--r--test/ruby/test_struct.rb6
3 files changed, 14 insertions, 1 deletions
diff --git a/struct.c b/struct.c
index 7cfc1f2a16..74ca9369a6 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 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