From 8f02f644eb5e021b3138b028b4292617650b614a Mon Sep 17 00:00:00 2001 From: Scott Myron Date: Fri, 17 Apr 2026 21:10:37 -0500 Subject: [PATCH] [ruby/json] Use RB_ENC_CODERANGE to first check the cached coderange before calling rb_enc_str_coderange if the coderange is unknown. https://github.com/ruby/json/commit/4ef7a45654 --- ext/json/generator/generator.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index b52bc975124aa9..04cc6e7b852677 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -819,9 +819,17 @@ static VALUE encode_json_string_rescue(VALUE str, VALUE exception) return Qundef; } +static inline int json_str_coderange(VALUE str) { + int coderange = RB_ENC_CODERANGE(str); + if (coderange == RUBY_ENC_CODERANGE_UNKNOWN) { + coderange = rb_enc_str_coderange(str); + } + return coderange; +} + static inline bool valid_json_string_p(VALUE str) { - int coderange = rb_enc_str_coderange(str); + int coderange = json_str_coderange(str); if (RB_LIKELY(coderange == ENC_CODERANGE_7BIT)) { return true; @@ -893,7 +901,7 @@ static void raw_generate_json_string(FBuffer *buffer, struct generate_json_data search.chunk_end = NULL; #endif /* HAVE_SIMD */ - switch (rb_enc_str_coderange(obj)) { + switch (json_str_coderange(obj)) { case ENC_CODERANGE_7BIT: case ENC_CODERANGE_VALID: if (RB_UNLIKELY(data->state->ascii_only)) {