Skip to content

Commit 873b29e

Browse files
etiennebarriebyroot
authored andcommitted
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 5abd434 commit 873b29e

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
@@ -1476,7 +1476,8 @@ static VALUE generate_json_try(VALUE d)
14761476
return fbuffer_finalize(data->buffer);
14771477
}
14781478

1479-
static VALUE generate_json_ensure(VALUE d)
1479+
// Preserves the deprecated behavior of State#depth being set.
1480+
static VALUE generate_json_ensure_deprecated(VALUE d)
14801481
{
14811482
struct generate_json_data *data = (struct generate_json_data *)d;
14821483
fbuffer_free(data->buffer);
@@ -1485,6 +1486,14 @@ static VALUE generate_json_ensure(VALUE d)
14851486
return Qundef;
14861487
}
14871488

1489+
static VALUE generate_json_ensure(VALUE d)
1490+
{
1491+
struct generate_json_data *data = (struct generate_json_data *)d;
1492+
fbuffer_free(data->buffer);
1493+
1494+
return Qundef;
1495+
}
1496+
14881497
static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func func, VALUE io)
14891498
{
14901499
GET_STATE(self);
@@ -1503,7 +1512,7 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func func,
15031512
.obj = obj,
15041513
.func = func
15051514
};
1506-
return rb_ensure(generate_json_try, (VALUE)&data, generate_json_ensure, (VALUE)&data);
1515+
return rb_ensure(generate_json_try, (VALUE)&data, generate_json_ensure_deprecated, (VALUE)&data);
15071516
}
15081517

15091518
/* call-seq:

0 commit comments

Comments
 (0)