[ruby/psych] Use `rb_struct_initialize` to initialize Data
authornick evans <[email protected]>
Fri, 8 Nov 2024 15:00:46 +0000 (8 10:00 -0500)
committerHiroshi SHIBATA <[email protected]>
Fri, 2 May 2025 00:49:15 +0000 (2 09:49 +0900)
https://github.com/ruby/psych/commit/3573fb356e

ext/psych/lib/psych/visitors/to_ruby.rb
ext/psych/psych_to_ruby.c

index 5adefde..580a74e 100644 (file)
@@ -219,7 +219,8 @@ module Psych
             revive_data_members(members, o)
           end
           data ||= allocate_anon_data(o, members)
-          data.send(:initialize, **members)
+          init_struct(data, **members)
+          data.freeze
           data
 
         when /^!ruby\/object:?(.*)?$/
index ffe0c69..d473a5f 100644 (file)
@@ -24,6 +24,15 @@ static VALUE path2class(VALUE self, VALUE path)
     return rb_path_to_class(path);
 }
 
+static VALUE init_struct(VALUE self, VALUE data, VALUE attrs)
+{
+    VALUE args = rb_ary_new2(1);
+    rb_ary_push(args, attrs);
+    rb_struct_initialize(data, args);
+
+    return data;
+}
+
 void Init_psych_to_ruby(void)
 {
     VALUE psych     = rb_define_module("Psych");
@@ -33,6 +42,7 @@ void Init_psych_to_ruby(void)
     VALUE visitor   = rb_define_class_under(visitors, "Visitor", rb_cObject);
     cPsychVisitorsToRuby = rb_define_class_under(visitors, "ToRuby", visitor);
 
+    rb_define_private_method(cPsychVisitorsToRuby, "init_struct", init_struct, 2);
     rb_define_private_method(cPsychVisitorsToRuby, "build_exception", build_exception, 2);
     rb_define_private_method(class_loader, "path2class", path2class, 1);
 }