Skip to content

Commit 2e7e78c

Browse files
committed
[Bug #21440] Stop caching member list in frozen Data/Struct class
1 parent 64c421d commit 2e7e78c

3 files changed

Lines changed: 14 additions & 1 deletion

File tree

struct.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ struct_ivar_get(VALUE c, ID id)
5252
RUBY_ASSERT(RB_TYPE_P(c, T_CLASS));
5353
ivar = rb_attr_get(c, id);
5454
if (!NIL_P(ivar)) {
55-
return rb_ivar_set(orig, id, ivar);
55+
if (!OBJ_FROZEN(orig)) rb_ivar_set(orig, id, ivar);
56+
return ivar;
5657
}
5758
}
5859
}

test/ruby/test_data.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,4 +280,10 @@ def test_marshal
280280
assert_not_same(test, loaded)
281281
assert_predicate(loaded, :frozen?)
282282
end
283+
284+
def test_frozen_subclass
285+
test = Class.new(Data.define(:a)).freeze.new(a: 0)
286+
assert_kind_of(Data, test)
287+
assert_equal([:a], test.members)
288+
end
283289
end

test/ruby/test_struct.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,12 @@ def test_named_structs_are_not_rooted
550550
CODE
551551
end
552552

553+
def test_frozen_subclass
554+
test = Class.new(@Struct.new(:a)).freeze.new(a: 0)
555+
assert_kind_of(@Struct, test)
556+
assert_equal([:a], test.members)
557+
end
558+
553559
class TopStruct < Test::Unit::TestCase
554560
include TestStruct
555561

0 commit comments

Comments
 (0)