json-maglev- 1.6.1 → 1.6.3

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.
@@ -1,5 +1,6 @@
1
1
 
2
2
  #line 1 "parser.rl"
3
+ #include "../fbuffer/fbuffer.h"
3
4
  #include "parser.h"
4
5
 
5
6
  /* unicode */
@@ -83,11 +84,11 @@ static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
83
84
  i_match_string, i_aset, i_leftshift;
84
85
 
85
86
 
86
- #line 109 "parser.rl"
87
+ #line 110 "parser.rl"
87
88
 
88
89
 
89
90
 
90
- #line 91 "parser.c"
91
+ #line 92 "parser.c"
91
92
  static const int JSON_object_start = 1;
92
93
  static const int JSON_object_first_final = 27;
93
94
  static const int JSON_object_error = 0;
@@ -95,7 +96,7 @@ static const int JSON_object_error = 0;
95
96
  static const int JSON_object_en_main = 1;
96
97
 
97
98
 
98
- #line 150 "parser.rl"
99
+ #line 151 "parser.rl"
99
100
 
100
101
 
101
102
  static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -111,14 +112,14 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu
111
112
  *result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class);
112
113
 
113
114
 
114
- #line 115 "parser.c"
115
+ #line 116 "parser.c"
115
116
  {
116
117
  cs = JSON_object_start;
117
118
  }
118
119
 
119
- #line 165 "parser.rl"
120
+ #line 166 "parser.rl"
120
121
 
121
- #line 122 "parser.c"
122
+ #line 123 "parser.c"
122
123
  {
123
124
  if ( p == pe )
124
125
  goto _test_eof;
@@ -146,7 +147,7 @@ case 2:
146
147
  goto st2;
147
148
  goto st0;
148
149
  tr2:
149
- #line 132 "parser.rl"
150
+ #line 133 "parser.rl"
150
151
  {
151
152
  char *np;
152
153
  json->parsing_name = 1;
@@ -159,7 +160,7 @@ st3:
159
160
  if ( ++p == pe )
160
161
  goto _test_eof3;
161
162
  case 3:
162
- #line 163 "parser.c"
163
+ #line 164 "parser.c"
163
164
  switch( (*p) ) {
164
165
  case 13: goto st3;
165
166
  case 32: goto st3;
@@ -226,7 +227,7 @@ case 8:
226
227
  goto st8;
227
228
  goto st0;
228
229
  tr11:
229
- #line 117 "parser.rl"
230
+ #line 118 "parser.rl"
230
231
  {
231
232
  VALUE v = Qnil;
232
233
  char *np = JSON_parse_value(json, p, pe, &v);
@@ -246,7 +247,7 @@ st9:
246
247
  if ( ++p == pe )
247
248
  goto _test_eof9;
248
249
  case 9:
249
- #line 250 "parser.c"
250
+ #line 251 "parser.c"
250
251
  switch( (*p) ) {
251
252
  case 13: goto st9;
252
253
  case 32: goto st9;
@@ -335,14 +336,14 @@ case 18:
335
336
  goto st9;
336
337
  goto st18;
337
338
  tr4:
338
- #line 140 "parser.rl"
339
+ #line 141 "parser.rl"
339
340
  { p--; {p++; cs = 27; goto _out;} }
340
341
  goto st27;
341
342
  st27:
342
343
  if ( ++p == pe )
343
344
  goto _test_eof27;
344
345
  case 27:
345
- #line 346 "parser.c"
346
+ #line 347 "parser.c"
346
347
  goto st0;
347
348
  st19:
348
349
  if ( ++p == pe )
@@ -440,7 +441,7 @@ case 26:
440
441
  _out: {}
441
442
  }
442
443
 
443
- #line 166 "parser.rl"
444
+ #line 167 "parser.rl"
444
445
 
445
446
  if (cs >= JSON_object_first_final) {
446
447
  if (json->create_additions) {
@@ -460,7 +461,7 @@ case 26:
460
461
 
461
462
 
462
463
 
463
- #line 464 "parser.c"
464
+ #line 465 "parser.c"
464
465
  static const int JSON_value_start = 1;
465
466
  static const int JSON_value_first_final = 21;
466
467
  static const int JSON_value_error = 0;
@@ -468,7 +469,7 @@ static const int JSON_value_error = 0;
468
469
  static const int JSON_value_en_main = 1;
469
470
 
470
471
 
471
- #line 265 "parser.rl"
472
+ #line 266 "parser.rl"
472
473
 
473
474
 
474
475
  static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -476,14 +477,14 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
476
477
  int cs = EVIL;
477
478
 
478
479
 
479
- #line 480 "parser.c"
480
+ #line 481 "parser.c"
480
481
  {
481
482
  cs = JSON_value_start;
482
483
  }
483
484
 
484
- #line 272 "parser.rl"
485
+ #line 273 "parser.rl"
485
486
 
486
- #line 487 "parser.c"
487
+ #line 488 "parser.c"
487
488
  {
488
489
  if ( p == pe )
489
490
  goto _test_eof;
@@ -508,14 +509,14 @@ st0:
508
509
  cs = 0;
509
510
  goto _out;
510
511
  tr0:
511
- #line 213 "parser.rl"
512
+ #line 214 "parser.rl"
512
513
  {
513
514
  char *np = JSON_parse_string(json, p, pe, result);
514
515
  if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
515
516
  }
516
517
  goto st21;
517
518
  tr2:
518
- #line 218 "parser.rl"
519
+ #line 219 "parser.rl"
519
520
  {
520
521
  char *np;
521
522
  if(pe > p + 9 - json->quirks_mode && !strncmp(MinusInfinity, p, 9)) {
@@ -535,7 +536,7 @@ tr2:
535
536
  }
536
537
  goto st21;
537
538
  tr5:
538
- #line 236 "parser.rl"
539
+ #line 237 "parser.rl"
539
540
  {
540
541
  char *np;
541
542
  json->current_nesting++;
@@ -545,7 +546,7 @@ tr5:
545
546
  }
546
547
  goto st21;
547
548
  tr9:
548
- #line 244 "parser.rl"
549
+ #line 245 "parser.rl"
549
550
  {
550
551
  char *np;
551
552
  json->current_nesting++;
@@ -555,7 +556,7 @@ tr9:
555
556
  }
556
557
  goto st21;
557
558
  tr16:
558
- #line 206 "parser.rl"
559
+ #line 207 "parser.rl"
559
560
  {
560
561
  if (json->allow_nan) {
561
562
  *result = CInfinity;
@@ -565,7 +566,7 @@ tr16:
565
566
  }
566
567
  goto st21;
567
568
  tr18:
568
- #line 199 "parser.rl"
569
+ #line 200 "parser.rl"
569
570
  {
570
571
  if (json->allow_nan) {
571
572
  *result = CNaN;
@@ -575,19 +576,19 @@ tr18:
575
576
  }
576
577
  goto st21;
577
578
  tr22:
578
- #line 193 "parser.rl"
579
+ #line 194 "parser.rl"
579
580
  {
580
581
  *result = Qfalse;
581
582
  }
582
583
  goto st21;
583
584
  tr25:
584
- #line 190 "parser.rl"
585
+ #line 191 "parser.rl"
585
586
  {
586
587
  *result = Qnil;
587
588
  }
588
589
  goto st21;
589
590
  tr28:
590
- #line 196 "parser.rl"
591
+ #line 197 "parser.rl"
591
592
  {
592
593
  *result = Qtrue;
593
594
  }
@@ -596,9 +597,9 @@ st21:
596
597
  if ( ++p == pe )
597
598
  goto _test_eof21;
598
599
  case 21:
599
- #line 252 "parser.rl"
600
+ #line 253 "parser.rl"
600
601
  { p--; {p++; cs = 21; goto _out;} }
601
- #line 602 "parser.c"
602
+ #line 603 "parser.c"
602
603
  goto st0;
603
604
  st2:
604
605
  if ( ++p == pe )
@@ -759,7 +760,7 @@ case 20:
759
760
  _out: {}
760
761
  }
761
762
 
762
- #line 273 "parser.rl"
763
+ #line 274 "parser.rl"
763
764
 
764
765
  if (cs >= JSON_value_first_final) {
765
766
  return p;
@@ -769,7 +770,7 @@ case 20:
769
770
  }
770
771
 
771
772
 
772
- #line 773 "parser.c"
773
+ #line 774 "parser.c"
773
774
  static const int JSON_integer_start = 1;
774
775
  static const int JSON_integer_first_final = 3;
775
776
  static const int JSON_integer_error = 0;
@@ -777,7 +778,7 @@ static const int JSON_integer_error = 0;
777
778
  static const int JSON_integer_en_main = 1;
778
779
 
779
780
 
780
- #line 289 "parser.rl"
781
+ #line 290 "parser.rl"
781
782
 
782
783
 
783
784
  static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -785,15 +786,15 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res
785
786
  int cs = EVIL;
786
787
 
787
788
 
788
- #line 789 "parser.c"
789
+ #line 790 "parser.c"
789
790
  {
790
791
  cs = JSON_integer_start;
791
792
  }
792
793
 
793
- #line 296 "parser.rl"
794
+ #line 297 "parser.rl"
794
795
  json->memo = p;
795
796
 
796
- #line 797 "parser.c"
797
+ #line 798 "parser.c"
797
798
  {
798
799
  if ( p == pe )
799
800
  goto _test_eof;
@@ -827,14 +828,14 @@ case 3:
827
828
  goto st0;
828
829
  goto tr4;
829
830
  tr4:
830
- #line 286 "parser.rl"
831
+ #line 287 "parser.rl"
831
832
  { p--; {p++; cs = 4; goto _out;} }
832
833
  goto st4;
833
834
  st4:
834
835
  if ( ++p == pe )
835
836
  goto _test_eof4;
836
837
  case 4:
837
- #line 838 "parser.c"
838
+ #line 839 "parser.c"
838
839
  goto st0;
839
840
  st5:
840
841
  if ( ++p == pe )
@@ -853,11 +854,14 @@ case 5:
853
854
  _out: {}
854
855
  }
855
856
 
856
- #line 298 "parser.rl"
857
+ #line 299 "parser.rl"
857
858
 
858
859
  if (cs >= JSON_integer_first_final) {
859
860
  long len = p - json->memo;
860
- *result = rb_Integer(rb_str_new(json->memo, len));
861
+ fbuffer_clear(json->fbuffer);
862
+ fbuffer_append(json->fbuffer, json->memo, len);
863
+ fbuffer_append_char(json->fbuffer, '\0');
864
+ *result = rb_cstr2inum(FBUFFER_PTR(json->fbuffer), 10);
861
865
  return p + 1;
862
866
  } else {
863
867
  return NULL;
@@ -865,7 +869,7 @@ case 5:
865
869
  }
866
870
 
867
871
 
868
- #line 869 "parser.c"
872
+ #line 873 "parser.c"
869
873
  static const int JSON_float_start = 1;
870
874
  static const int JSON_float_first_final = 8;
871
875
  static const int JSON_float_error = 0;
@@ -873,7 +877,7 @@ static const int JSON_float_error = 0;
873
877
  static const int JSON_float_en_main = 1;
874
878
 
875
879
 
876
- #line 320 "parser.rl"
880
+ #line 324 "parser.rl"
877
881
 
878
882
 
879
883
  static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -881,15 +885,15 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
881
885
  int cs = EVIL;
882
886
 
883
887
 
884
- #line 885 "parser.c"
888
+ #line 889 "parser.c"
885
889
  {
886
890
  cs = JSON_float_start;
887
891
  }
888
892
 
889
- #line 327 "parser.rl"
893
+ #line 331 "parser.rl"
890
894
  json->memo = p;
891
895
 
892
- #line 893 "parser.c"
896
+ #line 897 "parser.c"
893
897
  {
894
898
  if ( p == pe )
895
899
  goto _test_eof;
@@ -947,14 +951,14 @@ case 8:
947
951
  goto st0;
948
952
  goto tr9;
949
953
  tr9:
950
- #line 314 "parser.rl"
954
+ #line 318 "parser.rl"
951
955
  { p--; {p++; cs = 9; goto _out;} }
952
956
  goto st9;
953
957
  st9:
954
958
  if ( ++p == pe )
955
959
  goto _test_eof9;
956
960
  case 9:
957
- #line 958 "parser.c"
961
+ #line 962 "parser.c"
958
962
  goto st0;
959
963
  st5:
960
964
  if ( ++p == pe )
@@ -1015,11 +1019,14 @@ case 7:
1015
1019
  _out: {}
1016
1020
  }
1017
1021
 
1018
- #line 329 "parser.rl"
1022
+ #line 333 "parser.rl"
1019
1023
 
1020
1024
  if (cs >= JSON_float_first_final) {
1021
1025
  long len = p - json->memo;
1022
- *result = rb_Float(rb_str_new(json->memo, len));
1026
+ fbuffer_clear(json->fbuffer);
1027
+ fbuffer_append(json->fbuffer, json->memo, len);
1028
+ fbuffer_append_char(json->fbuffer, '\0');
1029
+ *result = rb_float_new(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
1023
1030
  return p + 1;
1024
1031
  } else {
1025
1032
  return NULL;
@@ -1028,7 +1035,7 @@ case 7:
1028
1035
 
1029
1036
 
1030
1037
 
1031
- #line 1032 "parser.c"
1038
+ #line 1039 "parser.c"
1032
1039
  static const int JSON_array_start = 1;
1033
1040
  static const int JSON_array_first_final = 17;
1034
1041
  static const int JSON_array_error = 0;
@@ -1036,7 +1043,7 @@ static const int JSON_array_error = 0;
1036
1043
  static const int JSON_array_en_main = 1;
1037
1044
 
1038
1045
 
1039
- #line 369 "parser.rl"
1046
+ #line 376 "parser.rl"
1040
1047
 
1041
1048
 
1042
1049
  static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result)
@@ -1050,14 +1057,14 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
1050
1057
  *result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class);
1051
1058
 
1052
1059
 
1053
- #line 1054 "parser.c"
1060
+ #line 1061 "parser.c"
1054
1061
  {
1055
1062
  cs = JSON_array_start;
1056
1063
  }
1057
1064
 
1058
- #line 382 "parser.rl"
1065
+ #line 389 "parser.rl"
1059
1066
 
1060
- #line 1061 "parser.c"
1067
+ #line 1068 "parser.c"
1061
1068
  {
1062
1069
  if ( p == pe )
1063
1070
  goto _test_eof;
@@ -1096,7 +1103,7 @@ case 2:
1096
1103
  goto st2;
1097
1104
  goto st0;
1098
1105
  tr2:
1099
- #line 346 "parser.rl"
1106
+ #line 353 "parser.rl"
1100
1107
  {
1101
1108
  VALUE v = Qnil;
1102
1109
  char *np = JSON_parse_value(json, p, pe, &v);
@@ -1116,7 +1123,7 @@ st3:
1116
1123
  if ( ++p == pe )
1117
1124
  goto _test_eof3;
1118
1125
  case 3:
1119
- #line 1120 "parser.c"
1126
+ #line 1127 "parser.c"
1120
1127
  switch( (*p) ) {
1121
1128
  case 13: goto st3;
1122
1129
  case 32: goto st3;
@@ -1216,14 +1223,14 @@ case 12:
1216
1223
  goto st3;
1217
1224
  goto st12;
1218
1225
  tr4:
1219
- #line 361 "parser.rl"
1226
+ #line 368 "parser.rl"
1220
1227
  { p--; {p++; cs = 17; goto _out;} }
1221
1228
  goto st17;
1222
1229
  st17:
1223
1230
  if ( ++p == pe )
1224
1231
  goto _test_eof17;
1225
1232
  case 17:
1226
- #line 1227 "parser.c"
1233
+ #line 1234 "parser.c"
1227
1234
  goto st0;
1228
1235
  st13:
1229
1236
  if ( ++p == pe )
@@ -1279,7 +1286,7 @@ case 16:
1279
1286
  _out: {}
1280
1287
  }
1281
1288
 
1282
- #line 383 "parser.rl"
1289
+ #line 390 "parser.rl"
1283
1290
 
1284
1291
  if(cs >= JSON_array_first_final) {
1285
1292
  return p + 1;
@@ -1360,7 +1367,7 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
1360
1367
  }
1361
1368
 
1362
1369
 
1363
- #line 1364 "parser.c"
1370
+ #line 1371 "parser.c"
1364
1371
  static const int JSON_string_start = 1;
1365
1372
  static const int JSON_string_first_final = 8;
1366
1373
  static const int JSON_string_error = 0;
@@ -1368,7 +1375,7 @@ static const int JSON_string_error = 0;
1368
1375
  static const int JSON_string_en_main = 1;
1369
1376
 
1370
1377
 
1371
- #line 482 "parser.rl"
1378
+ #line 489 "parser.rl"
1372
1379
 
1373
1380
 
1374
1381
  static int
@@ -1390,15 +1397,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
1390
1397
 
1391
1398
  *result = rb_str_buf_new(0);
1392
1399
 
1393
- #line 1394 "parser.c"
1400
+ #line 1401 "parser.c"
1394
1401
  {
1395
1402
  cs = JSON_string_start;
1396
1403
  }
1397
1404
 
1398
- #line 503 "parser.rl"
1405
+ #line 510 "parser.rl"
1399
1406
  json->memo = p;
1400
1407
 
1401
- #line 1402 "parser.c"
1408
+ #line 1409 "parser.c"
1402
1409
  {
1403
1410
  if ( p == pe )
1404
1411
  goto _test_eof;
@@ -1423,7 +1430,7 @@ case 2:
1423
1430
  goto st0;
1424
1431
  goto st2;
1425
1432
  tr2:
1426
- #line 468 "parser.rl"
1433
+ #line 475 "parser.rl"
1427
1434
  {
1428
1435
  *result = json_string_unescape(*result, json->memo + 1, p);
1429
1436
  if (NIL_P(*result)) {
@@ -1434,14 +1441,14 @@ tr2:
1434
1441
  {p = (( p + 1))-1;}
1435
1442
  }
1436
1443
  }
1437
- #line 479 "parser.rl"
1444
+ #line 486 "parser.rl"
1438
1445
  { p--; {p++; cs = 8; goto _out;} }
1439
1446
  goto st8;
1440
1447
  st8:
1441
1448
  if ( ++p == pe )
1442
1449
  goto _test_eof8;
1443
1450
  case 8:
1444
- #line 1445 "parser.c"
1451
+ #line 1452 "parser.c"
1445
1452
  goto st0;
1446
1453
  st3:
1447
1454
  if ( ++p == pe )
@@ -1517,7 +1524,7 @@ case 7:
1517
1524
  _out: {}
1518
1525
  }
1519
1526
 
1520
- #line 505 "parser.rl"
1527
+ #line 512 "parser.rl"
1521
1528
 
1522
1529
  if (json->create_additions && RTEST(match_string = json->match_string)) {
1523
1530
  VALUE klass;
@@ -1628,9 +1635,6 @@ static VALUE convert_encoding(VALUE source)
1628
1635
  * defaults to true.
1629
1636
  * * *object_class*: Defaults to Hash
1630
1637
  * * *array_class*: Defaults to Array
1631
- * * *quirks_mode*: Enables quirks_mode for parser, that is for example
1632
- * parsing single JSON values instead of documents is possible.
1633
- *
1634
1638
  */
1635
1639
  static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1636
1640
  {
@@ -1717,6 +1721,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1717
1721
  json->object_class = Qnil;
1718
1722
  json->array_class = Qnil;
1719
1723
  }
1724
+ source = rb_convert_type(source, T_STRING, "String", "to_str");
1720
1725
  if (!json->quirks_mode) {
1721
1726
  source = convert_encoding(StringValue(source));
1722
1727
  }
@@ -1728,7 +1733,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
1728
1733
  }
1729
1734
 
1730
1735
 
1731
- #line 1729 "parser.c"
1736
+ #line 1737 "parser.c"
1732
1737
  static const int JSON_start = 1;
1733
1738
  static const int JSON_first_final = 10;
1734
1739
  static const int JSON_error = 0;
@@ -1736,7 +1741,7 @@ static const int JSON_error = 0;
1736
1741
  static const int JSON_en_main = 1;
1737
1742
 
1738
1743
 
1739
- #line 736 "parser.rl"
1744
+ #line 744 "parser.rl"
1740
1745
 
1741
1746
 
1742
1747
  static VALUE cParser_parse_strict(VALUE self)
@@ -1747,16 +1752,16 @@ static VALUE cParser_parse_strict(VALUE self)
1747
1752
  GET_PARSER;
1748
1753
 
1749
1754
 
1750
- #line 1748 "parser.c"
1755
+ #line 1756 "parser.c"
1751
1756
  {
1752
1757
  cs = JSON_start;
1753
1758
  }
1754
1759
 
1755
- #line 746 "parser.rl"
1760
+ #line 754 "parser.rl"
1756
1761
  p = json->source;
1757
1762
  pe = p + json->len;
1758
1763
 
1759
- #line 1757 "parser.c"
1764
+ #line 1765 "parser.c"
1760
1765
  {
1761
1766
  if ( p == pe )
1762
1767
  goto _test_eof;
@@ -1812,7 +1817,7 @@ case 5:
1812
1817
  goto st1;
1813
1818
  goto st5;
1814
1819
  tr3:
1815
- #line 725 "parser.rl"
1820
+ #line 733 "parser.rl"
1816
1821
  {
1817
1822
  char *np;
1818
1823
  json->current_nesting = 1;
@@ -1821,7 +1826,7 @@ tr3:
1821
1826
  }
1822
1827
  goto st10;
1823
1828
  tr4:
1824
- #line 718 "parser.rl"
1829
+ #line 726 "parser.rl"
1825
1830
  {
1826
1831
  char *np;
1827
1832
  json->current_nesting = 1;
@@ -1833,7 +1838,7 @@ st10:
1833
1838
  if ( ++p == pe )
1834
1839
  goto _test_eof10;
1835
1840
  case 10:
1836
- #line 1834 "parser.c"
1841
+ #line 1842 "parser.c"
1837
1842
  switch( (*p) ) {
1838
1843
  case 13: goto st10;
1839
1844
  case 32: goto st10;
@@ -1890,7 +1895,7 @@ case 9:
1890
1895
  _out: {}
1891
1896
  }
1892
1897
 
1893
- #line 749 "parser.rl"
1898
+ #line 757 "parser.rl"
1894
1899
 
1895
1900
  if (cs >= JSON_first_final && p == pe) {
1896
1901
  return result;
@@ -1902,7 +1907,7 @@ case 9:
1902
1907
 
1903
1908
 
1904
1909
 
1905
- #line 1903 "parser.c"
1910
+ #line 1911 "parser.c"
1906
1911
  static const int JSON_quirks_mode_start = 1;
1907
1912
  static const int JSON_quirks_mode_first_final = 10;
1908
1913
  static const int JSON_quirks_mode_error = 0;
@@ -1910,7 +1915,7 @@ static const int JSON_quirks_mode_error = 0;
1910
1915
  static const int JSON_quirks_mode_en_main = 1;
1911
1916
 
1912
1917
 
1913
- #line 774 "parser.rl"
1918
+ #line 782 "parser.rl"
1914
1919
 
1915
1920
 
1916
1921
  static VALUE cParser_parse_quirks_mode(VALUE self)
@@ -1921,16 +1926,16 @@ static VALUE cParser_parse_quirks_mode(VALUE self)
1921
1926
  GET_PARSER;
1922
1927
 
1923
1928
 
1924
- #line 1922 "parser.c"
1929
+ #line 1930 "parser.c"
1925
1930
  {
1926
1931
  cs = JSON_quirks_mode_start;
1927
1932
  }
1928
1933
 
1929
- #line 784 "parser.rl"
1934
+ #line 792 "parser.rl"
1930
1935
  p = json->source;
1931
1936
  pe = p + json->len;
1932
1937
 
1933
- #line 1931 "parser.c"
1938
+ #line 1939 "parser.c"
1934
1939
  {
1935
1940
  if ( p == pe )
1936
1941
  goto _test_eof;
@@ -1964,7 +1969,7 @@ st0:
1964
1969
  cs = 0;
1965
1970
  goto _out;
1966
1971
  tr2:
1967
- #line 766 "parser.rl"
1972
+ #line 774 "parser.rl"
1968
1973
  {
1969
1974
  char *np = JSON_parse_value(json, p, pe, &result);
1970
1975
  if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
@@ -1974,7 +1979,7 @@ st10:
1974
1979
  if ( ++p == pe )
1975
1980
  goto _test_eof10;
1976
1981
  case 10:
1977
- #line 1975 "parser.c"
1982
+ #line 1983 "parser.c"
1978
1983
  switch( (*p) ) {
1979
1984
  case 13: goto st10;
1980
1985
  case 32: goto st10;
@@ -2063,7 +2068,7 @@ case 9:
2063
2068
  _out: {}
2064
2069
  }
2065
2070
 
2066
- #line 787 "parser.rl"
2071
+ #line 795 "parser.rl"
2067
2072
 
2068
2073
  if (cs >= JSON_quirks_mode_first_final && p == pe) {
2069
2074
  return result;
@@ -2095,13 +2100,13 @@ static JSON_Parser *JSON_allocate()
2095
2100
  {
2096
2101
  JSON_Parser *json = ALLOC(JSON_Parser);
2097
2102
  MEMZERO(json, JSON_Parser, 1);
2098
- json->dwrapped_parser = Qnil;
2099
- json->Vsource = Qnil;
2100
- json->create_id = Qnil;
2101
- json->object_class = Qnil;
2102
- json->array_class = Qnil;
2103
- json->match_string = Qnil;
2104
-
2103
+ json->dwrapped_parser = Qfalse;
2104
+ json->Vsource = Qfalse;
2105
+ json->create_id = Qfalse;
2106
+ json->object_class = Qfalse;
2107
+ json->array_class = Qfalse;
2108
+ json->match_string = Qfalse;
2109
+ json->fbuffer = fbuffer_alloc(0);
2105
2110
  return json;
2106
2111
  }
2107
2112
 
@@ -2116,6 +2121,7 @@ static void JSON_mark(JSON_Parser *json)
2116
2121
 
2117
2122
  static void JSON_free(JSON_Parser *json)
2118
2123
  {
2124
+ fbuffer_free(json->fbuffer);
2119
2125
  ruby_xfree(json);
2120
2126
  }
2121
2127