@@ -45,7 +45,7 @@ static VALUE sym_indent, sym_space, sym_space_before, sym_object_nl, sym_array_n
45
45
46
46
struct generate_json_data ;
47
47
48
- typedef void (* generator_func )(FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
48
+ typedef void (* generator_func )(FBuffer * buffer , struct generate_json_data * data , VALUE obj );
49
49
50
50
struct generate_json_data {
51
51
FBuffer * buffer ;
@@ -57,20 +57,20 @@ struct generate_json_data {
57
57
58
58
static VALUE cState_from_state_s (VALUE self , VALUE opts );
59
59
static VALUE cState_partial_generate (VALUE self , VALUE obj , generator_func , VALUE io );
60
- static void generate_json (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
61
- static void generate_json_object (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
62
- static void generate_json_array (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
63
- static void generate_json_string (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
64
- static void generate_json_null (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
65
- static void generate_json_false (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
66
- static void generate_json_true (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
60
+ static void generate_json (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
61
+ static void generate_json_object (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
62
+ static void generate_json_array (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
63
+ static void generate_json_string (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
64
+ static void generate_json_null (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
65
+ static void generate_json_false (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
66
+ static void generate_json_true (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
67
67
#ifdef RUBY_INTEGER_UNIFICATION
68
- static void generate_json_integer (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
68
+ static void generate_json_integer (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
69
69
#endif
70
- static void generate_json_fixnum (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
71
- static void generate_json_bignum (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
72
- static void generate_json_float (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
73
- static void generate_json_fragment (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj );
70
+ static void generate_json_fixnum (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
71
+ static void generate_json_bignum (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
72
+ static void generate_json_float (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
73
+ static void generate_json_fragment (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
74
74
75
75
static int usascii_encindex , utf8_encindex , binary_encindex ;
76
76
@@ -802,12 +802,12 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
802
802
int j ;
803
803
804
804
if (arg -> iter > 0 ) fbuffer_append_char (buffer , ',' );
805
- if (RB_UNLIKELY (state -> object_nl )) {
806
- fbuffer_append_str (buffer , state -> object_nl );
805
+ if (RB_UNLIKELY (data -> state -> object_nl )) {
806
+ fbuffer_append_str (buffer , data -> state -> object_nl );
807
807
}
808
- if (RB_UNLIKELY (state -> indent )) {
808
+ if (RB_UNLIKELY (data -> state -> indent )) {
809
809
for (j = 0 ; j < depth ; j ++ ) {
810
- fbuffer_append_str (buffer , state -> indent );
810
+ fbuffer_append_str (buffer , data -> state -> indent );
811
811
}
812
812
}
813
813
@@ -829,36 +829,37 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
829
829
}
830
830
831
831
if (RB_LIKELY (RBASIC_CLASS (key_to_s ) == rb_cString )) {
832
- generate_json_string (buffer , data , state , key_to_s );
832
+ generate_json_string (buffer , data , key_to_s );
833
833
} else {
834
- generate_json (buffer , data , state , key_to_s );
834
+ generate_json (buffer , data , key_to_s );
835
835
}
836
- if (RB_UNLIKELY (state -> space_before )) fbuffer_append_str (buffer , state -> space_before );
836
+ if (RB_UNLIKELY (state -> space_before )) fbuffer_append_str (buffer , data -> state -> space_before );
837
837
fbuffer_append_char (buffer , ':' );
838
- if (RB_UNLIKELY (state -> space )) fbuffer_append_str (buffer , state -> space );
839
- generate_json (buffer , data , state , val );
838
+ if (RB_UNLIKELY (state -> space )) fbuffer_append_str (buffer , data -> state -> space );
839
+ generate_json (buffer , data , val );
840
840
841
841
arg -> iter ++ ;
842
842
return ST_CONTINUE ;
843
843
}
844
844
845
- static inline long increase_depth (JSON_Generator_State * state )
845
+ static inline long increase_depth (struct generate_json_data * data )
846
846
{
847
+ JSON_Generator_State * state = data -> state ;
847
848
long depth = ++ state -> depth ;
848
849
if (RB_UNLIKELY (depth > state -> max_nesting && state -> max_nesting )) {
849
850
rb_raise (eNestingError , "nesting of %ld is too deep" , -- state -> depth );
850
851
}
851
852
return depth ;
852
853
}
853
854
854
- static void generate_json_object (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
855
+ static void generate_json_object (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
855
856
{
856
857
int j ;
857
- long depth = increase_depth (state );
858
+ long depth = increase_depth (data );
858
859
859
860
if (RHASH_SIZE (obj ) == 0 ) {
860
861
fbuffer_append (buffer , "{}" , 2 );
861
- -- state -> depth ;
862
+ -- data -> state -> depth ;
862
863
return ;
863
864
}
864
865
@@ -870,49 +871,49 @@ static void generate_json_object(FBuffer *buffer, struct generate_json_data *dat
870
871
};
871
872
rb_hash_foreach (obj , json_object_i , (VALUE )& arg );
872
873
873
- depth = -- state -> depth ;
874
- if (RB_UNLIKELY (state -> object_nl )) {
875
- fbuffer_append_str (buffer , state -> object_nl );
876
- if (RB_UNLIKELY (state -> indent )) {
874
+ depth = -- data -> state -> depth ;
875
+ if (RB_UNLIKELY (data -> state -> object_nl )) {
876
+ fbuffer_append_str (buffer , data -> state -> object_nl );
877
+ if (RB_UNLIKELY (data -> state -> indent )) {
877
878
for (j = 0 ; j < depth ; j ++ ) {
878
- fbuffer_append_str (buffer , state -> indent );
879
+ fbuffer_append_str (buffer , data -> state -> indent );
879
880
}
880
881
}
881
882
}
882
883
fbuffer_append_char (buffer , '}' );
883
884
}
884
885
885
- static void generate_json_array (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
886
+ static void generate_json_array (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
886
887
{
887
888
int i , j ;
888
- long depth = increase_depth (state );
889
+ long depth = increase_depth (data );
889
890
890
891
if (RARRAY_LEN (obj ) == 0 ) {
891
892
fbuffer_append (buffer , "[]" , 2 );
892
- -- state -> depth ;
893
+ -- data -> state -> depth ;
893
894
return ;
894
895
}
895
896
896
897
fbuffer_append_char (buffer , '[' );
897
- if (RB_UNLIKELY (state -> array_nl )) fbuffer_append_str (buffer , state -> array_nl );
898
+ if (RB_UNLIKELY (data -> state -> array_nl )) fbuffer_append_str (buffer , data -> state -> array_nl );
898
899
for (i = 0 ; i < RARRAY_LEN (obj ); i ++ ) {
899
900
if (i > 0 ) {
900
901
fbuffer_append_char (buffer , ',' );
901
- if (RB_UNLIKELY (state -> array_nl )) fbuffer_append_str (buffer , state -> array_nl );
902
+ if (RB_UNLIKELY (data -> state -> array_nl )) fbuffer_append_str (buffer , data -> state -> array_nl );
902
903
}
903
- if (RB_UNLIKELY (state -> indent )) {
904
+ if (RB_UNLIKELY (data -> state -> indent )) {
904
905
for (j = 0 ; j < depth ; j ++ ) {
905
- fbuffer_append_str (buffer , state -> indent );
906
+ fbuffer_append_str (buffer , data -> state -> indent );
906
907
}
907
908
}
908
- generate_json (buffer , data , state , RARRAY_AREF (obj , i ));
909
+ generate_json (buffer , data , RARRAY_AREF (obj , i ));
909
910
}
910
- state -> depth = -- depth ;
911
- if (RB_UNLIKELY (state -> array_nl )) {
912
- fbuffer_append_str (buffer , state -> array_nl );
913
- if (RB_UNLIKELY (state -> indent )) {
911
+ data -> state -> depth = -- depth ;
912
+ if (RB_UNLIKELY (data -> state -> array_nl )) {
913
+ fbuffer_append_str (buffer , data -> state -> array_nl );
914
+ if (RB_UNLIKELY (data -> state -> indent )) {
914
915
for (j = 0 ; j < depth ; j ++ ) {
915
- fbuffer_append_str (buffer , state -> indent );
916
+ fbuffer_append_str (buffer , data -> state -> indent );
916
917
}
917
918
}
918
919
}
@@ -961,7 +962,7 @@ static inline VALUE ensure_valid_encoding(VALUE str)
961
962
return str ;
962
963
}
963
964
964
- static void generate_json_string (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
965
+ static void generate_json_string (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
965
966
{
966
967
obj = ensure_valid_encoding (obj );
967
968
@@ -977,9 +978,9 @@ static void generate_json_string(FBuffer *buffer, struct generate_json_data *dat
977
978
switch (rb_enc_str_coderange (obj )) {
978
979
case ENC_CODERANGE_7BIT :
979
980
case ENC_CODERANGE_VALID :
980
- if (RB_UNLIKELY (state -> ascii_only )) {
981
- convert_UTF8_to_ASCII_only_JSON (& search , state -> script_safe ? script_safe_escape_table : ascii_only_escape_table );
982
- } else if (RB_UNLIKELY (state -> script_safe )) {
981
+ if (RB_UNLIKELY (data -> state -> ascii_only )) {
982
+ convert_UTF8_to_ASCII_only_JSON (& search , data -> state -> script_safe ? script_safe_escape_table : ascii_only_escape_table );
983
+ } else if (RB_UNLIKELY (data -> state -> script_safe )) {
983
984
convert_UTF8_to_script_safe_JSON (& search );
984
985
} else {
985
986
convert_UTF8_to_JSON (& search );
@@ -992,7 +993,7 @@ static void generate_json_string(FBuffer *buffer, struct generate_json_data *dat
992
993
fbuffer_append_char (buffer , '"' );
993
994
}
994
995
995
- static void generate_json_fallback (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
996
+ static void generate_json_fallback (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
996
997
{
997
998
VALUE tmp ;
998
999
if (rb_respond_to (obj , i_to_json )) {
@@ -1002,68 +1003,68 @@ static void generate_json_fallback(FBuffer *buffer, struct generate_json_data *d
1002
1003
} else {
1003
1004
tmp = rb_funcall (obj , i_to_s , 0 );
1004
1005
Check_Type (tmp , T_STRING );
1005
- generate_json_string (buffer , data , state , tmp );
1006
+ generate_json_string (buffer , data , tmp );
1006
1007
}
1007
1008
}
1008
1009
1009
- static inline void generate_json_symbol (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
1010
+ static inline void generate_json_symbol (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
1010
1011
{
1011
- if (state -> strict ) {
1012
- generate_json_string (buffer , data , state , rb_sym2str (obj ));
1012
+ if (data -> state -> strict ) {
1013
+ generate_json_string (buffer , data , rb_sym2str (obj ));
1013
1014
} else {
1014
- generate_json_fallback (buffer , data , state , obj );
1015
+ generate_json_fallback (buffer , data , obj );
1015
1016
}
1016
1017
}
1017
1018
1018
- static void generate_json_null (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
1019
+ static void generate_json_null (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
1019
1020
{
1020
1021
fbuffer_append (buffer , "null" , 4 );
1021
1022
}
1022
1023
1023
- static void generate_json_false (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
1024
+ static void generate_json_false (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
1024
1025
{
1025
1026
fbuffer_append (buffer , "false" , 5 );
1026
1027
}
1027
1028
1028
- static void generate_json_true (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
1029
+ static void generate_json_true (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
1029
1030
{
1030
1031
fbuffer_append (buffer , "true" , 4 );
1031
1032
}
1032
1033
1033
- static void generate_json_fixnum (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
1034
+ static void generate_json_fixnum (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
1034
1035
{
1035
1036
fbuffer_append_long (buffer , FIX2LONG (obj ));
1036
1037
}
1037
1038
1038
- static void generate_json_bignum (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
1039
+ static void generate_json_bignum (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
1039
1040
{
1040
1041
VALUE tmp = rb_funcall (obj , i_to_s , 0 );
1041
1042
fbuffer_append_str (buffer , tmp );
1042
1043
}
1043
1044
1044
1045
#ifdef RUBY_INTEGER_UNIFICATION
1045
- static void generate_json_integer (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
1046
+ static void generate_json_integer (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
1046
1047
{
1047
1048
if (FIXNUM_P (obj ))
1048
- generate_json_fixnum (buffer , data , state , obj );
1049
+ generate_json_fixnum (buffer , data , obj );
1049
1050
else
1050
- generate_json_bignum (buffer , data , state , obj );
1051
+ generate_json_bignum (buffer , data , obj );
1051
1052
}
1052
1053
#endif
1053
1054
1054
- static void generate_json_float (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
1055
+ static void generate_json_float (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
1055
1056
{
1056
1057
double value = RFLOAT_VALUE (obj );
1057
- char allow_nan = state -> allow_nan ;
1058
+ char allow_nan = data -> state -> allow_nan ;
1058
1059
if (isinf (value ) || isnan (value )) {
1059
1060
/* for NaN and Infinity values we either raise an error or rely on Float#to_s. */
1060
1061
if (!allow_nan ) {
1061
- if (state -> strict && state -> as_json ) {
1062
- VALUE casted_obj = rb_proc_call_with_block (state -> as_json , 1 , & obj , Qnil );
1062
+ if (data -> state -> strict && data -> state -> as_json ) {
1063
+ VALUE casted_obj = rb_proc_call_with_block (data -> state -> as_json , 1 , & obj , Qnil );
1063
1064
if (casted_obj != obj ) {
1064
- increase_depth (state );
1065
- generate_json (buffer , data , state , casted_obj );
1066
- state -> depth -- ;
1065
+ increase_depth (data );
1066
+ generate_json (buffer , data , casted_obj );
1067
+ data -> state -> depth -- ;
1067
1068
return ;
1068
1069
}
1069
1070
}
@@ -1089,74 +1090,74 @@ static void generate_json_float(FBuffer *buffer, struct generate_json_data *data
1089
1090
buffer -> len += len ;
1090
1091
}
1091
1092
1092
- static void generate_json_fragment (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
1093
+ static void generate_json_fragment (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
1093
1094
{
1094
1095
VALUE fragment = RSTRUCT_GET (obj , 0 );
1095
1096
Check_Type (fragment , T_STRING );
1096
1097
fbuffer_append_str (buffer , fragment );
1097
1098
}
1098
1099
1099
- static void generate_json (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
1100
+ static void generate_json (FBuffer * buffer , struct generate_json_data * data , VALUE obj )
1100
1101
{
1101
1102
bool as_json_called = false;
1102
1103
start :
1103
1104
if (obj == Qnil ) {
1104
- generate_json_null (buffer , data , state , obj );
1105
+ generate_json_null (buffer , data , obj );
1105
1106
} else if (obj == Qfalse ) {
1106
- generate_json_false (buffer , data , state , obj );
1107
+ generate_json_false (buffer , data , obj );
1107
1108
} else if (obj == Qtrue ) {
1108
- generate_json_true (buffer , data , state , obj );
1109
+ generate_json_true (buffer , data , obj );
1109
1110
} else if (RB_SPECIAL_CONST_P (obj )) {
1110
1111
if (RB_FIXNUM_P (obj )) {
1111
- generate_json_fixnum (buffer , data , state , obj );
1112
+ generate_json_fixnum (buffer , data , obj );
1112
1113
} else if (RB_FLONUM_P (obj )) {
1113
- generate_json_float (buffer , data , state , obj );
1114
+ generate_json_float (buffer , data , obj );
1114
1115
} else if (RB_STATIC_SYM_P (obj )) {
1115
- generate_json_symbol (buffer , data , state , obj );
1116
+ generate_json_symbol (buffer , data , obj );
1116
1117
} else {
1117
1118
goto general ;
1118
1119
}
1119
1120
} else {
1120
1121
VALUE klass = RBASIC_CLASS (obj );
1121
1122
switch (RB_BUILTIN_TYPE (obj )) {
1122
1123
case T_BIGNUM :
1123
- generate_json_bignum (buffer , data , state , obj );
1124
+ generate_json_bignum (buffer , data , obj );
1124
1125
break ;
1125
1126
case T_HASH :
1126
1127
if (klass != rb_cHash ) goto general ;
1127
- generate_json_object (buffer , data , state , obj );
1128
+ generate_json_object (buffer , data , obj );
1128
1129
break ;
1129
1130
case T_ARRAY :
1130
1131
if (klass != rb_cArray ) goto general ;
1131
- generate_json_array (buffer , data , state , obj );
1132
+ generate_json_array (buffer , data , obj );
1132
1133
break ;
1133
1134
case T_STRING :
1134
1135
if (klass != rb_cString ) goto general ;
1135
- generate_json_string (buffer , data , state , obj );
1136
+ generate_json_string (buffer , data , obj );
1136
1137
break ;
1137
1138
case T_SYMBOL :
1138
- generate_json_symbol (buffer , data , state , obj );
1139
+ generate_json_symbol (buffer , data , obj );
1139
1140
break ;
1140
1141
case T_FLOAT :
1141
1142
if (klass != rb_cFloat ) goto general ;
1142
- generate_json_float (buffer , data , state , obj );
1143
+ generate_json_float (buffer , data , obj );
1143
1144
break ;
1144
1145
case T_STRUCT :
1145
1146
if (klass != cFragment ) goto general ;
1146
- generate_json_fragment (buffer , data , state , obj );
1147
+ generate_json_fragment (buffer , data , obj );
1147
1148
break ;
1148
1149
default :
1149
1150
general :
1150
- if (state -> strict ) {
1151
- if (RTEST (state -> as_json ) && !as_json_called ) {
1152
- obj = rb_proc_call_with_block (state -> as_json , 1 , & obj , Qnil );
1151
+ if (data -> state -> strict ) {
1152
+ if (RTEST (data -> state -> as_json ) && !as_json_called ) {
1153
+ obj = rb_proc_call_with_block (data -> state -> as_json , 1 , & obj , Qnil );
1153
1154
as_json_called = true;
1154
1155
goto start ;
1155
1156
} else {
1156
1157
raise_generator_error (obj , "%" PRIsVALUE " not allowed in JSON" , CLASS_OF (obj ));
1157
1158
}
1158
1159
} else {
1159
- generate_json_fallback (buffer , data , state , obj );
1160
+ generate_json_fallback (buffer , data , obj );
1160
1161
}
1161
1162
}
1162
1163
}
@@ -1166,7 +1167,7 @@ static VALUE generate_json_try(VALUE d)
1166
1167
{
1167
1168
struct generate_json_data * data = (struct generate_json_data * )d ;
1168
1169
1169
- data -> func (data -> buffer , data , data -> state , data -> obj );
1170
+ data -> func (data -> buffer , data , data -> obj );
1170
1171
1171
1172
return Qnil ;
1172
1173
}
0 commit comments