Skip to content

Commit 2cafd12

Browse files
committed
WIP
1 parent b28b968 commit 2cafd12

File tree

1 file changed

+11
-19
lines changed

1 file changed

+11
-19
lines changed

ext/json/ext/generator/generator.c

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -986,16 +986,10 @@ static inline VALUE vstate_get(struct generate_json_data *data)
986986
return data->vstate;
987987
}
988988

989-
enum key_types {
990-
KEY_UNKNOWN,
991-
KEY_SYMBOL,
992-
KEY_STRING,
993-
};
994-
995989
struct hash_foreach_arg {
996990
VALUE hash;
997991
struct generate_json_data *data;
998-
enum key_types keys;
992+
int first_key_type;
999993
bool first;
1000994
};
1001995

@@ -1025,8 +1019,11 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
10251019

10261020
long depth = state->depth;
10271021

1028-
if (RB_UNLIKELY(arg->first)) {
1022+
int key_type = rb_type(key);
1023+
1024+
if (arg->first) {
10291025
arg->first = false;
1026+
arg->first_key_type = key_type;
10301027
}
10311028
else {
10321029
fbuffer_append_char(buffer, ',');
@@ -1043,13 +1040,10 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
10431040
bool as_json_called = false;
10441041

10451042
start:
1046-
switch (rb_type(key)) {
1043+
switch (key_type) {
10471044
case T_STRING:
1048-
if (arg->keys == KEY_UNKNOWN) {
1049-
arg->keys = KEY_STRING;
1050-
}
1051-
else if (RB_UNLIKELY(arg->keys == KEY_SYMBOL)) {
1052-
fprintf(stderr, "mixed keys\n");
1045+
if (RB_UNLIKELY(arg->first_key_type != T_STRING)) {
1046+
fprintf(stderr, "mixed keys (str)\n");
10531047
}
10541048

10551049
if (RB_LIKELY(RBASIC_CLASS(key) == rb_cString)) {
@@ -1059,11 +1053,8 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
10591053
}
10601054
break;
10611055
case T_SYMBOL:
1062-
if (arg->keys == KEY_UNKNOWN) {
1063-
arg->keys = KEY_SYMBOL;
1064-
}
1065-
else if (RB_UNLIKELY(arg->keys == KEY_STRING)) {
1066-
fprintf(stderr, "mixed keys\n");
1056+
if (RB_UNLIKELY(arg->first_key_type != T_SYMBOL)) {
1057+
fprintf(stderr, "mixed keys (sym)\n");
10671058
}
10681059

10691060
key_to_s = rb_sym2str(key);
@@ -1072,6 +1063,7 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
10721063
if (data->state->strict) {
10731064
if (RTEST(data->state->as_json) && !as_json_called) {
10741065
key = rb_proc_call_with_block(data->state->as_json, 1, &key, Qnil);
1066+
key_type = rb_type(key);
10751067
as_json_called = true;
10761068
goto start;
10771069
} else {

0 commit comments

Comments
 (0)