@@ -991,6 +991,29 @@ static void generate_json_string(FBuffer *buffer, struct generate_json_data *dat
991991 fbuffer_append_char (buffer , '"' );
992992}
993993
994+ static void generate_json_fallback (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
995+ {
996+ VALUE tmp ;
997+ if (rb_respond_to (obj , i_to_json )) {
998+ tmp = rb_funcall (obj , i_to_json , 1 , vstate_get (data ));
999+ Check_Type (tmp , T_STRING );
1000+ fbuffer_append_str (buffer , tmp );
1001+ } else {
1002+ tmp = rb_funcall (obj , i_to_s , 0 );
1003+ Check_Type (tmp , T_STRING );
1004+ generate_json_string (buffer , data , state , tmp );
1005+ }
1006+ }
1007+
1008+ static inline void generate_json_symbol (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
1009+ {
1010+ if (state -> strict ) {
1011+ generate_json_string (buffer , data , state , rb_sym2str (obj ));
1012+ } else {
1013+ generate_json_fallback (buffer , data , state , obj );
1014+ }
1015+ }
1016+
9941017static void generate_json_null (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
9951018{
9961019 fbuffer_append (buffer , "null" , 4 );
@@ -1057,7 +1080,6 @@ static void generate_json_fragment(FBuffer *buffer, struct generate_json_data *d
10571080
10581081static void generate_json (FBuffer * buffer , struct generate_json_data * data , JSON_Generator_State * state , VALUE obj )
10591082{
1060- VALUE tmp ;
10611083 bool as_json_called = false;
10621084start :
10631085 if (obj == Qnil ) {
@@ -1071,6 +1093,8 @@ static void generate_json(FBuffer *buffer, struct generate_json_data *data, JSON
10711093 generate_json_fixnum (buffer , data , state , obj );
10721094 } else if (RB_FLONUM_P (obj )) {
10731095 generate_json_float (buffer , data , state , obj );
1096+ } else if (RB_STATIC_SYM_P (obj )) {
1097+ generate_json_symbol (buffer , data , state , obj );
10741098 } else {
10751099 goto general ;
10761100 }
@@ -1092,6 +1116,9 @@ static void generate_json(FBuffer *buffer, struct generate_json_data *data, JSON
10921116 if (klass != rb_cString ) goto general ;
10931117 generate_json_string (buffer , data , state , obj );
10941118 break ;
1119+ case T_SYMBOL :
1120+ generate_json_symbol (buffer , data , state , obj );
1121+ break ;
10951122 case T_FLOAT :
10961123 if (klass != rb_cFloat ) goto general ;
10971124 generate_json_float (buffer , data , state , obj );
@@ -1110,14 +1137,8 @@ static void generate_json(FBuffer *buffer, struct generate_json_data *data, JSON
11101137 } else {
11111138 raise_generator_error (obj , "%" PRIsVALUE " not allowed in JSON" , CLASS_OF (obj ));
11121139 }
1113- } else if (rb_respond_to (obj , i_to_json )) {
1114- tmp = rb_funcall (obj , i_to_json , 1 , vstate_get (data ));
1115- Check_Type (tmp , T_STRING );
1116- fbuffer_append_str (buffer , tmp );
11171140 } else {
1118- tmp = rb_funcall (obj , i_to_s , 0 );
1119- Check_Type (tmp , T_STRING );
1120- generate_json_string (buffer , data , state , tmp );
1141+ generate_json_fallback (buffer , data , state , obj );
11211142 }
11221143 }
11231144 }
0 commit comments