diff options
author | Luke T. Shumaker <[email protected]> | 2024-02-22 20:51:28 -0700 |
---|---|---|
committer | Hiroshi SHIBATA <[email protected]> | 2024-10-08 14:10:05 +0900 |
commit | 934d67b4159f9a5febcccec782714cc12e0983f3 (patch) | |
tree | 4d173730a7b494f7b0195e4a2ee4c4a20ca19716 /ext | |
parent | 74d459fd52ef85f92f7c20819afcc4ffcf11714d (diff) |
[ruby/json] generator.c: Optimize by combining calls to fbuffer_append
https://github.com/ruby/json/commit/62301c0bc3
Diffstat (limited to 'ext')
-rw-r--r-- | ext/json/generator/generator.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index 4d853ec343..48badb3126 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -43,7 +43,7 @@ static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ unsigned long in_utf8_len = RSTRING_LEN(in_string); bool in_is_ascii_only = rb_enc_str_asciionly_p(in_string); - unsigned long pos; + unsigned long beg = 0, pos; for (pos = 0; pos < in_utf8_len;) { uint32_t ch; @@ -89,6 +89,9 @@ static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ /* JSON encoding */ if (should_escape) { + if (pos > beg) + fbuffer_append(out_buffer, &in_utf8_str[beg], pos - beg); + beg = pos + ch_len; switch (ch) { case '"': fbuffer_append(out_buffer, "\\\"", 2); break; case '\\': fbuffer_append(out_buffer, "\\\\", 2); break; @@ -124,12 +127,12 @@ static void convert_UTF8_to_JSON(FBuffer *out_buffer, VALUE in_string, bool out_ fbuffer_append(out_buffer, scratch, 12); } } - } else { - fbuffer_append(out_buffer, &in_utf8_str[pos], ch_len); } pos += ch_len; } + if (beg < in_utf8_len) + fbuffer_append(out_buffer, &in_utf8_str[beg], in_utf8_len - beg); RB_GC_GUARD(in_string); } |