summaryrefslogtreecommitdiff
path: root/ext/json/generator
diff options
context:
space:
mode:
authorÉtienne Barrié <[email protected]>2025-02-05 12:40:07 +0100
committerHiroshi SHIBATA <[email protected]>2025-02-06 16:02:03 +0900
commitf865148e1926f838cac8b4449abfc5d402d0d015 ()
tree42e544d8be47eae901bf1263c25133914f09e0c3 /ext/json/generator
parentdd1fe03b8a8da5e2cbe7b35dddb07541e7f58678 (diff)
Fix JSON::Coder to call as_json proc for NaN and Infinity
Co-authored-by: Jean Boussier <[email protected]>
-rw-r--r--ext/json/generator/generator.c34
1 files changed, 21 insertions, 13 deletions
@@ -841,15 +841,19 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
return ST_CONTINUE;
}
-static void generate_json_object(FBuffer *buffer, struct generate_json_data *data, JSON_Generator_State *state, VALUE obj)
{
- long max_nesting = state->max_nesting;
long depth = ++state->depth;
- int j;
-
- if (max_nesting != 0 && depth > max_nesting) {
rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
}
if (RHASH_SIZE(obj) == 0) {
fbuffer_append(buffer, "{}", 2);
@@ -879,12 +883,8 @@ static void generate_json_object(FBuffer *buffer, struct generate_json_data *dat
static void generate_json_array(FBuffer *buffer, struct generate_json_data *data, JSON_Generator_State *state, VALUE obj)
{
- long max_nesting = state->max_nesting;
- long depth = ++state->depth;
int i, j;
- if (max_nesting != 0 && depth > max_nesting) {
- rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
- }
if (RARRAY_LEN(obj) == 0) {
fbuffer_append(buffer, "[]", 2);
@@ -1031,13 +1031,21 @@ static void generate_json_float(FBuffer *buffer, struct generate_json_data *data
{
double value = RFLOAT_VALUE(obj);
char allow_nan = state->allow_nan;
- VALUE tmp = rb_funcall(obj, i_to_s, 0);
if (!allow_nan) {
if (isinf(value) || isnan(value)) {
- raise_generator_error(obj, "%"PRIsVALUE" not allowed in JSON", tmp);
}
}
- fbuffer_append_str(buffer, tmp);
}
static void generate_json_fragment(FBuffer *buffer, struct generate_json_data *data, JSON_Generator_State *state, VALUE obj)