@@ -968,14 +968,16 @@ static void vstate_spill(struct generate_json_data *data)
968968 RB_OBJ_WRITTEN (vstate , Qundef , state -> as_json );
969969}
970970
971- static inline VALUE vstate_get (struct generate_json_data * data )
971+ static inline VALUE json_call_to_json (struct generate_json_data * data , VALUE obj )
972972{
973973 if (RB_UNLIKELY (!data -> vstate )) {
974974 vstate_spill (data );
975975 }
976976 GET_STATE (data -> vstate );
977977 state -> depth = data -> depth ;
978- return data -> vstate ;
978+ VALUE tmp = rb_funcall (obj , i_to_json , 1 , data -> vstate );
979+ // no need to restore state->depth, vstate is just a temporary State
980+ return tmp ;
979981}
980982
981983static VALUE
@@ -1293,9 +1295,7 @@ static void generate_json_fallback(FBuffer *buffer, struct generate_json_data *d
12931295{
12941296 VALUE tmp ;
12951297 if (rb_respond_to (obj , i_to_json )) {
1296- tmp = rb_funcall (obj , i_to_json , 1 , vstate_get (data ));
1297- GET_STATE (data -> vstate );
1298- data -> depth = state -> depth ;
1298+ tmp = json_call_to_json (data , obj );
12991299 Check_Type (tmp , T_STRING );
13001300 fbuffer_append_str (buffer , tmp );
13011301 } else {
@@ -1477,16 +1477,6 @@ static VALUE generate_json_try(VALUE d)
14771477 return fbuffer_finalize (data -> buffer );
14781478}
14791479
1480- // Preserves the deprecated behavior of State#depth being set.
1481- static VALUE generate_json_ensure_deprecated (VALUE d )
1482- {
1483- struct generate_json_data * data = (struct generate_json_data * )d ;
1484- fbuffer_free (data -> buffer );
1485- data -> state -> depth = data -> depth ;
1486-
1487- return Qundef ;
1488- }
1489-
14901480static VALUE generate_json_ensure (VALUE d )
14911481{
14921482 struct generate_json_data * data = (struct generate_json_data * )d ;
@@ -1507,13 +1497,13 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func func,
15071497
15081498 struct generate_json_data data = {
15091499 .buffer = & buffer ,
1510- .vstate = self ,
1500+ .vstate = Qfalse , // don't use self as it may be frozen and its depth is mutated when calling to_json
15111501 .state = state ,
15121502 .depth = state -> depth ,
15131503 .obj = obj ,
15141504 .func = func
15151505 };
1516- return rb_ensure (generate_json_try , (VALUE )& data , generate_json_ensure_deprecated , (VALUE )& data );
1506+ return rb_ensure (generate_json_try , (VALUE )& data , generate_json_ensure , (VALUE )& data );
15171507}
15181508
15191509/* call-seq:
@@ -1532,31 +1522,6 @@ static VALUE cState_generate(int argc, VALUE *argv, VALUE self)
15321522 return cState_partial_generate (self , obj , generate_json , io );
15331523}
15341524
1535- static VALUE cState_generate_new (int argc , VALUE * argv , VALUE self )
1536- {
1537- rb_check_arity (argc , 1 , 2 );
1538- VALUE obj = argv [0 ];
1539- VALUE io = argc > 1 ? argv [1 ] : Qnil ;
1540-
1541- GET_STATE (self );
1542-
1543- char stack_buffer [FBUFFER_STACK_SIZE ];
1544- FBuffer buffer = {
1545- .io = RTEST (io ) ? io : Qfalse ,
1546- };
1547- fbuffer_stack_init (& buffer , state -> buffer_initial_length , stack_buffer , FBUFFER_STACK_SIZE );
1548-
1549- struct generate_json_data data = {
1550- .buffer = & buffer ,
1551- .vstate = Qfalse ,
1552- .state = state ,
1553- .depth = state -> depth ,
1554- .obj = obj ,
1555- .func = generate_json
1556- };
1557- return rb_ensure (generate_json_try , (VALUE )& data , generate_json_ensure , (VALUE )& data );
1558- }
1559-
15601525static VALUE cState_initialize (int argc , VALUE * argv , VALUE self )
15611526{
15621527 rb_warn ("The json gem extension was loaded with the stdlib ruby code. You should upgrade rubygems with `gem update --system`" );
@@ -2145,7 +2110,6 @@ void Init_generator(void)
21452110 rb_define_method (cState , "buffer_initial_length" , cState_buffer_initial_length , 0 );
21462111 rb_define_method (cState , "buffer_initial_length=" , cState_buffer_initial_length_set , 1 );
21472112 rb_define_method (cState , "generate" , cState_generate , -1 );
2148- rb_define_method (cState , "generate_new" , cState_generate_new , -1 ); // :nodoc:
21492113
21502114 rb_define_private_method (cState , "allow_duplicate_key?" , cState_allow_duplicate_key_p , 0 );
21512115
0 commit comments