From 2b3dc11c9ac034650a20180b6c3523edf4982a11 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Fri, 1 Nov 2024 15:49:58 +0100 Subject: [PATCH] Properly declare global variables (#941) Fix: https://github.com/ruby/json/issues/672 GC compaction might move these objects around so the global C variable MUST be declared to the GC so it's updated there too. --- ext/oj/mimic_json.c | 6 +++++- ext/oj/rails.c | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ext/oj/mimic_json.c b/ext/oj/mimic_json.c index cef9d506..aad4c622 100644 --- a/ext/oj/mimic_json.c +++ b/ext/oj/mimic_json.c @@ -837,11 +837,15 @@ void oj_mimic_json_methods(VALUE json) { } else { json_error = rb_define_class_under(json, "JSONError", rb_eStandardError); } + + rb_global_variable(&oj_json_parser_error_class); if (rb_const_defined_at(json, rb_intern("ParserError"))) { oj_json_parser_error_class = rb_const_get(json, rb_intern("ParserError")); } else { oj_json_parser_error_class = rb_define_class_under(json, "ParserError", json_error); } + + rb_global_variable(&oj_json_generator_error_class); if (rb_const_defined_at(json, rb_intern("GeneratorError"))) { oj_json_generator_error_class = rb_const_get(json, rb_intern("GeneratorError")); } else { @@ -867,8 +871,8 @@ void oj_mimic_json_methods(VALUE json) { rb_require("oj/state"); } // Pull in the JSON::State mimic file. + rb_global_variable(&state_class); state_class = rb_const_get_at(generator, rb_intern("State")); - rb_gc_register_mark_object(state_class); } /* Document-module: JSON diff --git a/ext/oj/rails.c b/ext/oj/rails.c index 91fed0db..fe63b471 100644 --- a/ext/oj/rails.c +++ b/ext/oj/rails.c @@ -1101,6 +1101,8 @@ static VALUE rails_set_decoder(VALUE self) { } else { json_error = rb_define_class_under(json, "JSONError", rb_eStandardError); } + + rb_global_variable(&oj_json_parser_error_class); if (rb_const_defined_at(json, rb_intern("ParserError"))) { oj_json_parser_error_class = rb_const_get(json, rb_intern("ParserError")); } else {