Skip to content

Commit 61f6830

Browse files
committed
Don't write depth to JSON_Generator_State in some cases
For `JSON.generate` and `JSON::State#generate_new`, don't copy generate_json_data::depth to JSON_Generator_State::depth. In `JSON.generate`, the JSON_Generator_State is on the stack and discarded anyway. In `JSON::State#generate_new`, we copy the struct to avoid mutating the original one.
1 parent 29d235d commit 61f6830

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

ext/json/ext/generator/generator.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,7 +1474,8 @@ static VALUE generate_json_try(VALUE d)
14741474
return fbuffer_finalize(data->buffer);
14751475
}
14761476

1477-
static VALUE generate_json_ensure(VALUE d)
1477+
// Preserves the deprecated behavior of State#depth being set.
1478+
static VALUE generate_json_ensure_deprecated(VALUE d)
14781479
{
14791480
struct generate_json_data *data = (struct generate_json_data *)d;
14801481
fbuffer_free(data->buffer);
@@ -1483,6 +1484,14 @@ static VALUE generate_json_ensure(VALUE d)
14831484
return Qundef;
14841485
}
14851486

1487+
static VALUE generate_json_ensure(VALUE d)
1488+
{
1489+
struct generate_json_data *data = (struct generate_json_data *)d;
1490+
fbuffer_free(data->buffer);
1491+
1492+
return Qundef;
1493+
}
1494+
14861495
static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func func, VALUE io)
14871496
{
14881497
GET_STATE(self);
@@ -1501,7 +1510,7 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func func,
15011510
.obj = obj,
15021511
.func = func
15031512
};
1504-
return rb_ensure(generate_json_try, (VALUE)&data, generate_json_ensure, (VALUE)&data);
1513+
return rb_ensure(generate_json_try, (VALUE)&data, generate_json_ensure_deprecated, (VALUE)&data);
15051514
}
15061515

15071516
/* call-seq:

0 commit comments

Comments
 (0)