From 07692d5897e053f27c2e1b9302d6d89aef77ae6e Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Wed, 24 Jun 2026 11:32:29 +0200 Subject: [PATCH] Declare types as RUBY_TYPED_THREAD_SAFE_FREE Ref: https://github.com/ruby/ruby/pull/17395 --- ext/json/ext/generator/generator.c | 2 +- ext/json/ext/json.h | 4 ++++ ext/json/ext/parser/parser.c | 8 ++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ext/json/ext/generator/generator.c b/ext/json/ext/generator/generator.c index 08c1fd0d..d4164051 100644 --- a/ext/json/ext/generator/generator.c +++ b/ext/json/ext/generator/generator.c @@ -739,7 +739,7 @@ static const rb_data_type_t JSON_Generator_State_type = { .dsize = State_memsize, .dcompact = State_compact, }, - .flags = RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE | RUBY_TYPED_EMBEDDABLE, + .flags = RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_FROZEN_SHAREABLE | RUBY_TYPED_EMBEDDABLE, }; static void state_init(JSON_Generator_State *state) diff --git a/ext/json/ext/json.h b/ext/json/ext/json.h index f39e795a..afddbe2a 100644 --- a/ext/json/ext/json.h +++ b/ext/json/ext/json.h @@ -31,6 +31,10 @@ /* shims */ +#ifndef RUBY_TYPED_THREAD_SAFE_FREE +#define RUBY_TYPED_THREAD_SAFE_FREE RUBY_TYPED_FREE_IMMEDIATELY +#endif + #ifndef UNDEF_P #define UNDEF_P(val) (val == Qundef) #endif diff --git a/ext/json/ext/parser/parser.c b/ext/json/ext/parser/parser.c index 9a86cd58..47195638 100644 --- a/ext/json/ext/parser/parser.c +++ b/ext/json/ext/parser/parser.c @@ -314,7 +314,7 @@ static const rb_data_type_t JSON_Parser_rvalue_stack_type = { }, // We deliberately don't declare rvalue_stack as RUBY_TYPED_WB_PROTECTED // because it churns a lot of values so trigering write barriers every time is very costly. - .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_EMBEDDABLE, + .flags = RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_EMBEDDABLE, }; static rvalue_stack *rvalue_stack_spill(rvalue_stack *old_stack, VALUE *handle, rvalue_stack **stack_ref) @@ -511,7 +511,7 @@ static const rb_data_type_t JSON_Parser_frame_stack_type = { .dfree = json_frame_stack_free, .dsize = json_frame_stack_memsize, }, - .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE, + .flags = RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE, }; static json_frame_stack *json_frame_stack_spill(json_frame_stack *old_stack, VALUE *handle, json_frame_stack **stack_ref) @@ -2180,7 +2180,7 @@ static const rb_data_type_t JSON_ParserConfig_type = { .dsize = JSON_ParserConfig_memsize, .dcompact = JSON_ParserConfig_compact, }, - .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE | RUBY_TYPED_EMBEDDABLE, + .flags = RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FROZEN_SHAREABLE | RUBY_TYPED_EMBEDDABLE, }; static VALUE cJSON_parser_s_allocate(VALUE klass) @@ -2265,7 +2265,7 @@ static const rb_data_type_t JSON_ResumableParser_type = { // RUBY_TYPED_WB_PROTECTED is deliberately not declared because // this is a superset of JSON_Parser_rvalue_stack_type, so we'd need // to trigger a lot of write barriers. - .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_EMBEDDABLE, + .flags = RUBY_TYPED_THREAD_SAFE_FREE | RUBY_TYPED_EMBEDDABLE, }; static VALUE cResumableParser_allocate(VALUE klass)