diff options
-rw-r--r-- | struct.c | 1 | ||||
-rw-r--r-- | test/ruby/test_data.rb | 10 |
2 files changed, 11 insertions, 0 deletions
@@ -786,6 +786,7 @@ VALUE rb_struct_initialize(VALUE self, VALUE values) { rb_struct_initialize_m(RARRAY_LENINT(values), RARRAY_CONST_PTR(values), self); + if (rb_obj_is_kind_of(self, rb_cData)) OBJ_FREEZE_RAW(self); RB_GC_GUARD(values); return Qnil; } diff --git a/test/ruby/test_data.rb b/test/ruby/test_data.rb index b8dc55815b..4d28da6061 100644 --- a/test/ruby/test_data.rb +++ b/test/ruby/test_data.rb @@ -177,4 +177,14 @@ class TestData < Test::Unit::TestCase assert_equal(klass.new(foo: 1, bar: 2), test.dup) assert_predicate(test.dup, :frozen?) end + + Klass = Data.define(:foo, :bar) + + def test_marshal + test = Klass.new(foo: 1, bar: 2) + loaded = Marshal.load(Marshal.dump(test)) + assert_equal(test, loaded) + assert_not_same(test, loaded) + assert_predicate(loaded, :frozen?) + end end |