summaryrefslogtreecommitdiff
path: root/ext/json/generator
diff options
context:
space:
mode:
authorÉtienne Barrié <[email protected]>2025-02-05 12:35:30 +0100
committerHiroshi SHIBATA <[email protected]>2025-02-06 16:02:03 +0900
commitb4bfbcaddcc4d5ec82631df3fc53b3a3ac65edb7 ()
treee267e4a3709bd77d4dd03eb35f05f44b88500db3 /ext/json/generator
parentf865148e1926f838cac8b4449abfc5d402d0d015 (diff)
Optimize Symbol generation in strict mode
Co-authored-by: Jean Boussier <[email protected]>
-rw-r--r--ext/json/generator/generator.c37
1 files changed, 29 insertions, 8 deletions
@@ -991,6 +991,29 @@ static void generate_json_string(FBuffer *buffer, struct generate_json_data *dat
fbuffer_append_char(buffer, '"');
}
static void generate_json_null(FBuffer *buffer, struct generate_json_data *data, JSON_Generator_State *state, VALUE obj)
{
fbuffer_append(buffer, "null", 4);
@@ -1057,7 +1080,6 @@ static void generate_json_fragment(FBuffer *buffer, struct generate_json_data *d
static void generate_json(FBuffer *buffer, struct generate_json_data *data, JSON_Generator_State *state, VALUE obj)
{
- VALUE tmp;
bool as_json_called = false;
start:
if (obj == Qnil) {
@@ -1071,6 +1093,8 @@ start:
generate_json_fixnum(buffer, data, state, obj);
} else if (RB_FLONUM_P(obj)) {
generate_json_float(buffer, data, state, obj);
} else {
goto general;
}
@@ -1092,6 +1116,9 @@ start:
if (klass != rb_cString) goto general;
generate_json_string(buffer, data, state, obj);
break;
case T_FLOAT:
if (klass != rb_cFloat) goto general;
generate_json_float(buffer, data, state, obj);
@@ -1110,14 +1137,8 @@ start:
} else {
raise_generator_error(obj, "%"PRIsVALUE" not allowed in JSON", CLASS_OF(obj));
}
- } else if (rb_respond_to(obj, i_to_json)) {
- tmp = rb_funcall(obj, i_to_json, 1, vstate_get(data));
- Check_Type(tmp, T_STRING);
- fbuffer_append_str(buffer, tmp);
} else {
- tmp = rb_funcall(obj, i_to_s, 0);
- Check_Type(tmp, T_STRING);
- generate_json_string(buffer, data, state, tmp);
}
}
}