Skip to content

Commit 1265677

Browse files
committed
Extract fbuffer_append_str_repeat function
1 parent d4d0349 commit 1265677

File tree

2 files changed

+18
-18
lines changed

2 files changed

+18
-18
lines changed

ext/json/ext/fbuffer/fbuffer.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,22 @@ static void fbuffer_append_str(FBuffer *fb, VALUE str)
197197
const char *newstr = StringValuePtr(str);
198198
unsigned long len = RSTRING_LEN(str);
199199

200-
RB_GC_GUARD(str);
201-
202200
fbuffer_append(fb, newstr, len);
203201
}
204202

203+
static void fbuffer_append_str_repeat(FBuffer *fb, VALUE str, size_t repeat)
204+
{
205+
unsigned long len = RSTRING_LEN(str);
206+
207+
size_t total = repeat * len;
208+
fbuffer_inc_capa(fb, total);
209+
210+
while (repeat) {
211+
fbuffer_append_str(fb, str);
212+
repeat--;
213+
}
214+
}
215+
205216
static inline void fbuffer_append_char(FBuffer *fb, char newchr)
206217
{
207218
fbuffer_inc_capa(fb, 1);

ext/json/ext/generator/generator.c

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,16 +1016,13 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
10161016
JSON_Generator_State *state = data->state;
10171017

10181018
long depth = state->depth;
1019-
int j;
10201019

10211020
if (arg->iter > 0) fbuffer_append_char(buffer, ',');
10221021
if (RB_UNLIKELY(data->state->object_nl)) {
10231022
fbuffer_append_str(buffer, data->state->object_nl);
10241023
}
10251024
if (RB_UNLIKELY(data->state->indent)) {
1026-
for (j = 0; j < depth; j++) {
1027-
fbuffer_append_str(buffer, data->state->indent);
1028-
}
1025+
fbuffer_append_str_repeat(buffer, data->state->indent, depth);
10291026
}
10301027

10311028
VALUE key_to_s;
@@ -1083,7 +1080,6 @@ static inline long increase_depth(struct generate_json_data *data)
10831080

10841081
static void generate_json_object(FBuffer *buffer, struct generate_json_data *data, VALUE obj)
10851082
{
1086-
int j;
10871083
long depth = increase_depth(data);
10881084

10891085
if (RHASH_SIZE(obj) == 0) {
@@ -1104,17 +1100,14 @@ static void generate_json_object(FBuffer *buffer, struct generate_json_data *dat
11041100
if (RB_UNLIKELY(data->state->object_nl)) {
11051101
fbuffer_append_str(buffer, data->state->object_nl);
11061102
if (RB_UNLIKELY(data->state->indent)) {
1107-
for (j = 0; j < depth; j++) {
1108-
fbuffer_append_str(buffer, data->state->indent);
1109-
}
1103+
fbuffer_append_str_repeat(buffer, data->state->indent, depth);
11101104
}
11111105
}
11121106
fbuffer_append_char(buffer, '}');
11131107
}
11141108

11151109
static void generate_json_array(FBuffer *buffer, struct generate_json_data *data, VALUE obj)
11161110
{
1117-
int i, j;
11181111
long depth = increase_depth(data);
11191112

11201113
if (RARRAY_LEN(obj) == 0) {
@@ -1125,25 +1118,21 @@ static void generate_json_array(FBuffer *buffer, struct generate_json_data *data
11251118

11261119
fbuffer_append_char(buffer, '[');
11271120
if (RB_UNLIKELY(data->state->array_nl)) fbuffer_append_str(buffer, data->state->array_nl);
1128-
for (i = 0; i < RARRAY_LEN(obj); i++) {
1121+
for (int i = 0; i < RARRAY_LEN(obj); i++) {
11291122
if (i > 0) {
11301123
fbuffer_append_char(buffer, ',');
11311124
if (RB_UNLIKELY(data->state->array_nl)) fbuffer_append_str(buffer, data->state->array_nl);
11321125
}
11331126
if (RB_UNLIKELY(data->state->indent)) {
1134-
for (j = 0; j < depth; j++) {
1135-
fbuffer_append_str(buffer, data->state->indent);
1136-
}
1127+
fbuffer_append_str_repeat(buffer, data->state->indent, depth);
11371128
}
11381129
generate_json(buffer, data, RARRAY_AREF(obj, i));
11391130
}
11401131
data->state->depth = --depth;
11411132
if (RB_UNLIKELY(data->state->array_nl)) {
11421133
fbuffer_append_str(buffer, data->state->array_nl);
11431134
if (RB_UNLIKELY(data->state->indent)) {
1144-
for (j = 0; j < depth; j++) {
1145-
fbuffer_append_str(buffer, data->state->indent);
1146-
}
1135+
fbuffer_append_str_repeat(buffer, data->state->indent, depth);
11471136
}
11481137
}
11491138
fbuffer_append_char(buffer, ']');

0 commit comments

Comments
 (0)