From 2547051b1cc1d5ffe2a709e88827807925ffefe0 Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Thu, 11 Dec 2025 10:42:23 -0600 Subject: [PATCH] Invoke initialize from Ruby, not native code JRuby does not expose the `initialize` method for a given Data instance to native code, so there's no equivalent to calling `rb_struct_initialize`. This change moves that initialization to a Ruby `__send__` and removes the native stub method `init_data`. Fixes broken JRuby `Data` logic after #692. --- ext/psych/psych_to_ruby.c | 7 ------- lib/psych/visitors/to_ruby.rb | 4 +--- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/ext/psych/psych_to_ruby.c b/ext/psych/psych_to_ruby.c index 0132b2c9..3ab0138b 100644 --- a/ext/psych/psych_to_ruby.c +++ b/ext/psych/psych_to_ruby.c @@ -28,12 +28,6 @@ static VALUE path2class(VALUE self, VALUE path) return rb_path_to_class(path); } -static VALUE init_data(VALUE self, VALUE data, VALUE values) -{ - rb_struct_initialize(data, values); - return data; -} - void Init_psych_to_ruby(void) { VALUE psych = rb_define_module("Psych"); @@ -43,7 +37,6 @@ 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_data", init_data, 2); rb_define_private_method(cPsychVisitorsToRuby, "build_exception", build_exception, 2); rb_define_private_method(class_loader, "path2class", path2class, 1); } diff --git a/lib/psych/visitors/to_ruby.rb b/lib/psych/visitors/to_ruby.rb index e62311ae..d27c9226 100644 --- a/lib/psych/visitors/to_ruby.rb +++ b/lib/psych/visitors/to_ruby.rb @@ -219,9 +219,7 @@ def visit_Psych_Nodes_Mapping o revive_data_members(members, o) end data ||= allocate_anon_data(o, members) - values = data.members.map { |m| members[m] } - init_data(data, values) - data.freeze + data.__send__ :initialize, **members data when /^!ruby\/object:?(.*)?$/