Skip to content

Commit 2af8f30

Browse files
committed
merge revision(s) 2e7e78c: [Backport #21440]
[Bug #21440] Stop caching member list in frozen Data/Struct class
1 parent 508daeb commit 2af8f30

File tree

4 files changed

+15
-2
lines changed

4 files changed

+15
-2
lines changed

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
@@ -548,6 +548,12 @@ def test_named_structs_are_not_rooted
548548
CODE
549549
end
550550

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

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
1212
#define RUBY_VERSION_TEENY 4
1313
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
14-
#define RUBY_PATCHLEVEL 47
14+
#define RUBY_PATCHLEVEL 48
1515

1616
#include "ruby/version.h"
1717
#include "ruby/internal/abi.h"

0 commit comments

Comments
 (0)