From 9c2147a2cfef62feebc3c3e6decde9c473bfc040 Mon Sep 17 00:00:00 2001 From: Scott Myron Date: Fri, 17 Apr 2026 21:10:37 -0500 Subject: [PATCH] Use RB_ENC_CODERANGE to first check the cached coderange before calling rb_enc_str_coderange if the coderange is unknown. --- ext/json/ext/generator/generator.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ext/json/ext/generator/generator.c b/ext/json/ext/generator/generator.c index b52bc975..04cc6e7b 100644 --- a/ext/json/ext/generator/generator.c +++ b/ext/json/ext/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)) {