@@ -397,7 +397,9 @@ static char *fstrndup(const char *ptr, unsigned long len) {
397
397
*/
398
398
static VALUE mHash_to_json (int argc , VALUE * argv , VALUE self )
399
399
{
400
- GENERATE_JSON (object );
400
+ rb_check_arity (argc , 0 , 1 );
401
+ VALUE Vstate = cState_from_state_s (cState , argc == 1 ? argv [0 ] : Qnil );
402
+ return cState_partial_generate (Vstate , self , generate_json_object );
401
403
}
402
404
403
405
/*
@@ -409,7 +411,9 @@ static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self)
409
411
* produced JSON string output further.
410
412
*/
411
413
static VALUE mArray_to_json (int argc , VALUE * argv , VALUE self ) {
412
- GENERATE_JSON (array );
414
+ rb_check_arity (argc , 0 , 1 );
415
+ VALUE Vstate = cState_from_state_s (cState , argc == 1 ? argv [0 ] : Qnil );
416
+ return cState_partial_generate (Vstate , self , generate_json_array );
413
417
}
414
418
415
419
#ifdef RUBY_INTEGER_UNIFICATION
@@ -420,7 +424,9 @@ static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self) {
420
424
*/
421
425
static VALUE mInteger_to_json (int argc , VALUE * argv , VALUE self )
422
426
{
423
- GENERATE_JSON (integer );
427
+ rb_check_arity (argc , 0 , 1 );
428
+ VALUE Vstate = cState_from_state_s (cState , argc == 1 ? argv [0 ] : Qnil );
429
+ return cState_partial_generate (Vstate , self , generate_json_integer );
424
430
}
425
431
426
432
#else
@@ -431,7 +437,9 @@ static VALUE mInteger_to_json(int argc, VALUE *argv, VALUE self)
431
437
*/
432
438
static VALUE mFixnum_to_json (int argc , VALUE * argv , VALUE self )
433
439
{
434
- GENERATE_JSON (fixnum );
440
+ rb_check_arity (argc , 0 , 1 );
441
+ VALUE Vstate = cState_from_state_s (cState , argc == 1 ? argv [0 ] : Qnil );
442
+ return cState_partial_generate (Vstate , self , generate_json_fixnum );
435
443
}
436
444
437
445
/*
@@ -441,7 +449,9 @@ static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self)
441
449
*/
442
450
static VALUE mBignum_to_json (int argc , VALUE * argv , VALUE self )
443
451
{
444
- GENERATE_JSON (bignum );
452
+ rb_check_arity (argc , 0 , 1 );
453
+ VALUE Vstate = cState_from_state_s (cState , argc == 1 ? argv [0 ] : Qnil );
454
+ return cState_partial_generate (Vstate , self , generate_json_bignum );
445
455
}
446
456
#endif
447
457
@@ -452,7 +462,9 @@ static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self)
452
462
*/
453
463
static VALUE mFloat_to_json (int argc , VALUE * argv , VALUE self )
454
464
{
455
- GENERATE_JSON (float );
465
+ rb_check_arity (argc , 0 , 1 );
466
+ VALUE Vstate = cState_from_state_s (cState , argc == 1 ? argv [0 ] : Qnil );
467
+ return cState_partial_generate (Vstate , self , generate_json_float );
456
468
}
457
469
458
470
/*
@@ -475,7 +487,9 @@ static VALUE mString_included_s(VALUE self, VALUE modul) {
475
487
*/
476
488
static VALUE mString_to_json (int argc , VALUE * argv , VALUE self )
477
489
{
478
- GENERATE_JSON (string );
490
+ rb_check_arity (argc , 0 , 1 );
491
+ VALUE Vstate = cState_from_state_s (cState , argc == 1 ? argv [0 ] : Qnil );
492
+ return cState_partial_generate (Vstate , self , generate_json_string );
479
493
}
480
494
481
495
/*
@@ -530,7 +544,8 @@ static VALUE mString_Extend_json_create(VALUE self, VALUE o)
530
544
*/
531
545
static VALUE mTrueClass_to_json (int argc , VALUE * argv , VALUE self )
532
546
{
533
- GENERATE_JSON (true);
547
+ rb_check_arity (argc , 0 , 1 );
548
+ return rb_utf8_str_new ("true" , 4 );
534
549
}
535
550
536
551
/*
@@ -540,7 +555,8 @@ static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self)
540
555
*/
541
556
static VALUE mFalseClass_to_json (int argc , VALUE * argv , VALUE self )
542
557
{
543
- GENERATE_JSON (false);
558
+ rb_check_arity (argc , 0 , 1 );
559
+ return rb_utf8_str_new ("false" , 5 );
544
560
}
545
561
546
562
/*
@@ -550,7 +566,8 @@ static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self)
550
566
*/
551
567
static VALUE mNilClass_to_json (int argc , VALUE * argv , VALUE self )
552
568
{
553
- GENERATE_JSON (null );
569
+ rb_check_arity (argc , 0 , 1 );
570
+ return rb_utf8_str_new ("null" , 4 );
554
571
}
555
572
556
573
/*
@@ -567,7 +584,7 @@ static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self)
567
584
rb_scan_args (argc , argv , "01" , & state );
568
585
Check_Type (string , T_STRING );
569
586
state = cState_from_state_s (cState , state );
570
- return cState_partial_generate (state , string );
587
+ return cState_partial_generate (state , string , generate_json_string );
571
588
}
572
589
573
590
static void State_free (void * ptr )
@@ -834,6 +851,7 @@ static void generate_json_integer(FBuffer *buffer, VALUE Vstate, JSON_Generator_
834
851
generate_json_bignum (buffer , Vstate , state , obj );
835
852
}
836
853
#endif
854
+
837
855
static void generate_json_float (FBuffer * buffer , VALUE Vstate , JSON_Generator_State * state , VALUE obj )
838
856
{
839
857
double value = RFLOAT_VALUE (obj );
@@ -910,13 +928,14 @@ struct generate_json_data {
910
928
VALUE vstate ;
911
929
JSON_Generator_State * state ;
912
930
VALUE obj ;
931
+ void (* func )(FBuffer * buffer , VALUE Vstate , JSON_Generator_State * state , VALUE obj );
913
932
};
914
933
915
934
static VALUE generate_json_try (VALUE d )
916
935
{
917
936
struct generate_json_data * data = (struct generate_json_data * )d ;
918
937
919
- generate_json (data -> buffer , data -> vstate , data -> state , data -> obj );
938
+ data -> func (data -> buffer , data -> vstate , data -> state , data -> obj );
920
939
921
940
return Qnil ;
922
941
}
@@ -931,7 +950,7 @@ static VALUE generate_json_rescue(VALUE d, VALUE exc)
931
950
return Qundef ;
932
951
}
933
952
934
- static VALUE cState_partial_generate (VALUE self , VALUE obj )
953
+ static VALUE cState_partial_generate (VALUE self , VALUE obj , void ( * func )( FBuffer * buffer , VALUE Vstate , JSON_Generator_State * state , VALUE obj ) )
935
954
{
936
955
GET_STATE (self );
937
956
@@ -942,7 +961,8 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj)
942
961
.buffer = & buffer ,
943
962
.vstate = self ,
944
963
.state = state ,
945
- .obj = obj
964
+ .obj = obj ,
965
+ .func = func
946
966
};
947
967
rb_rescue (generate_json_try , (VALUE )& data , generate_json_rescue , (VALUE )& data );
948
968
@@ -958,7 +978,7 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj)
958
978
*/
959
979
static VALUE cState_generate (VALUE self , VALUE obj )
960
980
{
961
- VALUE result = cState_partial_generate (self , obj );
981
+ VALUE result = cState_partial_generate (self , obj , generate_json );
962
982
GET_STATE (self );
963
983
(void )state ;
964
984
return result ;
0 commit comments