json 2.8.2 → 2.9.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- rb_gc_mark_locations(stack->ptr, stack->ptr + stack->head);
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)
@@ -427,6 +417,14 @@ static char *JSON_parse_number(JSON_Parser *json, char *p, char *pe, VALUE *resu
427
417
  static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting);
428
418
 
429
419
 
420
+ #ifndef HAVE_STRNLEN
421
+ static size_t strnlen(const char *s, size_t maxlen)
422
+ {
423
+ char *p;
424
+ return ((p = memchr(s, '\0', maxlen)) ? p - s : maxlen);
425
+ }
426
+ #endif
427
+
430
428
  #define PARSE_ERROR_FRAGMENT_LEN 32
431
429
  #ifdef RBIMPL_ATTR_NORETURN
432
430
  RBIMPL_ATTR_NORETURN()
@@ -449,11 +447,11 @@ static void raise_parse_error(const char *format, const char *start)
449
447
 
450
448
 
451
449
 
452
- #line 475 "parser.rl"
450
+ #line 473 "parser.rl"
453
451
 
454
452
 
455
453
 
456
- #line 457 "parser.c"
454
+ #line 455 "parser.c"
457
455
  enum {JSON_object_start = 1};
458
456
  enum {JSON_object_first_final = 32};
459
457
  enum {JSON_object_error = 0};
@@ -461,7 +459,7 @@ enum {JSON_object_error = 0};
461
459
  enum {JSON_object_en_main = 1};
462
460
 
463
461
 
464
- #line 515 "parser.rl"
462
+ #line 513 "parser.rl"
465
463
 
466
464
 
467
465
  #define PUSH(result) rvalue_stack_push(json->stack, result, &json->stack_handle, &json->stack)
@@ -477,14 +475,14 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu
477
475
  long stack_head = json->stack->head;
478
476
 
479
477
 
480
- #line 481 "parser.c"
478
+ #line 479 "parser.c"
481
479
  {
482
480
  cs = JSON_object_start;
483
481
  }
484
482
 
485
- #line 530 "parser.rl"
483
+ #line 528 "parser.rl"
486
484
 
487
- #line 488 "parser.c"
485
+ #line 486 "parser.c"
488
486
  {
489
487
  short _widec;
490
488
  if ( p == pe )
@@ -513,7 +511,7 @@ case 2:
513
511
  goto st2;
514
512
  goto st0;
515
513
  tr2:
516
- #line 494 "parser.rl"
514
+ #line 492 "parser.rl"
517
515
  {
518
516
  char *np;
519
517
  json->parsing_name = true;
@@ -529,7 +527,7 @@ st3:
529
527
  if ( ++p == pe )
530
528
  goto _test_eof3;
531
529
  case 3:
532
- #line 533 "parser.c"
530
+ #line 531 "parser.c"
533
531
  switch( (*p) ) {
534
532
  case 13: goto st3;
535
533
  case 32: goto st3;
@@ -596,7 +594,7 @@ case 8:
596
594
  goto st8;
597
595
  goto st0;
598
596
  tr11:
599
- #line 483 "parser.rl"
597
+ #line 481 "parser.rl"
600
598
  {
601
599
  char *np = JSON_parse_value(json, p, pe, result, current_nesting);
602
600
  if (np == NULL) {
@@ -610,20 +608,20 @@ st9:
610
608
  if ( ++p == pe )
611
609
  goto _test_eof9;
612
610
  case 9:
613
- #line 614 "parser.c"
611
+ #line 612 "parser.c"
614
612
  _widec = (*p);
615
613
  if ( (*p) < 13 ) {
616
614
  if ( (*p) > 9 ) {
617
615
  if ( 10 <= (*p) && (*p) <= 10 ) {
618
616
  _widec = (short)(128 + ((*p) - -128));
619
617
  if (
620
- #line 492 "parser.rl"
618
+ #line 490 "parser.rl"
621
619
  json->allow_trailing_comma ) _widec += 256;
622
620
  }
623
621
  } else if ( (*p) >= 9 ) {
624
622
  _widec = (short)(128 + ((*p) - -128));
625
623
  if (
626
- #line 492 "parser.rl"
624
+ #line 490 "parser.rl"
627
625
  json->allow_trailing_comma ) _widec += 256;
628
626
  }
629
627
  } else if ( (*p) > 13 ) {
@@ -631,26 +629,26 @@ case 9:
631
629
  if ( 32 <= (*p) && (*p) <= 32 ) {
632
630
  _widec = (short)(128 + ((*p) - -128));
633
631
  if (
634
- #line 492 "parser.rl"
632
+ #line 490 "parser.rl"
635
633
  json->allow_trailing_comma ) _widec += 256;
636
634
  }
637
635
  } else if ( (*p) > 44 ) {
638
636
  if ( 47 <= (*p) && (*p) <= 47 ) {
639
637
  _widec = (short)(128 + ((*p) - -128));
640
638
  if (
641
- #line 492 "parser.rl"
639
+ #line 490 "parser.rl"
642
640
  json->allow_trailing_comma ) _widec += 256;
643
641
  }
644
642
  } else {
645
643
  _widec = (short)(128 + ((*p) - -128));
646
644
  if (
647
- #line 492 "parser.rl"
645
+ #line 490 "parser.rl"
648
646
  json->allow_trailing_comma ) _widec += 256;
649
647
  }
650
648
  } else {
651
649
  _widec = (short)(128 + ((*p) - -128));
652
650
  if (
653
- #line 492 "parser.rl"
651
+ #line 490 "parser.rl"
654
652
  json->allow_trailing_comma ) _widec += 256;
655
653
  }
656
654
  switch( _widec ) {
@@ -671,14 +669,14 @@ case 9:
671
669
  goto st10;
672
670
  goto st0;
673
671
  tr4:
674
- #line 505 "parser.rl"
672
+ #line 503 "parser.rl"
675
673
  { p--; {p++; cs = 32; goto _out;} }
676
674
  goto st32;
677
675
  st32:
678
676
  if ( ++p == pe )
679
677
  goto _test_eof32;
680
678
  case 32:
681
- #line 682 "parser.c"
679
+ #line 680 "parser.c"
682
680
  goto st0;
683
681
  st10:
684
682
  if ( ++p == pe )
@@ -780,13 +778,13 @@ case 20:
780
778
  if ( 47 <= (*p) && (*p) <= 47 ) {
781
779
  _widec = (short)(128 + ((*p) - -128));
782
780
  if (
783
- #line 492 "parser.rl"
781
+ #line 490 "parser.rl"
784
782
  json->allow_trailing_comma ) _widec += 256;
785
783
  }
786
784
  } else if ( (*p) >= 42 ) {
787
785
  _widec = (short)(128 + ((*p) - -128));
788
786
  if (
789
- #line 492 "parser.rl"
787
+ #line 490 "parser.rl"
790
788
  json->allow_trailing_comma ) _widec += 256;
791
789
  }
792
790
  switch( _widec ) {
@@ -805,20 +803,20 @@ case 21:
805
803
  if ( (*p) <= 41 ) {
806
804
  _widec = (short)(128 + ((*p) - -128));
807
805
  if (
808
- #line 492 "parser.rl"
806
+ #line 490 "parser.rl"
809
807
  json->allow_trailing_comma ) _widec += 256;
810
808
  }
811
809
  } else if ( (*p) > 42 ) {
812
810
  if ( 43 <= (*p) )
813
811
  { _widec = (short)(128 + ((*p) - -128));
814
812
  if (
815
- #line 492 "parser.rl"
813
+ #line 490 "parser.rl"
816
814
  json->allow_trailing_comma ) _widec += 256;
817
815
  }
818
816
  } else {
819
817
  _widec = (short)(128 + ((*p) - -128));
820
818
  if (
821
- #line 492 "parser.rl"
819
+ #line 490 "parser.rl"
822
820
  json->allow_trailing_comma ) _widec += 256;
823
821
  }
824
822
  switch( _widec ) {
@@ -841,13 +839,13 @@ case 22:
841
839
  if ( 42 <= (*p) && (*p) <= 42 ) {
842
840
  _widec = (short)(128 + ((*p) - -128));
843
841
  if (
844
- #line 492 "parser.rl"
842
+ #line 490 "parser.rl"
845
843
  json->allow_trailing_comma ) _widec += 256;
846
844
  }
847
845
  } else {
848
846
  _widec = (short)(128 + ((*p) - -128));
849
847
  if (
850
- #line 492 "parser.rl"
848
+ #line 490 "parser.rl"
851
849
  json->allow_trailing_comma ) _widec += 256;
852
850
  }
853
851
  } else if ( (*p) > 46 ) {
@@ -855,19 +853,19 @@ case 22:
855
853
  if ( 48 <= (*p) )
856
854
  { _widec = (short)(128 + ((*p) - -128));
857
855
  if (
858
- #line 492 "parser.rl"
856
+ #line 490 "parser.rl"
859
857
  json->allow_trailing_comma ) _widec += 256;
860
858
  }
861
859
  } else if ( (*p) >= 47 ) {
862
860
  _widec = (short)(128 + ((*p) - -128));
863
861
  if (
864
- #line 492 "parser.rl"
862
+ #line 490 "parser.rl"
865
863
  json->allow_trailing_comma ) _widec += 256;
866
864
  }
867
865
  } else {
868
866
  _widec = (short)(128 + ((*p) - -128));
869
867
  if (
870
- #line 492 "parser.rl"
868
+ #line 490 "parser.rl"
871
869
  json->allow_trailing_comma ) _widec += 256;
872
870
  }
873
871
  switch( _widec ) {
@@ -891,20 +889,20 @@ case 23:
891
889
  if ( (*p) <= 9 ) {
892
890
  _widec = (short)(128 + ((*p) - -128));
893
891
  if (
894
- #line 492 "parser.rl"
892
+ #line 490 "parser.rl"
895
893
  json->allow_trailing_comma ) _widec += 256;
896
894
  }
897
895
  } else if ( (*p) > 10 ) {
898
896
  if ( 11 <= (*p) )
899
897
  { _widec = (short)(128 + ((*p) - -128));
900
898
  if (
901
- #line 492 "parser.rl"
899
+ #line 490 "parser.rl"
902
900
  json->allow_trailing_comma ) _widec += 256;
903
901
  }
904
902
  } else {
905
903
  _widec = (short)(128 + ((*p) - -128));
906
904
  if (
907
- #line 492 "parser.rl"
905
+ #line 490 "parser.rl"
908
906
  json->allow_trailing_comma ) _widec += 256;
909
907
  }
910
908
  switch( _widec ) {
@@ -1018,7 +1016,7 @@ case 31:
1018
1016
  _out: {}
1019
1017
  }
1020
1018
 
1021
- #line 531 "parser.rl"
1019
+ #line 529 "parser.rl"
1022
1020
 
1023
1021
  if (cs >= JSON_object_first_final) {
1024
1022
  long count = json->stack->head - stack_head;
@@ -1069,7 +1067,7 @@ case 31:
1069
1067
  }
1070
1068
 
1071
1069
 
1072
- #line 1073 "parser.c"
1070
+ #line 1071 "parser.c"
1073
1071
  enum {JSON_value_start = 1};
1074
1072
  enum {JSON_value_first_final = 29};
1075
1073
  enum {JSON_value_error = 0};
@@ -1077,7 +1075,7 @@ enum {JSON_value_error = 0};
1077
1075
  enum {JSON_value_en_main = 1};
1078
1076
 
1079
1077
 
1080
- #line 664 "parser.rl"
1078
+ #line 662 "parser.rl"
1081
1079
 
1082
1080
 
1083
1081
  static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
@@ -1085,14 +1083,14 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
1085
1083
  int cs = EVIL;
1086
1084
 
1087
1085
 
1088
- #line 1089 "parser.c"
1086
+ #line 1087 "parser.c"
1089
1087
  {
1090
1088
  cs = JSON_value_start;
1091
1089
  }
1092
1090
 
1093
- #line 671 "parser.rl"
1091
+ #line 669 "parser.rl"
1094
1092
 
1095
- #line 1096 "parser.c"
1093
+ #line 1094 "parser.c"
1096
1094
  {
1097
1095
  if ( p == pe )
1098
1096
  goto _test_eof;
@@ -1126,7 +1124,7 @@ st0:
1126
1124
  cs = 0;
1127
1125
  goto _out;
1128
1126
  tr2:
1129
- #line 609 "parser.rl"
1127
+ #line 607 "parser.rl"
1130
1128
  {
1131
1129
  char *np = JSON_parse_string(json, p, pe, result);
1132
1130
  if (np == NULL) {
@@ -1138,7 +1136,7 @@ tr2:
1138
1136
  }
1139
1137
  goto st29;
1140
1138
  tr3:
1141
- #line 619 "parser.rl"
1139
+ #line 617 "parser.rl"
1142
1140
  {
1143
1141
  char *np;
1144
1142
  if(pe > p + 8 && !strncmp(MinusInfinity, p, 9)) {
@@ -1158,7 +1156,7 @@ tr3:
1158
1156
  }
1159
1157
  goto st29;
1160
1158
  tr7:
1161
- #line 637 "parser.rl"
1159
+ #line 635 "parser.rl"
1162
1160
  {
1163
1161
  char *np;
1164
1162
  json->in_array++;
@@ -1168,7 +1166,7 @@ tr7:
1168
1166
  }
1169
1167
  goto st29;
1170
1168
  tr11:
1171
- #line 645 "parser.rl"
1169
+ #line 643 "parser.rl"
1172
1170
  {
1173
1171
  char *np;
1174
1172
  np = JSON_parse_object(json, p, pe, result, current_nesting + 1);
@@ -1176,7 +1174,7 @@ tr11:
1176
1174
  }
1177
1175
  goto st29;
1178
1176
  tr25:
1179
- #line 602 "parser.rl"
1177
+ #line 600 "parser.rl"
1180
1178
  {
1181
1179
  if (json->allow_nan) {
1182
1180
  *result = CInfinity;
@@ -1186,7 +1184,7 @@ tr25:
1186
1184
  }
1187
1185
  goto st29;
1188
1186
  tr27:
1189
- #line 595 "parser.rl"
1187
+ #line 593 "parser.rl"
1190
1188
  {
1191
1189
  if (json->allow_nan) {
1192
1190
  *result = CNaN;
@@ -1196,19 +1194,19 @@ tr27:
1196
1194
  }
1197
1195
  goto st29;
1198
1196
  tr31:
1199
- #line 589 "parser.rl"
1197
+ #line 587 "parser.rl"
1200
1198
  {
1201
1199
  *result = Qfalse;
1202
1200
  }
1203
1201
  goto st29;
1204
1202
  tr34:
1205
- #line 586 "parser.rl"
1203
+ #line 584 "parser.rl"
1206
1204
  {
1207
1205
  *result = Qnil;
1208
1206
  }
1209
1207
  goto st29;
1210
1208
  tr37:
1211
- #line 592 "parser.rl"
1209
+ #line 590 "parser.rl"
1212
1210
  {
1213
1211
  *result = Qtrue;
1214
1212
  }
@@ -1217,9 +1215,9 @@ st29:
1217
1215
  if ( ++p == pe )
1218
1216
  goto _test_eof29;
1219
1217
  case 29:
1220
- #line 651 "parser.rl"
1218
+ #line 649 "parser.rl"
1221
1219
  { p--; {p++; cs = 29; goto _out;} }
1222
- #line 1223 "parser.c"
1220
+ #line 1221 "parser.c"
1223
1221
  switch( (*p) ) {
1224
1222
  case 13: goto st29;
1225
1223
  case 32: goto st29;
@@ -1460,7 +1458,7 @@ case 28:
1460
1458
  _out: {}
1461
1459
  }
1462
1460
 
1463
- #line 672 "parser.rl"
1461
+ #line 670 "parser.rl"
1464
1462
 
1465
1463
  if (json->freeze) {
1466
1464
  OBJ_FREEZE(*result);
@@ -1475,7 +1473,7 @@ case 28:
1475
1473
  }
1476
1474
 
1477
1475
 
1478
- #line 1479 "parser.c"
1476
+ #line 1477 "parser.c"
1479
1477
  enum {JSON_integer_start = 1};
1480
1478
  enum {JSON_integer_first_final = 3};
1481
1479
  enum {JSON_integer_error = 0};
@@ -1483,7 +1481,7 @@ enum {JSON_integer_error = 0};
1483
1481
  enum {JSON_integer_en_main = 1};
1484
1482
 
1485
1483
 
1486
- #line 693 "parser.rl"
1484
+ #line 691 "parser.rl"
1487
1485
 
1488
1486
 
1489
1487
  #define MAX_FAST_INTEGER_SIZE 18
@@ -1523,7 +1521,7 @@ static char *JSON_decode_integer(JSON_Parser *json, char *p, VALUE *result)
1523
1521
  }
1524
1522
 
1525
1523
 
1526
- #line 1527 "parser.c"
1524
+ #line 1525 "parser.c"
1527
1525
  enum {JSON_float_start = 1};
1528
1526
  enum {JSON_float_first_final = 6};
1529
1527
  enum {JSON_float_error = 0};
@@ -1531,7 +1529,7 @@ enum {JSON_float_error = 0};
1531
1529
  enum {JSON_float_en_main = 1};
1532
1530
 
1533
1531
 
1534
- #line 745 "parser.rl"
1532
+ #line 743 "parser.rl"
1535
1533
 
1536
1534
 
1537
1535
  static char *JSON_parse_number(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -1540,15 +1538,15 @@ static char *JSON_parse_number(JSON_Parser *json, char *p, char *pe, VALUE *resu
1540
1538
  bool is_float = false;
1541
1539
 
1542
1540
 
1543
- #line 1544 "parser.c"
1541
+ #line 1542 "parser.c"
1544
1542
  {
1545
1543
  cs = JSON_float_start;
1546
1544
  }
1547
1545
 
1548
- #line 753 "parser.rl"
1546
+ #line 751 "parser.rl"
1549
1547
  json->memo = p;
1550
1548
 
1551
- #line 1552 "parser.c"
1549
+ #line 1550 "parser.c"
1552
1550
  {
1553
1551
  if ( p == pe )
1554
1552
  goto _test_eof;
@@ -1588,24 +1586,24 @@ case 6:
1588
1586
  goto st0;
1589
1587
  goto tr7;
1590
1588
  tr7:
1591
- #line 737 "parser.rl"
1589
+ #line 735 "parser.rl"
1592
1590
  { p--; {p++; cs = 7; goto _out;} }
1593
1591
  goto st7;
1594
1592
  st7:
1595
1593
  if ( ++p == pe )
1596
1594
  goto _test_eof7;
1597
1595
  case 7:
1598
- #line 1599 "parser.c"
1596
+ #line 1597 "parser.c"
1599
1597
  goto st0;
1600
1598
  tr8:
1601
- #line 738 "parser.rl"
1599
+ #line 736 "parser.rl"
1602
1600
  { is_float = true; }
1603
1601
  goto st3;
1604
1602
  st3:
1605
1603
  if ( ++p == pe )
1606
1604
  goto _test_eof3;
1607
1605
  case 3:
1608
- #line 1609 "parser.c"
1606
+ #line 1607 "parser.c"
1609
1607
  if ( 48 <= (*p) && (*p) <= 57 )
1610
1608
  goto st8;
1611
1609
  goto st0;
@@ -1624,14 +1622,14 @@ case 8:
1624
1622
  goto st0;
1625
1623
  goto tr7;
1626
1624
  tr9:
1627
- #line 738 "parser.rl"
1625
+ #line 736 "parser.rl"
1628
1626
  { is_float = true; }
1629
1627
  goto st4;
1630
1628
  st4:
1631
1629
  if ( ++p == pe )
1632
1630
  goto _test_eof4;
1633
1631
  case 4:
1634
- #line 1635 "parser.c"
1632
+ #line 1633 "parser.c"
1635
1633
  switch( (*p) ) {
1636
1634
  case 43: goto st5;
1637
1635
  case 45: goto st5;
@@ -1688,7 +1686,7 @@ case 10:
1688
1686
  _out: {}
1689
1687
  }
1690
1688
 
1691
- #line 755 "parser.rl"
1689
+ #line 753 "parser.rl"
1692
1690
 
1693
1691
  if (cs >= JSON_float_first_final) {
1694
1692
  if (!is_float) {
@@ -1744,7 +1742,7 @@ case 10:
1744
1742
 
1745
1743
 
1746
1744
 
1747
- #line 1748 "parser.c"
1745
+ #line 1746 "parser.c"
1748
1746
  enum {JSON_array_start = 1};
1749
1747
  enum {JSON_array_first_final = 22};
1750
1748
  enum {JSON_array_error = 0};
@@ -1752,7 +1750,7 @@ enum {JSON_array_error = 0};
1752
1750
  enum {JSON_array_en_main = 1};
1753
1751
 
1754
1752
 
1755
- #line 835 "parser.rl"
1753
+ #line 833 "parser.rl"
1756
1754
 
1757
1755
 
1758
1756
  static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result, int current_nesting)
@@ -1765,14 +1763,14 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
1765
1763
  long stack_head = json->stack->head;
1766
1764
 
1767
1765
 
1768
- #line 1769 "parser.c"
1766
+ #line 1767 "parser.c"
1769
1767
  {
1770
1768
  cs = JSON_array_start;
1771
1769
  }
1772
1770
 
1773
- #line 847 "parser.rl"
1771
+ #line 845 "parser.rl"
1774
1772
 
1775
- #line 1776 "parser.c"
1773
+ #line 1774 "parser.c"
1776
1774
  {
1777
1775
  short _widec;
1778
1776
  if ( p == pe )
@@ -1812,7 +1810,7 @@ case 2:
1812
1810
  goto st2;
1813
1811
  goto st0;
1814
1812
  tr2:
1815
- #line 815 "parser.rl"
1813
+ #line 813 "parser.rl"
1816
1814
  {
1817
1815
  VALUE v = Qnil;
1818
1816
  char *np = JSON_parse_value(json, p, pe, &v, current_nesting);
@@ -1827,12 +1825,12 @@ st3:
1827
1825
  if ( ++p == pe )
1828
1826
  goto _test_eof3;
1829
1827
  case 3:
1830
- #line 1831 "parser.c"
1828
+ #line 1829 "parser.c"
1831
1829
  _widec = (*p);
1832
1830
  if ( 44 <= (*p) && (*p) <= 44 ) {
1833
1831
  _widec = (short)(128 + ((*p) - -128));
1834
1832
  if (
1835
- #line 825 "parser.rl"
1833
+ #line 823 "parser.rl"
1836
1834
  json->allow_trailing_comma ) _widec += 256;
1837
1835
  }
1838
1836
  switch( _widec ) {
@@ -1879,14 +1877,14 @@ case 7:
1879
1877
  goto st3;
1880
1878
  goto st7;
1881
1879
  tr4:
1882
- #line 827 "parser.rl"
1880
+ #line 825 "parser.rl"
1883
1881
  { p--; {p++; cs = 22; goto _out;} }
1884
1882
  goto st22;
1885
1883
  st22:
1886
1884
  if ( ++p == pe )
1887
1885
  goto _test_eof22;
1888
1886
  case 22:
1889
- #line 1890 "parser.c"
1887
+ #line 1888 "parser.c"
1890
1888
  goto st0;
1891
1889
  st8:
1892
1890
  if ( ++p == pe )
@@ -1954,13 +1952,13 @@ case 13:
1954
1952
  if ( 10 <= (*p) && (*p) <= 10 ) {
1955
1953
  _widec = (short)(128 + ((*p) - -128));
1956
1954
  if (
1957
- #line 825 "parser.rl"
1955
+ #line 823 "parser.rl"
1958
1956
  json->allow_trailing_comma ) _widec += 256;
1959
1957
  }
1960
1958
  } else if ( (*p) >= 9 ) {
1961
1959
  _widec = (short)(128 + ((*p) - -128));
1962
1960
  if (
1963
- #line 825 "parser.rl"
1961
+ #line 823 "parser.rl"
1964
1962
  json->allow_trailing_comma ) _widec += 256;
1965
1963
  }
1966
1964
  } else if ( (*p) > 13 ) {
@@ -1968,19 +1966,19 @@ case 13:
1968
1966
  if ( 47 <= (*p) && (*p) <= 47 ) {
1969
1967
  _widec = (short)(128 + ((*p) - -128));
1970
1968
  if (
1971
- #line 825 "parser.rl"
1969
+ #line 823 "parser.rl"
1972
1970
  json->allow_trailing_comma ) _widec += 256;
1973
1971
  }
1974
1972
  } else if ( (*p) >= 32 ) {
1975
1973
  _widec = (short)(128 + ((*p) - -128));
1976
1974
  if (
1977
- #line 825 "parser.rl"
1975
+ #line 823 "parser.rl"
1978
1976
  json->allow_trailing_comma ) _widec += 256;
1979
1977
  }
1980
1978
  } else {
1981
1979
  _widec = (short)(128 + ((*p) - -128));
1982
1980
  if (
1983
- #line 825 "parser.rl"
1981
+ #line 823 "parser.rl"
1984
1982
  json->allow_trailing_comma ) _widec += 256;
1985
1983
  }
1986
1984
  switch( _widec ) {
@@ -2019,13 +2017,13 @@ case 14:
2019
2017
  if ( 47 <= (*p) && (*p) <= 47 ) {
2020
2018
  _widec = (short)(128 + ((*p) - -128));
2021
2019
  if (
2022
- #line 825 "parser.rl"
2020
+ #line 823 "parser.rl"
2023
2021
  json->allow_trailing_comma ) _widec += 256;
2024
2022
  }
2025
2023
  } else if ( (*p) >= 42 ) {
2026
2024
  _widec = (short)(128 + ((*p) - -128));
2027
2025
  if (
2028
- #line 825 "parser.rl"
2026
+ #line 823 "parser.rl"
2029
2027
  json->allow_trailing_comma ) _widec += 256;
2030
2028
  }
2031
2029
  switch( _widec ) {
@@ -2044,20 +2042,20 @@ case 15:
2044
2042
  if ( (*p) <= 41 ) {
2045
2043
  _widec = (short)(128 + ((*p) - -128));
2046
2044
  if (
2047
- #line 825 "parser.rl"
2045
+ #line 823 "parser.rl"
2048
2046
  json->allow_trailing_comma ) _widec += 256;
2049
2047
  }
2050
2048
  } else if ( (*p) > 42 ) {
2051
2049
  if ( 43 <= (*p) )
2052
2050
  { _widec = (short)(128 + ((*p) - -128));
2053
2051
  if (
2054
- #line 825 "parser.rl"
2052
+ #line 823 "parser.rl"
2055
2053
  json->allow_trailing_comma ) _widec += 256;
2056
2054
  }
2057
2055
  } else {
2058
2056
  _widec = (short)(128 + ((*p) - -128));
2059
2057
  if (
2060
- #line 825 "parser.rl"
2058
+ #line 823 "parser.rl"
2061
2059
  json->allow_trailing_comma ) _widec += 256;
2062
2060
  }
2063
2061
  switch( _widec ) {
@@ -2080,13 +2078,13 @@ case 16:
2080
2078
  if ( 42 <= (*p) && (*p) <= 42 ) {
2081
2079
  _widec = (short)(128 + ((*p) - -128));
2082
2080
  if (
2083
- #line 825 "parser.rl"
2081
+ #line 823 "parser.rl"
2084
2082
  json->allow_trailing_comma ) _widec += 256;
2085
2083
  }
2086
2084
  } else {
2087
2085
  _widec = (short)(128 + ((*p) - -128));
2088
2086
  if (
2089
- #line 825 "parser.rl"
2087
+ #line 823 "parser.rl"
2090
2088
  json->allow_trailing_comma ) _widec += 256;
2091
2089
  }
2092
2090
  } else if ( (*p) > 46 ) {
@@ -2094,19 +2092,19 @@ case 16:
2094
2092
  if ( 48 <= (*p) )
2095
2093
  { _widec = (short)(128 + ((*p) - -128));
2096
2094
  if (
2097
- #line 825 "parser.rl"
2095
+ #line 823 "parser.rl"
2098
2096
  json->allow_trailing_comma ) _widec += 256;
2099
2097
  }
2100
2098
  } else if ( (*p) >= 47 ) {
2101
2099
  _widec = (short)(128 + ((*p) - -128));
2102
2100
  if (
2103
- #line 825 "parser.rl"
2101
+ #line 823 "parser.rl"
2104
2102
  json->allow_trailing_comma ) _widec += 256;
2105
2103
  }
2106
2104
  } else {
2107
2105
  _widec = (short)(128 + ((*p) - -128));
2108
2106
  if (
2109
- #line 825 "parser.rl"
2107
+ #line 823 "parser.rl"
2110
2108
  json->allow_trailing_comma ) _widec += 256;
2111
2109
  }
2112
2110
  switch( _widec ) {
@@ -2130,20 +2128,20 @@ case 17:
2130
2128
  if ( (*p) <= 9 ) {
2131
2129
  _widec = (short)(128 + ((*p) - -128));
2132
2130
  if (
2133
- #line 825 "parser.rl"
2131
+ #line 823 "parser.rl"
2134
2132
  json->allow_trailing_comma ) _widec += 256;
2135
2133
  }
2136
2134
  } else if ( (*p) > 10 ) {
2137
2135
  if ( 11 <= (*p) )
2138
2136
  { _widec = (short)(128 + ((*p) - -128));
2139
2137
  if (
2140
- #line 825 "parser.rl"
2138
+ #line 823 "parser.rl"
2141
2139
  json->allow_trailing_comma ) _widec += 256;
2142
2140
  }
2143
2141
  } else {
2144
2142
  _widec = (short)(128 + ((*p) - -128));
2145
2143
  if (
2146
- #line 825 "parser.rl"
2144
+ #line 823 "parser.rl"
2147
2145
  json->allow_trailing_comma ) _widec += 256;
2148
2146
  }
2149
2147
  switch( _widec ) {
@@ -2215,7 +2213,7 @@ case 21:
2215
2213
  _out: {}
2216
2214
  }
2217
2215
 
2218
- #line 848 "parser.rl"
2216
+ #line 846 "parser.rl"
2219
2217
 
2220
2218
  if(cs >= JSON_array_first_final) {
2221
2219
  long count = json->stack->head - stack_head;
@@ -2409,7 +2407,7 @@ static VALUE json_string_unescape(JSON_Parser *json, char *string, char *stringE
2409
2407
  }
2410
2408
 
2411
2409
 
2412
- #line 2413 "parser.c"
2410
+ #line 2411 "parser.c"
2413
2411
  enum {JSON_string_start = 1};
2414
2412
  enum {JSON_string_first_final = 9};
2415
2413
  enum {JSON_string_error = 0};
@@ -2417,7 +2415,7 @@ enum {JSON_string_error = 0};
2417
2415
  enum {JSON_string_en_main = 1};
2418
2416
 
2419
2417
 
2420
- #line 1071 "parser.rl"
2418
+ #line 1069 "parser.rl"
2421
2419
 
2422
2420
 
2423
2421
  static int
@@ -2438,15 +2436,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
2438
2436
  VALUE match_string;
2439
2437
 
2440
2438
 
2441
- #line 2442 "parser.c"
2439
+ #line 2440 "parser.c"
2442
2440
  {
2443
2441
  cs = JSON_string_start;
2444
2442
  }
2445
2443
 
2446
- #line 1091 "parser.rl"
2444
+ #line 1089 "parser.rl"
2447
2445
  json->memo = p;
2448
2446
 
2449
- #line 2450 "parser.c"
2447
+ #line 2448 "parser.c"
2450
2448
  {
2451
2449
  if ( p == pe )
2452
2450
  goto _test_eof;
@@ -2471,14 +2469,14 @@ case 2:
2471
2469
  goto st0;
2472
2470
  goto st2;
2473
2471
  tr2:
2474
- #line 1053 "parser.rl"
2472
+ #line 1051 "parser.rl"
2475
2473
  {
2476
2474
  *result = json_string_fastpath(json, json->memo + 1, p, json->parsing_name, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
2477
2475
  {p = (( p + 1))-1;}
2478
2476
  p--;
2479
2477
  {p++; cs = 9; goto _out;}
2480
2478
  }
2481
- #line 1046 "parser.rl"
2479
+ #line 1044 "parser.rl"
2482
2480
  {
2483
2481
  *result = json_string_unescape(json, json->memo + 1, p, json->parsing_name, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
2484
2482
  {p = (( p + 1))-1;}
@@ -2487,7 +2485,7 @@ tr2:
2487
2485
  }
2488
2486
  goto st9;
2489
2487
  tr6:
2490
- #line 1046 "parser.rl"
2488
+ #line 1044 "parser.rl"
2491
2489
  {
2492
2490
  *result = json_string_unescape(json, json->memo + 1, p, json->parsing_name, json->parsing_name || json-> freeze, json->parsing_name && json->symbolize_names);
2493
2491
  {p = (( p + 1))-1;}
@@ -2499,7 +2497,7 @@ st9:
2499
2497
  if ( ++p == pe )
2500
2498
  goto _test_eof9;
2501
2499
  case 9:
2502
- #line 2503 "parser.c"
2500
+ #line 2501 "parser.c"
2503
2501
  goto st0;
2504
2502
  st3:
2505
2503
  if ( ++p == pe )
@@ -2587,7 +2585,7 @@ case 8:
2587
2585
  _out: {}
2588
2586
  }
2589
2587
 
2590
- #line 1093 "parser.rl"
2588
+ #line 1091 "parser.rl"
2591
2589
 
2592
2590
  if (json->create_additions && RTEST(match_string = json->match_string)) {
2593
2591
  VALUE klass;
@@ -2740,7 +2738,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
2740
2738
  }
2741
2739
 
2742
2740
 
2743
- #line 2744 "parser.c"
2741
+ #line 2742 "parser.c"
2744
2742
  enum {JSON_start = 1};
2745
2743
  enum {JSON_first_final = 10};
2746
2744
  enum {JSON_error = 0};
@@ -2748,7 +2746,7 @@ enum {JSON_error = 0};
2748
2746
  enum {JSON_en_main = 1};
2749
2747
 
2750
2748
 
2751
- #line 1259 "parser.rl"
2749
+ #line 1257 "parser.rl"
2752
2750
 
2753
2751
 
2754
2752
  /*
@@ -2777,16 +2775,16 @@ static VALUE cParser_parse(VALUE self)
2777
2775
  json->stack = &stack;
2778
2776
 
2779
2777
 
2780
- #line 2781 "parser.c"
2778
+ #line 2779 "parser.c"
2781
2779
  {
2782
2780
  cs = JSON_start;
2783
2781
  }
2784
2782
 
2785
- #line 1287 "parser.rl"
2783
+ #line 1285 "parser.rl"
2786
2784
  p = json->source;
2787
2785
  pe = p + json->len;
2788
2786
 
2789
- #line 2790 "parser.c"
2787
+ #line 2788 "parser.c"
2790
2788
  {
2791
2789
  if ( p == pe )
2792
2790
  goto _test_eof;
@@ -2820,7 +2818,7 @@ st0:
2820
2818
  cs = 0;
2821
2819
  goto _out;
2822
2820
  tr2:
2823
- #line 1251 "parser.rl"
2821
+ #line 1249 "parser.rl"
2824
2822
  {
2825
2823
  char *np = JSON_parse_value(json, p, pe, &result, 0);
2826
2824
  if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
@@ -2830,7 +2828,7 @@ st10:
2830
2828
  if ( ++p == pe )
2831
2829
  goto _test_eof10;
2832
2830
  case 10:
2833
- #line 2834 "parser.c"
2831
+ #line 2832 "parser.c"
2834
2832
  switch( (*p) ) {
2835
2833
  case 13: goto st10;
2836
2834
  case 32: goto st10;
@@ -2919,7 +2917,7 @@ case 9:
2919
2917
  _out: {}
2920
2918
  }
2921
2919
 
2922
- #line 1290 "parser.rl"
2920
+ #line 1288 "parser.rl"
2923
2921
 
2924
2922
  if (json->stack_handle) {
2925
2923
  rvalue_stack_eagerly_release(json->stack_handle);
@@ -2955,16 +2953,16 @@ static VALUE cParser_m_parse(VALUE klass, VALUE source, VALUE opts)
2955
2953
  json->stack = &stack;
2956
2954
 
2957
2955
 
2958
- #line 2959 "parser.c"
2956
+ #line 2957 "parser.c"
2959
2957
  {
2960
2958
  cs = JSON_start;
2961
2959
  }
2962
2960
 
2963
- #line 1325 "parser.rl"
2961
+ #line 1323 "parser.rl"
2964
2962
  p = json->source;
2965
2963
  pe = p + json->len;
2966
2964
 
2967
- #line 2968 "parser.c"
2965
+ #line 2966 "parser.c"
2968
2966
  {
2969
2967
  if ( p == pe )
2970
2968
  goto _test_eof;
@@ -2998,7 +2996,7 @@ st0:
2998
2996
  cs = 0;
2999
2997
  goto _out;
3000
2998
  tr2:
3001
- #line 1251 "parser.rl"
2999
+ #line 1249 "parser.rl"
3002
3000
  {
3003
3001
  char *np = JSON_parse_value(json, p, pe, &result, 0);
3004
3002
  if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
@@ -3008,7 +3006,7 @@ st10:
3008
3006
  if ( ++p == pe )
3009
3007
  goto _test_eof10;
3010
3008
  case 10:
3011
- #line 3012 "parser.c"
3009
+ #line 3010 "parser.c"
3012
3010
  switch( (*p) ) {
3013
3011
  case 13: goto st10;
3014
3012
  case 32: goto st10;
@@ -3097,7 +3095,7 @@ case 9:
3097
3095
  _out: {}
3098
3096
  }
3099
3097
 
3100
- #line 1328 "parser.rl"
3098
+ #line 1326 "parser.rl"
3101
3099
 
3102
3100
  if (json->stack_handle) {
3103
3101
  rvalue_stack_eagerly_release(json->stack_handle);
@@ -3122,8 +3120,10 @@ static void JSON_mark(void *ptr)
3122
3120
  rb_gc_mark(json->match_string);
3123
3121
  rb_gc_mark(json->stack_handle);
3124
3122
 
3125
- const VALUE *name_cache_entries = &json->name_cache.entries[0];
3126
- rb_gc_mark_locations(name_cache_entries, name_cache_entries + json->name_cache.length);
3123
+ long index;
3124
+ for (index = 0; index < json->name_cache.length; index++) {
3125
+ rb_gc_mark(json->name_cache.entries[index]);
3126
+ }
3127
3127
  }
3128
3128
 
3129
3129
  static void JSON_free(void *ptr)