summaryrefslogtreecommitdiff
path: root/ext/json/generator/generator.c
diff options
context:
space:
mode:
authorLuke T. Shumaker <[email protected]>2024-02-22 20:51:28 -0700
committerHiroshi SHIBATA <[email protected]>2024-10-08 14:10:05 +0900
commit934d67b4159f9a5febcccec782714cc12e0983f3 (patch)
tree4d173730a7b494f7b0195e4a2ee4c4a20ca19716 /ext/json/generator/generator.c
parent74d459fd52ef85f92f7c20819afcc4ffcf11714d (diff)
[ruby/json] generator.c: Optimize by combining calls to fbuffer_append
https://github.com/ruby/json/commit/62301c0bc3
Diffstat (limited to 'ext/json/generator/generator.c')
-rw-r--r--ext/json/generator/generator.c9
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);
}