summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--struct.c1
-rw-r--r--test/ruby/test_data.rb10
2 files changed, 11 insertions, 0 deletions
diff --git a/struct.c b/struct.c
index def15b0186..3733669eab 100644
--- a/struct.c
+++ b/struct.c
@@ -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