json 2.8.1 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES.md +13 -0
- data/ext/json/ext/fbuffer/fbuffer.h +46 -16
- data/ext/json/ext/generator/generator.c +68 -40
- data/ext/json/ext/parser/extconf.rb +0 -1
- data/ext/json/ext/parser/parser.c +198 -267
- data/ext/json/ext/parser/parser.rl +26 -40
- data/lib/json/common.rb +44 -23
- data/lib/json/ext/generator/state.rb +11 -0
- data/lib/json/truffle_ruby/generator.rb +25 -17
- data/lib/json/version.rb +1 -1
- metadata +2 -2
@@ -28,19 +28,6 @@ static const char deprecated_create_additions_warning[] =
|
|
28
28
|
"and will be removed in 3.0, use JSON.unsafe_load or explicitly "
|
29
29
|
"pass `create_additions: true`";
|
30
30
|
|
31
|
-
#ifndef HAVE_RB_GC_MARK_LOCATIONS
|
32
|
-
// For TruffleRuby
|
33
|
-
void rb_gc_mark_locations(const VALUE *start, const VALUE *end)
|
34
|
-
{
|
35
|
-
VALUE *value = start;
|
36
|
-
|
37
|
-
while (value < end) {
|
38
|
-
rb_gc_mark(*value);
|
39
|
-
value++;
|
40
|
-
}
|
41
|
-
}
|
42
|
-
#endif
|
43
|
-
|
44
31
|
#ifndef HAVE_RB_HASH_BULK_INSERT
|
45
32
|
// For TruffleRuby
|
46
33
|
void rb_hash_bulk_insert(long count, const VALUE *pairs, VALUE hash)
|
@@ -266,7 +253,10 @@ static inline void rvalue_stack_pop(rvalue_stack *stack, long count)
|
|
266
253
|
static void rvalue_stack_mark(void *ptr)
|
267
254
|
{
|
268
255
|
rvalue_stack *stack = (rvalue_stack *)ptr;
|
269
|
-
|
256
|
+
long index;
|
257
|
+
for (index = 0; index < stack->head; index++) {
|
258
|
+
rb_gc_mark(stack->ptr[index]);
|
259
|
+
}
|
270
260
|
}
|
271
261
|
|
272
262
|
static void rvalue_stack_free(void *ptr)
|
@@ -394,6 +384,7 @@ typedef struct JSON_ParserStruct {
|
|
394
384
|
VALUE decimal_class;
|
395
385
|
VALUE match_string;
|
396
386
|
FBuffer fbuffer;
|
387
|
+
int in_array;
|
397
388
|
int max_nesting;
|
398
389
|
bool allow_nan;
|
399
390
|
bool allow_trailing_comma;
|
@@ -422,8 +413,7 @@ static const rb_data_type_t JSON_Parser_type;
|
|
422
413
|
static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result);
|
423
414
|
static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
|
424
415
|
static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
|
425
|
-
static char *
|
426
|
-
static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result);
|
416
|
+
static char *JSON_parse_number(JSON_Parser *json, char *p, char *pe, VALUE *result);
|
427
417
|
static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
|
428
418
|
|
429
419
|
|
@@ -449,11 +439,11 @@ static void raise_parse_error(const char *format, const char *start)
|
|
449
439
|
|
450
440
|
|
451
441
|
|
452
|
-
#line
|
442
|
+
#line 465 "parser.rl"
|
453
443
|
|
454
444
|
|
455
445
|
|
456
|
-
#line
|
446
|
+
#line 447 "parser.c"
|
457
447
|
enum {JSON_object_start = 1};
|
458
448
|
enum {JSON_object_first_final = 32};
|
459
449
|
enum {JSON_object_error = 0};
|
@@ -461,7 +451,7 @@ enum {JSON_object_error = 0};
|
|
461
451
|
enum {JSON_object_en_main = 1};
|
462
452
|
|
463
453
|
|
464
|
-
#line
|
454
|
+
#line 505 "parser.rl"
|
465
455
|
|
466
456
|
|
467
457
|
#define PUSH(result) rvalue_stack_push(json->stack, result, &json->stack_handle, &json->stack)
|
@@ -477,14 +467,14 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu
|
|
477
467
|
long stack_head = json->stack->head;
|
478
468
|
|
479
469
|
|
480
|
-
#line
|
470
|
+
#line 471 "parser.c"
|
481
471
|
{
|
482
472
|
cs = JSON_object_start;
|
483
473
|
}
|
484
474
|
|
485
|
-
#line
|
475
|
+
#line 520 "parser.rl"
|
486
476
|
|
487
|
-
#line
|
477
|
+
#line 478 "parser.c"
|
488
478
|
{
|
489
479
|
short _widec;
|
490
480
|
if ( p == pe )
|
@@ -513,7 +503,7 @@ case 2:
|
|
513
503
|
goto st2;
|
514
504
|
goto st0;
|
515
505
|
tr2:
|
516
|
-
#line
|
506
|
+
#line 484 "parser.rl"
|
517
507
|
{
|
518
508
|
char *np;
|
519
509
|
json->parsing_name = true;
|
@@ -529,7 +519,7 @@ st3:
|
|
529
519
|
if ( ++p == pe )
|
530
520
|
goto _test_eof3;
|
531
521
|
case 3:
|
532
|
-
#line
|
522
|
+
#line 523 "parser.c"
|
533
523
|
switch( (*p) ) {
|
534
524
|
case 13: goto st3;
|
535
525
|
case 32: goto st3;
|
@@ -596,7 +586,7 @@ case 8:
|
|
596
586
|
goto st8;
|
597
587
|
goto st0;
|
598
588
|
tr11:
|
599
|
-
#line
|
589
|
+
#line 473 "parser.rl"
|
600
590
|
{
|
601
591
|
char *np = JSON_parse_value(json, p, pe, result, current_nesting);
|
602
592
|
if (np == NULL) {
|
@@ -610,20 +600,20 @@ st9:
|
|
610
600
|
if ( ++p == pe )
|
611
601
|
goto _test_eof9;
|
612
602
|
case 9:
|
613
|
-
#line
|
603
|
+
#line 604 "parser.c"
|
614
604
|
_widec = (*p);
|
615
605
|
if ( (*p) < 13 ) {
|
616
606
|
if ( (*p) > 9 ) {
|
617
607
|
if ( 10 <= (*p) && (*p) <= 10 ) {
|
618
608
|
_widec = (short)(128 + ((*p) - -128));
|
619
609
|
if (
|
620
|
-
#line
|
610
|
+
#line 482 "parser.rl"
|
621
611
|
json->allow_trailing_comma ) _widec += 256;
|
622
612
|
}
|
623
613
|
} else if ( (*p) >= 9 ) {
|
624
614
|
_widec = (short)(128 + ((*p) - -128));
|
625
615
|
if (
|
626
|
-
#line
|
616
|
+
#line 482 "parser.rl"
|
627
617
|
json->allow_trailing_comma ) _widec += 256;
|
628
618
|
}
|
629
619
|
} else if ( (*p) > 13 ) {
|
@@ -631,26 +621,26 @@ case 9:
|
|
631
621
|
if ( 32 <= (*p) && (*p) <= 32 ) {
|
632
622
|
_widec = (short)(128 + ((*p) - -128));
|
633
623
|
if (
|
634
|
-
#line
|
624
|
+
#line 482 "parser.rl"
|
635
625
|
json->allow_trailing_comma ) _widec += 256;
|
636
626
|
}
|
637
627
|
} else if ( (*p) > 44 ) {
|
638
628
|
if ( 47 <= (*p) && (*p) <= 47 ) {
|
639
629
|
_widec = (short)(128 + ((*p) - -128));
|
640
630
|
if (
|
641
|
-
#line
|
631
|
+
#line 482 "parser.rl"
|
642
632
|
json->allow_trailing_comma ) _widec += 256;
|
643
633
|
}
|
644
634
|
} else {
|
645
635
|
_widec = (short)(128 + ((*p) - -128));
|
646
636
|
if (
|
647
|
-
#line
|
637
|
+
#line 482 "parser.rl"
|
648
638
|
json->allow_trailing_comma ) _widec += 256;
|
649
639
|
}
|
650
640
|
} else {
|
651
641
|
_widec = (short)(128 + ((*p) - -128));
|
652
642
|
if (
|
653
|
-
#line
|
643
|
+
#line 482 "parser.rl"
|
654
644
|
json->allow_trailing_comma ) _widec += 256;
|
655
645
|
}
|
656
646
|
switch( _widec ) {
|
@@ -671,14 +661,14 @@ case 9:
|
|
671
661
|
goto st10;
|
672
662
|
goto st0;
|
673
663
|
tr4:
|
674
|
-
#line
|
664
|
+
#line 495 "parser.rl"
|
675
665
|
{ p--; {p++; cs = 32; goto _out;} }
|
676
666
|
goto st32;
|
677
667
|
st32:
|
678
668
|
if ( ++p == pe )
|
679
669
|
goto _test_eof32;
|
680
670
|
case 32:
|
681
|
-
#line
|
671
|
+
#line 672 "parser.c"
|
682
672
|
goto st0;
|
683
673
|
st10:
|
684
674
|
if ( ++p == pe )
|
@@ -780,13 +770,13 @@ case 20:
|
|
780
770
|
if ( 47 <= (*p) && (*p) <= 47 ) {
|
781
771
|
_widec = (short)(128 + ((*p) - -128));
|
782
772
|
if (
|
783
|
-
#line
|
773
|
+
#line 482 "parser.rl"
|
784
774
|
json->allow_trailing_comma ) _widec += 256;
|
785
775
|
}
|
786
776
|
} else if ( (*p) >= 42 ) {
|
787
777
|
_widec = (short)(128 + ((*p) - -128));
|
788
778
|
if (
|
789
|
-
#line
|
779
|
+
#line 482 "parser.rl"
|
790
780
|
json->allow_trailing_comma ) _widec += 256;
|
791
781
|
}
|
792
782
|
switch( _widec ) {
|
@@ -805,20 +795,20 @@ case 21:
|
|
805
795
|
if ( (*p) <= 41 ) {
|
806
796
|
_widec = (short)(128 + ((*p) - -128));
|
807
797
|
if (
|
808
|
-
#line
|
798
|
+
#line 482 "parser.rl"
|
809
799
|
json->allow_trailing_comma ) _widec += 256;
|
810
800
|
}
|
811
801
|
} else if ( (*p) > 42 ) {
|
812
802
|
if ( 43 <= (*p) )
|
813
803
|
{ _widec = (short)(128 + ((*p) - -128));
|
814
804
|
if (
|
815
|
-
#line
|
805
|
+
#line 482 "parser.rl"
|
816
806
|
json->allow_trailing_comma ) _widec += 256;
|
817
807
|
}
|
818
808
|
} else {
|
819
809
|
_widec = (short)(128 + ((*p) - -128));
|
820
810
|
if (
|
821
|
-
#line
|
811
|
+
#line 482 "parser.rl"
|
822
812
|
json->allow_trailing_comma ) _widec += 256;
|
823
813
|
}
|
824
814
|
switch( _widec ) {
|
@@ -841,13 +831,13 @@ case 22:
|
|
841
831
|
if ( 42 <= (*p) && (*p) <= 42 ) {
|
842
832
|
_widec = (short)(128 + ((*p) - -128));
|
843
833
|
if (
|
844
|
-
#line
|
834
|
+
#line 482 "parser.rl"
|
845
835
|
json->allow_trailing_comma ) _widec += 256;
|
846
836
|
}
|
847
837
|
} else {
|
848
838
|
_widec = (short)(128 + ((*p) - -128));
|
849
839
|
if (
|
850
|
-
#line
|
840
|
+
#line 482 "parser.rl"
|
851
841
|
json->allow_trailing_comma ) _widec += 256;
|
852
842
|
}
|
853
843
|
} else if ( (*p) > 46 ) {
|
@@ -855,19 +845,19 @@ case 22:
|
|
855
845
|
if ( 48 <= (*p) )
|
856
846
|
{ _widec = (short)(128 + ((*p) - -128));
|
857
847
|
if (
|
858
|
-
#line
|
848
|
+
#line 482 "parser.rl"
|
859
849
|
json->allow_trailing_comma ) _widec += 256;
|
860
850
|
}
|
861
851
|
} else if ( (*p) >= 47 ) {
|
862
852
|
_widec = (short)(128 + ((*p) - -128));
|
863
853
|
if (
|
864
|
-
#line
|
854
|
+
#line 482 "parser.rl"
|
865
855
|
json->allow_trailing_comma ) _widec += 256;
|
866
856
|
}
|
867
857
|
} else {
|
868
858
|
_widec = (short)(128 + ((*p) - -128));
|
869
859
|
if (
|
870
|
-
#line
|
860
|
+
#line 482 "parser.rl"
|
871
861
|
json->allow_trailing_comma ) _widec += 256;
|
872
862
|
}
|
873
863
|
switch( _widec ) {
|
@@ -891,20 +881,20 @@ case 23:
|
|
891
881
|
if ( (*p) <= 9 ) {
|
892
882
|
_widec = (short)(128 + ((*p) - -128));
|
893
883
|
if (
|
894
|
-
#line
|
884
|
+
#line 482 "parser.rl"
|
895
885
|
json->allow_trailing_comma ) _widec += 256;
|
896
886
|
}
|
897
887
|
} else if ( (*p) > 10 ) {
|
898
888
|
if ( 11 <= (*p) )
|
899
889
|
{ _widec = (short)(128 + ((*p) - -128));
|
900
890
|
if (
|
901
|
-
#line
|
891
|
+
#line 482 "parser.rl"
|
902
892
|
json->allow_trailing_comma ) _widec += 256;
|
903
893
|
}
|
904
894
|
} else {
|
905
895
|
_widec = (short)(128 + ((*p) - -128));
|
906
896
|
if (
|
907
|
-
#line
|
897
|
+
#line 482 "parser.rl"
|
908
898
|
json->allow_trailing_comma ) _widec += 256;
|
909
899
|
}
|
910
900
|
switch( _widec ) {
|
@@ -1018,7 +1008,7 @@ case 31:
|
|
1018
1008
|
_out: {}
|
1019
1009
|
}
|
1020
1010
|
|
1021
|
-
#line
|
1011
|
+
#line 521 "parser.rl"
|
1022
1012
|
|
1023
1013
|
if (cs >= JSON_object_first_final) {
|
1024
1014
|
long count = json->stack->head - stack_head;
|
@@ -1069,7 +1059,7 @@ case 31:
|
|
1069
1059
|
}
|
1070
1060
|
|
1071
1061
|
|
1072
|
-
#line
|
1062
|
+
#line 1063 "parser.c"
|
1073
1063
|
enum {JSON_value_start = 1};
|
1074
1064
|
enum {JSON_value_first_final = 29};
|
1075
1065
|
enum {JSON_value_error = 0};
|
@@ -1077,7 +1067,7 @@ enum {JSON_value_error = 0};
|
|
1077
1067
|
enum {JSON_value_en_main = 1};
|
1078
1068
|
|
1079
1069
|
|
1080
|
-
#line
|
1070
|
+
#line 654 "parser.rl"
|
1081
1071
|
|
1082
1072
|
|
1083
1073
|
static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
|
@@ -1085,14 +1075,14 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
1085
1075
|
int cs = EVIL;
|
1086
1076
|
|
1087
1077
|
|
1088
|
-
#line
|
1078
|
+
#line 1079 "parser.c"
|
1089
1079
|
{
|
1090
1080
|
cs = JSON_value_start;
|
1091
1081
|
}
|
1092
1082
|
|
1093
|
-
#line
|
1083
|
+
#line 661 "parser.rl"
|
1094
1084
|
|
1095
|
-
#line
|
1085
|
+
#line 1086 "parser.c"
|
1096
1086
|
{
|
1097
1087
|
if ( p == pe )
|
1098
1088
|
goto _test_eof;
|
@@ -1126,7 +1116,7 @@ st0:
|
|
1126
1116
|
cs = 0;
|
1127
1117
|
goto _out;
|
1128
1118
|
tr2:
|
1129
|
-
#line
|
1119
|
+
#line 599 "parser.rl"
|
1130
1120
|
{
|
1131
1121
|
char *np = JSON_parse_string(json, p, pe, result);
|
1132
1122
|
if (np == NULL) {
|
@@ -1138,7 +1128,7 @@ tr2:
|
|
1138
1128
|
}
|
1139
1129
|
goto st29;
|
1140
1130
|
tr3:
|
1141
|
-
#line
|
1131
|
+
#line 609 "parser.rl"
|
1142
1132
|
{
|
1143
1133
|
char *np;
|
1144
1134
|
if(pe > p + 8 && !strncmp(MinusInfinity, p, 9)) {
|
@@ -1150,11 +1140,7 @@ tr3:
|
|
1150
1140
|
raise_parse_error("unexpected token at '%s'", p);
|
1151
1141
|
}
|
1152
1142
|
}
|
1153
|
-
np =
|
1154
|
-
if (np != NULL) {
|
1155
|
-
{p = (( np))-1;}
|
1156
|
-
}
|
1157
|
-
np = JSON_parse_integer(json, p, pe, result);
|
1143
|
+
np = JSON_parse_number(json, p, pe, result);
|
1158
1144
|
if (np != NULL) {
|
1159
1145
|
{p = (( np))-1;}
|
1160
1146
|
}
|
@@ -1162,15 +1148,17 @@ tr3:
|
|
1162
1148
|
}
|
1163
1149
|
goto st29;
|
1164
1150
|
tr7:
|
1165
|
-
#line
|
1151
|
+
#line 627 "parser.rl"
|
1166
1152
|
{
|
1167
1153
|
char *np;
|
1154
|
+
json->in_array++;
|
1168
1155
|
np = JSON_parse_array(json, p, pe, result, current_nesting + 1);
|
1156
|
+
json->in_array--;
|
1169
1157
|
if (np == NULL) { p--; {p++; cs = 29; goto _out;} } else {p = (( np))-1;}
|
1170
1158
|
}
|
1171
1159
|
goto st29;
|
1172
1160
|
tr11:
|
1173
|
-
#line
|
1161
|
+
#line 635 "parser.rl"
|
1174
1162
|
{
|
1175
1163
|
char *np;
|
1176
1164
|
np = JSON_parse_object(json, p, pe, result, current_nesting + 1);
|
@@ -1178,7 +1166,7 @@ tr11:
|
|
1178
1166
|
}
|
1179
1167
|
goto st29;
|
1180
1168
|
tr25:
|
1181
|
-
#line
|
1169
|
+
#line 592 "parser.rl"
|
1182
1170
|
{
|
1183
1171
|
if (json->allow_nan) {
|
1184
1172
|
*result = CInfinity;
|
@@ -1188,7 +1176,7 @@ tr25:
|
|
1188
1176
|
}
|
1189
1177
|
goto st29;
|
1190
1178
|
tr27:
|
1191
|
-
#line
|
1179
|
+
#line 585 "parser.rl"
|
1192
1180
|
{
|
1193
1181
|
if (json->allow_nan) {
|
1194
1182
|
*result = CNaN;
|
@@ -1198,19 +1186,19 @@ tr27:
|
|
1198
1186
|
}
|
1199
1187
|
goto st29;
|
1200
1188
|
tr31:
|
1201
|
-
#line
|
1189
|
+
#line 579 "parser.rl"
|
1202
1190
|
{
|
1203
1191
|
*result = Qfalse;
|
1204
1192
|
}
|
1205
1193
|
goto st29;
|
1206
1194
|
tr34:
|
1207
|
-
#line
|
1195
|
+
#line 576 "parser.rl"
|
1208
1196
|
{
|
1209
1197
|
*result = Qnil;
|
1210
1198
|
}
|
1211
1199
|
goto st29;
|
1212
1200
|
tr37:
|
1213
|
-
#line
|
1201
|
+
#line 582 "parser.rl"
|
1214
1202
|
{
|
1215
1203
|
*result = Qtrue;
|
1216
1204
|
}
|
@@ -1219,9 +1207,9 @@ st29:
|
|
1219
1207
|
if ( ++p == pe )
|
1220
1208
|
goto _test_eof29;
|
1221
1209
|
case 29:
|
1222
|
-
#line
|
1210
|
+
#line 641 "parser.rl"
|
1223
1211
|
{ p--; {p++; cs = 29; goto _out;} }
|
1224
|
-
#line
|
1212
|
+
#line 1213 "parser.c"
|
1225
1213
|
switch( (*p) ) {
|
1226
1214
|
case 13: goto st29;
|
1227
1215
|
case 32: goto st29;
|
@@ -1462,7 +1450,7 @@ case 28:
|
|
1462
1450
|
_out: {}
|
1463
1451
|
}
|
1464
1452
|
|
1465
|
-
#line
|
1453
|
+
#line 662 "parser.rl"
|
1466
1454
|
|
1467
1455
|
if (json->freeze) {
|
1468
1456
|
OBJ_FREEZE(*result);
|
@@ -1477,7 +1465,7 @@ case 28:
|
|
1477
1465
|
}
|
1478
1466
|
|
1479
1467
|
|
1480
|
-
#line
|
1468
|
+
#line 1469 "parser.c"
|
1481
1469
|
enum {JSON_integer_start = 1};
|
1482
1470
|
enum {JSON_integer_first_final = 3};
|
1483
1471
|
enum {JSON_integer_error = 0};
|
@@ -1485,7 +1473,7 @@ enum {JSON_integer_error = 0};
|
|
1485
1473
|
enum {JSON_integer_en_main = 1};
|
1486
1474
|
|
1487
1475
|
|
1488
|
-
#line
|
1476
|
+
#line 683 "parser.rl"
|
1489
1477
|
|
1490
1478
|
|
1491
1479
|
#define MAX_FAST_INTEGER_SIZE 18
|
@@ -1510,82 +1498,8 @@ static inline VALUE fast_parse_integer(char *p, char *pe)
|
|
1510
1498
|
return LL2NUM(memo);
|
1511
1499
|
}
|
1512
1500
|
|
1513
|
-
static char *
|
1501
|
+
static char *JSON_decode_integer(JSON_Parser *json, char *p, VALUE *result)
|
1514
1502
|
{
|
1515
|
-
int cs = EVIL;
|
1516
|
-
|
1517
|
-
|
1518
|
-
#line 1519 "parser.c"
|
1519
|
-
{
|
1520
|
-
cs = JSON_integer_start;
|
1521
|
-
}
|
1522
|
-
|
1523
|
-
#line 724 "parser.rl"
|
1524
|
-
json->memo = p;
|
1525
|
-
|
1526
|
-
#line 1527 "parser.c"
|
1527
|
-
{
|
1528
|
-
if ( p == pe )
|
1529
|
-
goto _test_eof;
|
1530
|
-
switch ( cs )
|
1531
|
-
{
|
1532
|
-
case 1:
|
1533
|
-
switch( (*p) ) {
|
1534
|
-
case 45: goto st2;
|
1535
|
-
case 48: goto st3;
|
1536
|
-
}
|
1537
|
-
if ( 49 <= (*p) && (*p) <= 57 )
|
1538
|
-
goto st5;
|
1539
|
-
goto st0;
|
1540
|
-
st0:
|
1541
|
-
cs = 0;
|
1542
|
-
goto _out;
|
1543
|
-
st2:
|
1544
|
-
if ( ++p == pe )
|
1545
|
-
goto _test_eof2;
|
1546
|
-
case 2:
|
1547
|
-
if ( (*p) == 48 )
|
1548
|
-
goto st3;
|
1549
|
-
if ( 49 <= (*p) && (*p) <= 57 )
|
1550
|
-
goto st5;
|
1551
|
-
goto st0;
|
1552
|
-
st3:
|
1553
|
-
if ( ++p == pe )
|
1554
|
-
goto _test_eof3;
|
1555
|
-
case 3:
|
1556
|
-
if ( 48 <= (*p) && (*p) <= 57 )
|
1557
|
-
goto st0;
|
1558
|
-
goto tr4;
|
1559
|
-
tr4:
|
1560
|
-
#line 692 "parser.rl"
|
1561
|
-
{ p--; {p++; cs = 4; goto _out;} }
|
1562
|
-
goto st4;
|
1563
|
-
st4:
|
1564
|
-
if ( ++p == pe )
|
1565
|
-
goto _test_eof4;
|
1566
|
-
case 4:
|
1567
|
-
#line 1568 "parser.c"
|
1568
|
-
goto st0;
|
1569
|
-
st5:
|
1570
|
-
if ( ++p == pe )
|
1571
|
-
goto _test_eof5;
|
1572
|
-
case 5:
|
1573
|
-
if ( 48 <= (*p) && (*p) <= 57 )
|
1574
|
-
goto st5;
|
1575
|
-
goto tr4;
|
1576
|
-
}
|
1577
|
-
_test_eof2: cs = 2; goto _test_eof;
|
1578
|
-
_test_eof3: cs = 3; goto _test_eof;
|
1579
|
-
_test_eof4: cs = 4; goto _test_eof;
|
1580
|
-
_test_eof5: cs = 5; goto _test_eof;
|
1581
|
-
|
1582
|
-
_test_eof: {}
|
1583
|
-
_out: {}
|
1584
|
-
}
|
1585
|
-
|
1586
|
-
#line 726 "parser.rl"
|
1587
|
-
|
1588
|
-
if (cs >= JSON_integer_first_final) {
|
1589
1503
|
long len = p - json->memo;
|
1590
1504
|
if (RB_LIKELY(len < MAX_FAST_INTEGER_SIZE)) {
|
1591
1505
|
*result = fast_parse_integer(json->memo, p);
|
@@ -1596,37 +1510,35 @@ case 5:
|
|
1596
1510
|
*result = rb_cstr2inum(FBUFFER_PTR(&json->fbuffer), 10);
|
1597
1511
|
}
|
1598
1512
|
return p + 1;
|
1599
|
-
} else {
|
1600
|
-
return NULL;
|
1601
|
-
}
|
1602
1513
|
}
|
1603
1514
|
|
1604
1515
|
|
1605
|
-
#line
|
1516
|
+
#line 1517 "parser.c"
|
1606
1517
|
enum {JSON_float_start = 1};
|
1607
|
-
enum {JSON_float_first_final =
|
1518
|
+
enum {JSON_float_first_final = 6};
|
1608
1519
|
enum {JSON_float_error = 0};
|
1609
1520
|
|
1610
1521
|
enum {JSON_float_en_main = 1};
|
1611
1522
|
|
1612
1523
|
|
1613
|
-
#line
|
1524
|
+
#line 735 "parser.rl"
|
1614
1525
|
|
1615
1526
|
|
1616
|
-
static char *
|
1527
|
+
static char *JSON_parse_number(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
1617
1528
|
{
|
1618
1529
|
int cs = EVIL;
|
1530
|
+
bool is_float = false;
|
1619
1531
|
|
1620
1532
|
|
1621
|
-
#line
|
1533
|
+
#line 1534 "parser.c"
|
1622
1534
|
{
|
1623
1535
|
cs = JSON_float_start;
|
1624
1536
|
}
|
1625
1537
|
|
1626
|
-
#line
|
1538
|
+
#line 743 "parser.rl"
|
1627
1539
|
json->memo = p;
|
1628
1540
|
|
1629
|
-
#line
|
1541
|
+
#line 1542 "parser.c"
|
1630
1542
|
{
|
1631
1543
|
if ( p == pe )
|
1632
1544
|
goto _test_eof;
|
@@ -1635,10 +1547,10 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
1635
1547
|
case 1:
|
1636
1548
|
switch( (*p) ) {
|
1637
1549
|
case 45: goto st2;
|
1638
|
-
case 48: goto
|
1550
|
+
case 48: goto st6;
|
1639
1551
|
}
|
1640
1552
|
if ( 49 <= (*p) && (*p) <= 57 )
|
1641
|
-
goto
|
1553
|
+
goto st10;
|
1642
1554
|
goto st0;
|
1643
1555
|
st0:
|
1644
1556
|
cs = 0;
|
@@ -1648,24 +1560,42 @@ st2:
|
|
1648
1560
|
goto _test_eof2;
|
1649
1561
|
case 2:
|
1650
1562
|
if ( (*p) == 48 )
|
1651
|
-
goto
|
1563
|
+
goto st6;
|
1652
1564
|
if ( 49 <= (*p) && (*p) <= 57 )
|
1653
|
-
goto
|
1565
|
+
goto st10;
|
1654
1566
|
goto st0;
|
1655
|
-
|
1567
|
+
st6:
|
1656
1568
|
if ( ++p == pe )
|
1657
|
-
goto
|
1658
|
-
case
|
1569
|
+
goto _test_eof6;
|
1570
|
+
case 6:
|
1659
1571
|
switch( (*p) ) {
|
1660
|
-
case
|
1661
|
-
case
|
1662
|
-
case
|
1572
|
+
case 45: goto st0;
|
1573
|
+
case 46: goto tr8;
|
1574
|
+
case 69: goto tr9;
|
1575
|
+
case 101: goto tr9;
|
1663
1576
|
}
|
1577
|
+
if ( 48 <= (*p) && (*p) <= 57 )
|
1578
|
+
goto st0;
|
1579
|
+
goto tr7;
|
1580
|
+
tr7:
|
1581
|
+
#line 727 "parser.rl"
|
1582
|
+
{ p--; {p++; cs = 7; goto _out;} }
|
1583
|
+
goto st7;
|
1584
|
+
st7:
|
1585
|
+
if ( ++p == pe )
|
1586
|
+
goto _test_eof7;
|
1587
|
+
case 7:
|
1588
|
+
#line 1589 "parser.c"
|
1664
1589
|
goto st0;
|
1665
|
-
|
1590
|
+
tr8:
|
1591
|
+
#line 728 "parser.rl"
|
1592
|
+
{ is_float = true; }
|
1593
|
+
goto st3;
|
1594
|
+
st3:
|
1666
1595
|
if ( ++p == pe )
|
1667
|
-
goto
|
1668
|
-
case
|
1596
|
+
goto _test_eof3;
|
1597
|
+
case 3:
|
1598
|
+
#line 1599 "parser.c"
|
1669
1599
|
if ( 48 <= (*p) && (*p) <= 57 )
|
1670
1600
|
goto st8;
|
1671
1601
|
goto st0;
|
@@ -1674,87 +1604,86 @@ st8:
|
|
1674
1604
|
goto _test_eof8;
|
1675
1605
|
case 8:
|
1676
1606
|
switch( (*p) ) {
|
1677
|
-
case 69: goto
|
1678
|
-
case 101: goto
|
1607
|
+
case 69: goto st4;
|
1608
|
+
case 101: goto st4;
|
1679
1609
|
}
|
1680
1610
|
if ( (*p) > 46 ) {
|
1681
1611
|
if ( 48 <= (*p) && (*p) <= 57 )
|
1682
1612
|
goto st8;
|
1683
1613
|
} else if ( (*p) >= 45 )
|
1684
1614
|
goto st0;
|
1685
|
-
goto
|
1615
|
+
goto tr7;
|
1686
1616
|
tr9:
|
1687
|
-
#line
|
1688
|
-
{
|
1689
|
-
goto
|
1690
|
-
|
1691
|
-
if ( ++p == pe )
|
1692
|
-
goto _test_eof9;
|
1693
|
-
case 9:
|
1694
|
-
#line 1695 "parser.c"
|
1695
|
-
goto st0;
|
1696
|
-
st5:
|
1617
|
+
#line 728 "parser.rl"
|
1618
|
+
{ is_float = true; }
|
1619
|
+
goto st4;
|
1620
|
+
st4:
|
1697
1621
|
if ( ++p == pe )
|
1698
|
-
goto
|
1699
|
-
case
|
1622
|
+
goto _test_eof4;
|
1623
|
+
case 4:
|
1624
|
+
#line 1625 "parser.c"
|
1700
1625
|
switch( (*p) ) {
|
1701
|
-
case 43: goto
|
1702
|
-
case 45: goto
|
1626
|
+
case 43: goto st5;
|
1627
|
+
case 45: goto st5;
|
1703
1628
|
}
|
1704
1629
|
if ( 48 <= (*p) && (*p) <= 57 )
|
1705
|
-
goto
|
1630
|
+
goto st9;
|
1706
1631
|
goto st0;
|
1707
|
-
|
1632
|
+
st5:
|
1708
1633
|
if ( ++p == pe )
|
1709
|
-
goto
|
1710
|
-
case
|
1634
|
+
goto _test_eof5;
|
1635
|
+
case 5:
|
1711
1636
|
if ( 48 <= (*p) && (*p) <= 57 )
|
1712
|
-
goto
|
1637
|
+
goto st9;
|
1713
1638
|
goto st0;
|
1714
|
-
|
1639
|
+
st9:
|
1715
1640
|
if ( ++p == pe )
|
1716
|
-
goto
|
1717
|
-
case
|
1641
|
+
goto _test_eof9;
|
1642
|
+
case 9:
|
1718
1643
|
switch( (*p) ) {
|
1719
1644
|
case 69: goto st0;
|
1720
1645
|
case 101: goto st0;
|
1721
1646
|
}
|
1722
1647
|
if ( (*p) > 46 ) {
|
1723
1648
|
if ( 48 <= (*p) && (*p) <= 57 )
|
1724
|
-
goto
|
1649
|
+
goto st9;
|
1725
1650
|
} else if ( (*p) >= 45 )
|
1726
1651
|
goto st0;
|
1727
|
-
goto
|
1728
|
-
|
1652
|
+
goto tr7;
|
1653
|
+
st10:
|
1729
1654
|
if ( ++p == pe )
|
1730
|
-
goto
|
1731
|
-
case
|
1655
|
+
goto _test_eof10;
|
1656
|
+
case 10:
|
1732
1657
|
switch( (*p) ) {
|
1733
|
-
case
|
1734
|
-
case
|
1735
|
-
case
|
1658
|
+
case 45: goto st0;
|
1659
|
+
case 46: goto tr8;
|
1660
|
+
case 69: goto tr9;
|
1661
|
+
case 101: goto tr9;
|
1736
1662
|
}
|
1737
1663
|
if ( 48 <= (*p) && (*p) <= 57 )
|
1738
|
-
goto
|
1739
|
-
goto
|
1664
|
+
goto st10;
|
1665
|
+
goto tr7;
|
1740
1666
|
}
|
1741
1667
|
_test_eof2: cs = 2; goto _test_eof;
|
1668
|
+
_test_eof6: cs = 6; goto _test_eof;
|
1669
|
+
_test_eof7: cs = 7; goto _test_eof;
|
1742
1670
|
_test_eof3: cs = 3; goto _test_eof;
|
1743
|
-
_test_eof4: cs = 4; goto _test_eof;
|
1744
1671
|
_test_eof8: cs = 8; goto _test_eof;
|
1745
|
-
|
1672
|
+
_test_eof4: cs = 4; goto _test_eof;
|
1746
1673
|
_test_eof5: cs = 5; goto _test_eof;
|
1747
|
-
|
1674
|
+
_test_eof9: cs = 9; goto _test_eof;
|
1748
1675
|
_test_eof10: cs = 10; goto _test_eof;
|
1749
|
-
_test_eof7: cs = 7; goto _test_eof;
|
1750
1676
|
|
1751
1677
|
_test_eof: {}
|
1752
1678
|
_out: {}
|
1753
1679
|
}
|
1754
1680
|
|
1755
|
-
#line
|
1681
|
+
#line 745 "parser.rl"
|
1756
1682
|
|
1757
1683
|
if (cs >= JSON_float_first_final) {
|
1684
|
+
if (!is_float) {
|
1685
|
+
return JSON_decode_integer(json, p, result);
|
1686
|
+
}
|
1758
1687
|
VALUE mod = Qnil;
|
1759
1688
|
ID method_id = 0;
|
1760
1689
|
if (json->decimal_class) {
|
@@ -1805,7 +1734,7 @@ case 7:
|
|
1805
1734
|
|
1806
1735
|
|
1807
1736
|
|
1808
|
-
#line
|
1737
|
+
#line 1738 "parser.c"
|
1809
1738
|
enum {JSON_array_start = 1};
|
1810
1739
|
enum {JSON_array_first_final = 22};
|
1811
1740
|
enum {JSON_array_error = 0};
|
@@ -1813,7 +1742,7 @@ enum {JSON_array_error = 0};
|
|
1813
1742
|
enum {JSON_array_en_main = 1};
|
1814
1743
|
|
1815
1744
|
|
1816
|
-
#line
|
1745
|
+
#line 825 "parser.rl"
|
1817
1746
|
|
1818
1747
|
|
1819
1748
|
static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
|
@@ -1826,14 +1755,14 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
1826
1755
|
long stack_head = json->stack->head;
|
1827
1756
|
|
1828
1757
|
|
1829
|
-
#line
|
1758
|
+
#line 1759 "parser.c"
|
1830
1759
|
{
|
1831
1760
|
cs = JSON_array_start;
|
1832
1761
|
}
|
1833
1762
|
|
1834
|
-
#line
|
1763
|
+
#line 837 "parser.rl"
|
1835
1764
|
|
1836
|
-
#line
|
1765
|
+
#line 1766 "parser.c"
|
1837
1766
|
{
|
1838
1767
|
short _widec;
|
1839
1768
|
if ( p == pe )
|
@@ -1873,7 +1802,7 @@ case 2:
|
|
1873
1802
|
goto st2;
|
1874
1803
|
goto st0;
|
1875
1804
|
tr2:
|
1876
|
-
#line
|
1805
|
+
#line 805 "parser.rl"
|
1877
1806
|
{
|
1878
1807
|
VALUE v = Qnil;
|
1879
1808
|
char *np = JSON_parse_value(json, p, pe, &v, current_nesting);
|
@@ -1888,12 +1817,12 @@ st3:
|
|
1888
1817
|
if ( ++p == pe )
|
1889
1818
|
goto _test_eof3;
|
1890
1819
|
case 3:
|
1891
|
-
#line
|
1820
|
+
#line 1821 "parser.c"
|
1892
1821
|
_widec = (*p);
|
1893
1822
|
if ( 44 <= (*p) && (*p) <= 44 ) {
|
1894
1823
|
_widec = (short)(128 + ((*p) - -128));
|
1895
1824
|
if (
|
1896
|
-
#line
|
1825
|
+
#line 815 "parser.rl"
|
1897
1826
|
json->allow_trailing_comma ) _widec += 256;
|
1898
1827
|
}
|
1899
1828
|
switch( _widec ) {
|
@@ -1940,14 +1869,14 @@ case 7:
|
|
1940
1869
|
goto st3;
|
1941
1870
|
goto st7;
|
1942
1871
|
tr4:
|
1943
|
-
#line
|
1872
|
+
#line 817 "parser.rl"
|
1944
1873
|
{ p--; {p++; cs = 22; goto _out;} }
|
1945
1874
|
goto st22;
|
1946
1875
|
st22:
|
1947
1876
|
if ( ++p == pe )
|
1948
1877
|
goto _test_eof22;
|
1949
1878
|
case 22:
|
1950
|
-
#line
|
1879
|
+
#line 1880 "parser.c"
|
1951
1880
|
goto st0;
|
1952
1881
|
st8:
|
1953
1882
|
if ( ++p == pe )
|
@@ -2015,13 +1944,13 @@ case 13:
|
|
2015
1944
|
if ( 10 <= (*p) && (*p) <= 10 ) {
|
2016
1945
|
_widec = (short)(128 + ((*p) - -128));
|
2017
1946
|
if (
|
2018
|
-
#line
|
1947
|
+
#line 815 "parser.rl"
|
2019
1948
|
json->allow_trailing_comma ) _widec += 256;
|
2020
1949
|
}
|
2021
1950
|
} else if ( (*p) >= 9 ) {
|
2022
1951
|
_widec = (short)(128 + ((*p) - -128));
|
2023
1952
|
if (
|
2024
|
-
#line
|
1953
|
+
#line 815 "parser.rl"
|
2025
1954
|
json->allow_trailing_comma ) _widec += 256;
|
2026
1955
|
}
|
2027
1956
|
} else if ( (*p) > 13 ) {
|
@@ -2029,19 +1958,19 @@ case 13:
|
|
2029
1958
|
if ( 47 <= (*p) && (*p) <= 47 ) {
|
2030
1959
|
_widec = (short)(128 + ((*p) - -128));
|
2031
1960
|
if (
|
2032
|
-
#line
|
1961
|
+
#line 815 "parser.rl"
|
2033
1962
|
json->allow_trailing_comma ) _widec += 256;
|
2034
1963
|
}
|
2035
1964
|
} else if ( (*p) >= 32 ) {
|
2036
1965
|
_widec = (short)(128 + ((*p) - -128));
|
2037
1966
|
if (
|
2038
|
-
#line
|
1967
|
+
#line 815 "parser.rl"
|
2039
1968
|
json->allow_trailing_comma ) _widec += 256;
|
2040
1969
|
}
|
2041
1970
|
} else {
|
2042
1971
|
_widec = (short)(128 + ((*p) - -128));
|
2043
1972
|
if (
|
2044
|
-
#line
|
1973
|
+
#line 815 "parser.rl"
|
2045
1974
|
json->allow_trailing_comma ) _widec += 256;
|
2046
1975
|
}
|
2047
1976
|
switch( _widec ) {
|
@@ -2080,13 +2009,13 @@ case 14:
|
|
2080
2009
|
if ( 47 <= (*p) && (*p) <= 47 ) {
|
2081
2010
|
_widec = (short)(128 + ((*p) - -128));
|
2082
2011
|
if (
|
2083
|
-
#line
|
2012
|
+
#line 815 "parser.rl"
|
2084
2013
|
json->allow_trailing_comma ) _widec += 256;
|
2085
2014
|
}
|
2086
2015
|
} else if ( (*p) >= 42 ) {
|
2087
2016
|
_widec = (short)(128 + ((*p) - -128));
|
2088
2017
|
if (
|
2089
|
-
#line
|
2018
|
+
#line 815 "parser.rl"
|
2090
2019
|
json->allow_trailing_comma ) _widec += 256;
|
2091
2020
|
}
|
2092
2021
|
switch( _widec ) {
|
@@ -2105,20 +2034,20 @@ case 15:
|
|
2105
2034
|
if ( (*p) <= 41 ) {
|
2106
2035
|
_widec = (short)(128 + ((*p) - -128));
|
2107
2036
|
if (
|
2108
|
-
#line
|
2037
|
+
#line 815 "parser.rl"
|
2109
2038
|
json->allow_trailing_comma ) _widec += 256;
|
2110
2039
|
}
|
2111
2040
|
} else if ( (*p) > 42 ) {
|
2112
2041
|
if ( 43 <= (*p) )
|
2113
2042
|
{ _widec = (short)(128 + ((*p) - -128));
|
2114
2043
|
if (
|
2115
|
-
#line
|
2044
|
+
#line 815 "parser.rl"
|
2116
2045
|
json->allow_trailing_comma ) _widec += 256;
|
2117
2046
|
}
|
2118
2047
|
} else {
|
2119
2048
|
_widec = (short)(128 + ((*p) - -128));
|
2120
2049
|
if (
|
2121
|
-
#line
|
2050
|
+
#line 815 "parser.rl"
|
2122
2051
|
json->allow_trailing_comma ) _widec += 256;
|
2123
2052
|
}
|
2124
2053
|
switch( _widec ) {
|
@@ -2141,13 +2070,13 @@ case 16:
|
|
2141
2070
|
if ( 42 <= (*p) && (*p) <= 42 ) {
|
2142
2071
|
_widec = (short)(128 + ((*p) - -128));
|
2143
2072
|
if (
|
2144
|
-
#line
|
2073
|
+
#line 815 "parser.rl"
|
2145
2074
|
json->allow_trailing_comma ) _widec += 256;
|
2146
2075
|
}
|
2147
2076
|
} else {
|
2148
2077
|
_widec = (short)(128 + ((*p) - -128));
|
2149
2078
|
if (
|
2150
|
-
#line
|
2079
|
+
#line 815 "parser.rl"
|
2151
2080
|
json->allow_trailing_comma ) _widec += 256;
|
2152
2081
|
}
|
2153
2082
|
} else if ( (*p) > 46 ) {
|
@@ -2155,19 +2084,19 @@ case 16:
|
|
2155
2084
|
if ( 48 <= (*p) )
|
2156
2085
|
{ _widec = (short)(128 + ((*p) - -128));
|
2157
2086
|
if (
|
2158
|
-
#line
|
2087
|
+
#line 815 "parser.rl"
|
2159
2088
|
json->allow_trailing_comma ) _widec += 256;
|
2160
2089
|
}
|
2161
2090
|
} else if ( (*p) >= 47 ) {
|
2162
2091
|
_widec = (short)(128 + ((*p) - -128));
|
2163
2092
|
if (
|
2164
|
-
#line
|
2093
|
+
#line 815 "parser.rl"
|
2165
2094
|
json->allow_trailing_comma ) _widec += 256;
|
2166
2095
|
}
|
2167
2096
|
} else {
|
2168
2097
|
_widec = (short)(128 + ((*p) - -128));
|
2169
2098
|
if (
|
2170
|
-
#line
|
2099
|
+
#line 815 "parser.rl"
|
2171
2100
|
json->allow_trailing_comma ) _widec += 256;
|
2172
2101
|
}
|
2173
2102
|
switch( _widec ) {
|
@@ -2191,20 +2120,20 @@ case 17:
|
|
2191
2120
|
if ( (*p) <= 9 ) {
|
2192
2121
|
_widec = (short)(128 + ((*p) - -128));
|
2193
2122
|
if (
|
2194
|
-
#line
|
2123
|
+
#line 815 "parser.rl"
|
2195
2124
|
json->allow_trailing_comma ) _widec += 256;
|
2196
2125
|
}
|
2197
2126
|
} else if ( (*p) > 10 ) {
|
2198
2127
|
if ( 11 <= (*p) )
|
2199
2128
|
{ _widec = (short)(128 + ((*p) - -128));
|
2200
2129
|
if (
|
2201
|
-
#line
|
2130
|
+
#line 815 "parser.rl"
|
2202
2131
|
json->allow_trailing_comma ) _widec += 256;
|
2203
2132
|
}
|
2204
2133
|
} else {
|
2205
2134
|
_widec = (short)(128 + ((*p) - -128));
|
2206
2135
|
if (
|
2207
|
-
#line
|
2136
|
+
#line 815 "parser.rl"
|
2208
2137
|
json->allow_trailing_comma ) _widec += 256;
|
2209
2138
|
}
|
2210
2139
|
switch( _widec ) {
|
@@ -2276,7 +2205,7 @@ case 21:
|
|
2276
2205
|
_out: {}
|
2277
2206
|
}
|
2278
2207
|
|
2279
|
-
#line
|
2208
|
+
#line 838 "parser.rl"
|
2280
2209
|
|
2281
2210
|
if(cs >= JSON_array_first_final) {
|
2282
2211
|
long count = json->stack->head - stack_head;
|
@@ -2332,7 +2261,7 @@ static VALUE json_string_fastpath(JSON_Parser *json, char *string, char *stringE
|
|
2332
2261
|
{
|
2333
2262
|
size_t bufferSize = stringEnd - string;
|
2334
2263
|
|
2335
|
-
if (is_name) {
|
2264
|
+
if (is_name && json->in_array) {
|
2336
2265
|
VALUE cached_key;
|
2337
2266
|
if (RB_UNLIKELY(symbolize)) {
|
2338
2267
|
cached_key = rsymbol_cache_fetch(&json->name_cache, string, bufferSize);
|
@@ -2355,7 +2284,7 @@ static VALUE json_string_unescape(JSON_Parser *json, char *string, char *stringE
|
|
2355
2284
|
int unescape_len;
|
2356
2285
|
char buf[4];
|
2357
2286
|
|
2358
|
-
if (is_name) {
|
2287
|
+
if (is_name && json->in_array) {
|
2359
2288
|
VALUE cached_key;
|
2360
2289
|
if (RB_UNLIKELY(symbolize)) {
|
2361
2290
|
cached_key = rsymbol_cache_fetch(&json->name_cache, string, bufferSize);
|
@@ -2470,7 +2399,7 @@ static VALUE json_string_unescape(JSON_Parser *json, char *string, char *stringE
|
|
2470
2399
|
}
|
2471
2400
|
|
2472
2401
|
|
2473
|
-
#line
|
2402
|
+
#line 2403 "parser.c"
|
2474
2403
|
enum {JSON_string_start = 1};
|
2475
2404
|
enum {JSON_string_first_final = 9};
|
2476
2405
|
enum {JSON_string_error = 0};
|
@@ -2478,7 +2407,7 @@ enum {JSON_string_error = 0};
|
|
2478
2407
|
enum {JSON_string_en_main = 1};
|
2479
2408
|
|
2480
2409
|
|
2481
|
-
#line
|
2410
|
+
#line 1061 "parser.rl"
|
2482
2411
|
|
2483
2412
|
|
2484
2413
|
static int
|
@@ -2499,15 +2428,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
|
|
2499
2428
|
VALUE match_string;
|
2500
2429
|
|
2501
2430
|
|
2502
|
-
#line
|
2431
|
+
#line 2432 "parser.c"
|
2503
2432
|
{
|
2504
2433
|
cs = JSON_string_start;
|
2505
2434
|
}
|
2506
2435
|
|
2507
|
-
#line
|
2436
|
+
#line 1081 "parser.rl"
|
2508
2437
|
json->memo = p;
|
2509
2438
|
|
2510
|
-
#line
|
2439
|
+
#line 2440 "parser.c"
|
2511
2440
|
{
|
2512
2441
|
if ( p == pe )
|
2513
2442
|
goto _test_eof;
|
@@ -2532,14 +2461,14 @@ case 2:
|
|
2532
2461
|
goto st0;
|
2533
2462
|
goto st2;
|
2534
2463
|
tr2:
|
2535
|
-
#line
|
2464
|
+
#line 1043 "parser.rl"
|
2536
2465
|
{
|
2537
2466
|
*result = json_string_fastpath(json, json->memo + 1, p, json->parsing_name, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
|
2538
2467
|
{p = (( p + 1))-1;}
|
2539
2468
|
p--;
|
2540
2469
|
{p++; cs = 9; goto _out;}
|
2541
2470
|
}
|
2542
|
-
#line
|
2471
|
+
#line 1036 "parser.rl"
|
2543
2472
|
{
|
2544
2473
|
*result = json_string_unescape(json, json->memo + 1, p, json->parsing_name, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
|
2545
2474
|
{p = (( p + 1))-1;}
|
@@ -2548,7 +2477,7 @@ tr2:
|
|
2548
2477
|
}
|
2549
2478
|
goto st9;
|
2550
2479
|
tr6:
|
2551
|
-
#line
|
2480
|
+
#line 1036 "parser.rl"
|
2552
2481
|
{
|
2553
2482
|
*result = json_string_unescape(json, json->memo + 1, p, json->parsing_name, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
|
2554
2483
|
{p = (( p + 1))-1;}
|
@@ -2560,7 +2489,7 @@ st9:
|
|
2560
2489
|
if ( ++p == pe )
|
2561
2490
|
goto _test_eof9;
|
2562
2491
|
case 9:
|
2563
|
-
#line
|
2492
|
+
#line 2493 "parser.c"
|
2564
2493
|
goto st0;
|
2565
2494
|
st3:
|
2566
2495
|
if ( ++p == pe )
|
@@ -2648,7 +2577,7 @@ case 8:
|
|
2648
2577
|
_out: {}
|
2649
2578
|
}
|
2650
2579
|
|
2651
|
-
#line
|
2580
|
+
#line 1083 "parser.rl"
|
2652
2581
|
|
2653
2582
|
if (json->create_additions && RTEST(match_string = json->match_string)) {
|
2654
2583
|
VALUE klass;
|
@@ -2801,7 +2730,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
|
|
2801
2730
|
}
|
2802
2731
|
|
2803
2732
|
|
2804
|
-
#line
|
2733
|
+
#line 2734 "parser.c"
|
2805
2734
|
enum {JSON_start = 1};
|
2806
2735
|
enum {JSON_first_final = 10};
|
2807
2736
|
enum {JSON_error = 0};
|
@@ -2809,7 +2738,7 @@ enum {JSON_error = 0};
|
|
2809
2738
|
enum {JSON_en_main = 1};
|
2810
2739
|
|
2811
2740
|
|
2812
|
-
#line
|
2741
|
+
#line 1249 "parser.rl"
|
2813
2742
|
|
2814
2743
|
|
2815
2744
|
/*
|
@@ -2838,16 +2767,16 @@ static VALUE cParser_parse(VALUE self)
|
|
2838
2767
|
json->stack = &stack;
|
2839
2768
|
|
2840
2769
|
|
2841
|
-
#line
|
2770
|
+
#line 2771 "parser.c"
|
2842
2771
|
{
|
2843
2772
|
cs = JSON_start;
|
2844
2773
|
}
|
2845
2774
|
|
2846
|
-
#line
|
2775
|
+
#line 1277 "parser.rl"
|
2847
2776
|
p = json->source;
|
2848
2777
|
pe = p + json->len;
|
2849
2778
|
|
2850
|
-
#line
|
2779
|
+
#line 2780 "parser.c"
|
2851
2780
|
{
|
2852
2781
|
if ( p == pe )
|
2853
2782
|
goto _test_eof;
|
@@ -2881,7 +2810,7 @@ st0:
|
|
2881
2810
|
cs = 0;
|
2882
2811
|
goto _out;
|
2883
2812
|
tr2:
|
2884
|
-
#line
|
2813
|
+
#line 1241 "parser.rl"
|
2885
2814
|
{
|
2886
2815
|
char *np = JSON_parse_value(json, p, pe, &result, 0);
|
2887
2816
|
if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
|
@@ -2891,7 +2820,7 @@ st10:
|
|
2891
2820
|
if ( ++p == pe )
|
2892
2821
|
goto _test_eof10;
|
2893
2822
|
case 10:
|
2894
|
-
#line
|
2823
|
+
#line 2824 "parser.c"
|
2895
2824
|
switch( (*p) ) {
|
2896
2825
|
case 13: goto st10;
|
2897
2826
|
case 32: goto st10;
|
@@ -2980,7 +2909,7 @@ case 9:
|
|
2980
2909
|
_out: {}
|
2981
2910
|
}
|
2982
2911
|
|
2983
|
-
#line
|
2912
|
+
#line 1280 "parser.rl"
|
2984
2913
|
|
2985
2914
|
if (json->stack_handle) {
|
2986
2915
|
rvalue_stack_eagerly_release(json->stack_handle);
|
@@ -3016,16 +2945,16 @@ static VALUE cParser_m_parse(VALUE klass, VALUE source, VALUE opts)
|
|
3016
2945
|
json->stack = &stack;
|
3017
2946
|
|
3018
2947
|
|
3019
|
-
#line
|
2948
|
+
#line 2949 "parser.c"
|
3020
2949
|
{
|
3021
2950
|
cs = JSON_start;
|
3022
2951
|
}
|
3023
2952
|
|
3024
|
-
#line
|
2953
|
+
#line 1315 "parser.rl"
|
3025
2954
|
p = json->source;
|
3026
2955
|
pe = p + json->len;
|
3027
2956
|
|
3028
|
-
#line
|
2957
|
+
#line 2958 "parser.c"
|
3029
2958
|
{
|
3030
2959
|
if ( p == pe )
|
3031
2960
|
goto _test_eof;
|
@@ -3059,7 +2988,7 @@ st0:
|
|
3059
2988
|
cs = 0;
|
3060
2989
|
goto _out;
|
3061
2990
|
tr2:
|
3062
|
-
#line
|
2991
|
+
#line 1241 "parser.rl"
|
3063
2992
|
{
|
3064
2993
|
char *np = JSON_parse_value(json, p, pe, &result, 0);
|
3065
2994
|
if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
|
@@ -3069,7 +2998,7 @@ st10:
|
|
3069
2998
|
if ( ++p == pe )
|
3070
2999
|
goto _test_eof10;
|
3071
3000
|
case 10:
|
3072
|
-
#line
|
3001
|
+
#line 3002 "parser.c"
|
3073
3002
|
switch( (*p) ) {
|
3074
3003
|
case 13: goto st10;
|
3075
3004
|
case 32: goto st10;
|
@@ -3158,7 +3087,7 @@ case 9:
|
|
3158
3087
|
_out: {}
|
3159
3088
|
}
|
3160
3089
|
|
3161
|
-
#line
|
3090
|
+
#line 1318 "parser.rl"
|
3162
3091
|
|
3163
3092
|
if (json->stack_handle) {
|
3164
3093
|
rvalue_stack_eagerly_release(json->stack_handle);
|
@@ -3183,8 +3112,10 @@ static void JSON_mark(void *ptr)
|
|
3183
3112
|
rb_gc_mark(json->match_string);
|
3184
3113
|
rb_gc_mark(json->stack_handle);
|
3185
3114
|
|
3186
|
-
|
3187
|
-
|
3115
|
+
long index;
|
3116
|
+
for (index = 0; index < json->name_cache.length; index++) {
|
3117
|
+
rb_gc_mark(json->name_cache.entries[index]);
|
3118
|
+
}
|
3188
3119
|
}
|
3189
3120
|
|
3190
3121
|
static void JSON_free(void *ptr)
|