json_pure 2.0.4 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -39,6 +39,7 @@ typedef struct JSON_ParserStruct {
39
39
  int symbolize_names;
40
40
  VALUE object_class;
41
41
  VALUE array_class;
42
+ VALUE decimal_class;
42
43
  int create_additions;
43
44
  VALUE match_string;
44
45
  FBuffer *fbuffer;
@@ -92,8 +92,9 @@ static VALUE CNaN, CInfinity, CMinusInfinity;
92
92
 
93
93
  static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
94
94
  i_chr, i_max_nesting, i_allow_nan, i_symbolize_names,
95
- i_object_class, i_array_class, i_key_p, i_deep_const_get, i_match,
96
- i_match_string, i_aset, i_aref, i_leftshift;
95
+ i_object_class, i_array_class, i_decimal_class, i_key_p,
96
+ i_deep_const_get, i_match, i_match_string, i_aset, i_aref,
97
+ i_leftshift, i_new;
97
98
 
98
99
  %%{
99
100
  machine JSON_common;
@@ -351,7 +352,13 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
351
352
  fbuffer_clear(json->fbuffer);
352
353
  fbuffer_append(json->fbuffer, json->memo, len);
353
354
  fbuffer_append_char(json->fbuffer, '\0');
354
- *result = rb_float_new(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
355
+ if (NIL_P(json->decimal_class)) {
356
+ *result = rb_float_new(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
357
+ } else {
358
+ VALUE text;
359
+ text = rb_str_new2(FBUFFER_PTR(json->fbuffer));
360
+ *result = rb_funcall(json->decimal_class, i_new, 1, text);
361
+ }
355
362
  return p + 1;
356
363
  } else {
357
364
  return NULL;
@@ -684,6 +691,12 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
684
691
  } else {
685
692
  json->array_class = Qnil;
686
693
  }
694
+ tmp = ID2SYM(i_decimal_class);
695
+ if (option_given_p(opts, tmp)) {
696
+ json->decimal_class = rb_hash_aref(opts, tmp);
697
+ } else {
698
+ json->decimal_class = Qnil;
699
+ }
687
700
  tmp = ID2SYM(i_match_string);
688
701
  if (option_given_p(opts, tmp)) {
689
702
  VALUE match_string = rb_hash_aref(opts, tmp);
@@ -701,6 +714,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
701
714
  json->create_id = rb_funcall(mJSON, i_create_id, 0);
702
715
  json->object_class = Qnil;
703
716
  json->array_class = Qnil;
717
+ json->decimal_class = Qnil;
704
718
  }
705
719
  source = convert_encoding(StringValue(source));
706
720
  StringValue(source);
@@ -760,6 +774,7 @@ static void JSON_mark(void *ptr)
760
774
  rb_gc_mark_maybe(json->create_id);
761
775
  rb_gc_mark_maybe(json->object_class);
762
776
  rb_gc_mark_maybe(json->array_class);
777
+ rb_gc_mark_maybe(json->decimal_class);
763
778
  rb_gc_mark_maybe(json->match_string);
764
779
  }
765
780
 
@@ -834,6 +849,7 @@ void Init_parser(void)
834
849
  i_symbolize_names = rb_intern("symbolize_names");
835
850
  i_object_class = rb_intern("object_class");
836
851
  i_array_class = rb_intern("array_class");
852
+ i_decimal_class = rb_intern("decimal_class");
837
853
  i_match = rb_intern("match");
838
854
  i_match_string = rb_intern("match_string");
839
855
  i_key_p = rb_intern("key?");
@@ -841,6 +857,7 @@ void Init_parser(void)
841
857
  i_aset = rb_intern("[]=");
842
858
  i_aref = rb_intern("[]");
843
859
  i_leftshift = rb_intern("<<");
860
+ i_new = rb_intern("new");
844
861
  }
845
862
 
846
863
  /*
@@ -54,6 +54,7 @@ public class Parser extends RubyObject {
54
54
  private boolean symbolizeNames;
55
55
  private RubyClass objectClass;
56
56
  private RubyClass arrayClass;
57
+ private RubyClass decimalClass;
57
58
  private RubyHash matchString;
58
59
 
59
60
  private static final int DEFAULT_MAX_NESTING = 100;
@@ -133,6 +134,10 @@ public class Parser extends RubyObject {
133
134
  * <dt><code>:array_class</code>
134
135
  * <dd>Defaults to Array.
135
136
  *
137
+ * <dt><code>:decimal_class</code>
138
+ * <dd>Specifies which class to use instead of the default (Float) when
139
+ * parsing decimal numbers. This class must accept a single string argument
140
+ * in its constructor.
136
141
  * </dl>
137
142
  */
138
143
  @JRubyMethod(name = "new", required = 1, optional = 1, meta = true)
@@ -159,6 +164,7 @@ public class Parser extends RubyObject {
159
164
  this.createAdditions = opts.getBool("create_additions", false);
160
165
  this.objectClass = opts.getClass("object_class", runtime.getHash());
161
166
  this.arrayClass = opts.getClass("array_class", runtime.getArray());
167
+ this.decimalClass = opts.getClass("decimal_class", null);
162
168
  this.matchString = opts.getHash("match_string");
163
169
 
164
170
  if(symbolizeNames && createAdditions) {
@@ -307,11 +313,11 @@ public class Parser extends RubyObject {
307
313
  }
308
314
 
309
315
 
310
- // line 333 "Parser.rl"
316
+ // line 339 "Parser.rl"
311
317
 
312
318
 
313
319
 
314
- // line 315 "Parser.java"
320
+ // line 321 "Parser.java"
315
321
  private static byte[] init__JSON_value_actions_0()
316
322
  {
317
323
  return new byte [] {
@@ -425,7 +431,7 @@ static final int JSON_value_error = 0;
425
431
  static final int JSON_value_en_main = 1;
426
432
 
427
433
 
428
- // line 439 "Parser.rl"
434
+ // line 445 "Parser.rl"
429
435
 
430
436
 
431
437
  void parseValue(ParserResult res, int p, int pe) {
@@ -433,14 +439,14 @@ static final int JSON_value_en_main = 1;
433
439
  IRubyObject result = null;
434
440
 
435
441
 
436
- // line 437 "Parser.java"
442
+ // line 443 "Parser.java"
437
443
  {
438
444
  cs = JSON_value_start;
439
445
  }
440
446
 
441
- // line 446 "Parser.rl"
447
+ // line 452 "Parser.rl"
442
448
 
443
- // line 444 "Parser.java"
449
+ // line 450 "Parser.java"
444
450
  {
445
451
  int _klen;
446
452
  int _trans = 0;
@@ -466,13 +472,13 @@ case 1:
466
472
  while ( _nacts-- > 0 ) {
467
473
  switch ( _JSON_value_actions[_acts++] ) {
468
474
  case 9:
469
- // line 424 "Parser.rl"
475
+ // line 430 "Parser.rl"
470
476
  {
471
477
  p--;
472
478
  { p += 1; _goto_targ = 5; if (true) continue _goto;}
473
479
  }
474
480
  break;
475
- // line 476 "Parser.java"
481
+ // line 482 "Parser.java"
476
482
  }
477
483
  }
478
484
 
@@ -535,25 +541,25 @@ case 1:
535
541
  switch ( _JSON_value_actions[_acts++] )
536
542
  {
537
543
  case 0:
538
- // line 341 "Parser.rl"
544
+ // line 347 "Parser.rl"
539
545
  {
540
546
  result = getRuntime().getNil();
541
547
  }
542
548
  break;
543
549
  case 1:
544
- // line 344 "Parser.rl"
550
+ // line 350 "Parser.rl"
545
551
  {
546
552
  result = getRuntime().getFalse();
547
553
  }
548
554
  break;
549
555
  case 2:
550
- // line 347 "Parser.rl"
556
+ // line 353 "Parser.rl"
551
557
  {
552
558
  result = getRuntime().getTrue();
553
559
  }
554
560
  break;
555
561
  case 3:
556
- // line 350 "Parser.rl"
562
+ // line 356 "Parser.rl"
557
563
  {
558
564
  if (parser.allowNaN) {
559
565
  result = getConstant(CONST_NAN);
@@ -563,7 +569,7 @@ case 1:
563
569
  }
564
570
  break;
565
571
  case 4:
566
- // line 357 "Parser.rl"
572
+ // line 363 "Parser.rl"
567
573
  {
568
574
  if (parser.allowNaN) {
569
575
  result = getConstant(CONST_INFINITY);
@@ -573,7 +579,7 @@ case 1:
573
579
  }
574
580
  break;
575
581
  case 5:
576
- // line 364 "Parser.rl"
582
+ // line 370 "Parser.rl"
577
583
  {
578
584
  if (pe > p + 8 &&
579
585
  absSubSequence(p, p + 9).equals(JSON_MINUS_INFINITY)) {
@@ -602,7 +608,7 @@ case 1:
602
608
  }
603
609
  break;
604
610
  case 6:
605
- // line 390 "Parser.rl"
611
+ // line 396 "Parser.rl"
606
612
  {
607
613
  parseString(res, p, pe);
608
614
  if (res.result == null) {
@@ -615,7 +621,7 @@ case 1:
615
621
  }
616
622
  break;
617
623
  case 7:
618
- // line 400 "Parser.rl"
624
+ // line 406 "Parser.rl"
619
625
  {
620
626
  currentNesting++;
621
627
  parseArray(res, p, pe);
@@ -630,7 +636,7 @@ case 1:
630
636
  }
631
637
  break;
632
638
  case 8:
633
- // line 412 "Parser.rl"
639
+ // line 418 "Parser.rl"
634
640
  {
635
641
  currentNesting++;
636
642
  parseObject(res, p, pe);
@@ -644,7 +650,7 @@ case 1:
644
650
  }
645
651
  }
646
652
  break;
647
- // line 648 "Parser.java"
653
+ // line 654 "Parser.java"
648
654
  }
649
655
  }
650
656
  }
@@ -664,7 +670,7 @@ case 5:
664
670
  break; }
665
671
  }
666
672
 
667
- // line 447 "Parser.rl"
673
+ // line 453 "Parser.rl"
668
674
 
669
675
  if (cs >= JSON_value_first_final && result != null) {
670
676
  res.update(result, p);
@@ -674,7 +680,7 @@ case 5:
674
680
  }
675
681
 
676
682
 
677
- // line 678 "Parser.java"
683
+ // line 684 "Parser.java"
678
684
  private static byte[] init__JSON_integer_actions_0()
679
685
  {
680
686
  return new byte [] {
@@ -773,7 +779,7 @@ static final int JSON_integer_error = 0;
773
779
  static final int JSON_integer_en_main = 1;
774
780
 
775
781
 
776
- // line 466 "Parser.rl"
782
+ // line 472 "Parser.rl"
777
783
 
778
784
 
779
785
  void parseInteger(ParserResult res, int p, int pe) {
@@ -791,15 +797,15 @@ static final int JSON_integer_en_main = 1;
791
797
  int cs = EVIL;
792
798
 
793
799
 
794
- // line 795 "Parser.java"
800
+ // line 801 "Parser.java"
795
801
  {
796
802
  cs = JSON_integer_start;
797
803
  }
798
804
 
799
- // line 483 "Parser.rl"
805
+ // line 489 "Parser.rl"
800
806
  int memo = p;
801
807
 
802
- // line 803 "Parser.java"
808
+ // line 809 "Parser.java"
803
809
  {
804
810
  int _klen;
805
811
  int _trans = 0;
@@ -880,13 +886,13 @@ case 1:
880
886
  switch ( _JSON_integer_actions[_acts++] )
881
887
  {
882
888
  case 0:
883
- // line 460 "Parser.rl"
889
+ // line 466 "Parser.rl"
884
890
  {
885
891
  p--;
886
892
  { p += 1; _goto_targ = 5; if (true) continue _goto;}
887
893
  }
888
894
  break;
889
- // line 890 "Parser.java"
895
+ // line 896 "Parser.java"
890
896
  }
891
897
  }
892
898
  }
@@ -906,7 +912,7 @@ case 5:
906
912
  break; }
907
913
  }
908
914
 
909
- // line 485 "Parser.rl"
915
+ // line 491 "Parser.rl"
910
916
 
911
917
  if (cs < JSON_integer_first_final) {
912
918
  return -1;
@@ -914,13 +920,13 @@ case 5:
914
920
 
915
921
  return p;
916
922
  }
917
-
923
+
918
924
  RubyInteger createInteger(int p, int new_p) {
919
925
  Ruby runtime = getRuntime();
920
926
  ByteList num = absSubSequence(p, new_p);
921
927
  return bytesToInum(runtime, num);
922
928
  }
923
-
929
+
924
930
  RubyInteger bytesToInum(Ruby runtime, ByteList num) {
925
931
  return runtime.is1_9() ?
926
932
  ConvertBytes.byteListToInum19(runtime, num, 10, true) :
@@ -928,7 +934,7 @@ case 5:
928
934
  }
929
935
 
930
936
 
931
- // line 932 "Parser.java"
937
+ // line 938 "Parser.java"
932
938
  private static byte[] init__JSON_float_actions_0()
933
939
  {
934
940
  return new byte [] {
@@ -1030,7 +1036,7 @@ static final int JSON_float_error = 0;
1030
1036
  static final int JSON_float_en_main = 1;
1031
1037
 
1032
1038
 
1033
- // line 520 "Parser.rl"
1039
+ // line 526 "Parser.rl"
1034
1040
 
1035
1041
 
1036
1042
  void parseFloat(ParserResult res, int p, int pe) {
@@ -1039,7 +1045,9 @@ static final int JSON_float_en_main = 1;
1039
1045
  res.update(null, p);
1040
1046
  return;
1041
1047
  }
1042
- RubyFloat number = createFloat(p, new_p);
1048
+ IRubyObject number = parser.decimalClass == null ?
1049
+ createFloat(p, new_p) : createCustomDecimal(p, new_p);
1050
+
1043
1051
  res.update(number, new_p + 1);
1044
1052
  return;
1045
1053
  }
@@ -1048,15 +1056,15 @@ static final int JSON_float_en_main = 1;
1048
1056
  int cs = EVIL;
1049
1057
 
1050
1058
 
1051
- // line 1052 "Parser.java"
1059
+ // line 1060 "Parser.java"
1052
1060
  {
1053
1061
  cs = JSON_float_start;
1054
1062
  }
1055
1063
 
1056
- // line 537 "Parser.rl"
1064
+ // line 545 "Parser.rl"
1057
1065
  int memo = p;
1058
1066
 
1059
- // line 1060 "Parser.java"
1067
+ // line 1068 "Parser.java"
1060
1068
  {
1061
1069
  int _klen;
1062
1070
  int _trans = 0;
@@ -1137,13 +1145,13 @@ case 1:
1137
1145
  switch ( _JSON_float_actions[_acts++] )
1138
1146
  {
1139
1147
  case 0:
1140
- // line 511 "Parser.rl"
1148
+ // line 517 "Parser.rl"
1141
1149
  {
1142
1150
  p--;
1143
1151
  { p += 1; _goto_targ = 5; if (true) continue _goto;}
1144
1152
  }
1145
1153
  break;
1146
- // line 1147 "Parser.java"
1154
+ // line 1155 "Parser.java"
1147
1155
  }
1148
1156
  }
1149
1157
  }
@@ -1163,23 +1171,30 @@ case 5:
1163
1171
  break; }
1164
1172
  }
1165
1173
 
1166
- // line 539 "Parser.rl"
1174
+ // line 547 "Parser.rl"
1167
1175
 
1168
1176
  if (cs < JSON_float_first_final) {
1169
1177
  return -1;
1170
1178
  }
1171
-
1179
+
1172
1180
  return p;
1173
1181
  }
1174
-
1182
+
1175
1183
  RubyFloat createFloat(int p, int new_p) {
1176
1184
  Ruby runtime = getRuntime();
1177
1185
  ByteList num = absSubSequence(p, new_p);
1178
1186
  return RubyFloat.newFloat(runtime, dc.parse(num, true, runtime.is1_9()));
1179
1187
  }
1180
1188
 
1189
+ IRubyObject createCustomDecimal(int p, int new_p) {
1190
+ Ruby runtime = getRuntime();
1191
+ ByteList num = absSubSequence(p, new_p);
1192
+ IRubyObject numString = runtime.newString(num.toString());
1193
+ return parser.decimalClass.callMethod(context, "new", numString);
1194
+ }
1195
+
1181
1196
 
1182
- // line 1183 "Parser.java"
1197
+ // line 1198 "Parser.java"
1183
1198
  private static byte[] init__JSON_string_actions_0()
1184
1199
  {
1185
1200
  return new byte [] {
@@ -1281,7 +1296,7 @@ static final int JSON_string_error = 0;
1281
1296
  static final int JSON_string_en_main = 1;
1282
1297
 
1283
1298
 
1284
- // line 584 "Parser.rl"
1299
+ // line 599 "Parser.rl"
1285
1300
 
1286
1301
 
1287
1302
  void parseString(ParserResult res, int p, int pe) {
@@ -1289,15 +1304,15 @@ static final int JSON_string_en_main = 1;
1289
1304
  IRubyObject result = null;
1290
1305
 
1291
1306
 
1292
- // line 1293 "Parser.java"
1307
+ // line 1308 "Parser.java"
1293
1308
  {
1294
1309
  cs = JSON_string_start;
1295
1310
  }
1296
1311
 
1297
- // line 591 "Parser.rl"
1312
+ // line 606 "Parser.rl"
1298
1313
  int memo = p;
1299
1314
 
1300
- // line 1301 "Parser.java"
1315
+ // line 1316 "Parser.java"
1301
1316
  {
1302
1317
  int _klen;
1303
1318
  int _trans = 0;
@@ -1378,7 +1393,7 @@ case 1:
1378
1393
  switch ( _JSON_string_actions[_acts++] )
1379
1394
  {
1380
1395
  case 0:
1381
- // line 559 "Parser.rl"
1396
+ // line 574 "Parser.rl"
1382
1397
  {
1383
1398
  int offset = byteList.begin();
1384
1399
  ByteList decoded = decoder.decode(byteList, memo + 1 - offset,
@@ -1393,13 +1408,13 @@ case 1:
1393
1408
  }
1394
1409
  break;
1395
1410
  case 1:
1396
- // line 572 "Parser.rl"
1411
+ // line 587 "Parser.rl"
1397
1412
  {
1398
1413
  p--;
1399
1414
  { p += 1; _goto_targ = 5; if (true) continue _goto;}
1400
1415
  }
1401
1416
  break;
1402
- // line 1403 "Parser.java"
1417
+ // line 1418 "Parser.java"
1403
1418
  }
1404
1419
  }
1405
1420
  }
@@ -1419,7 +1434,7 @@ case 5:
1419
1434
  break; }
1420
1435
  }
1421
1436
 
1422
- // line 593 "Parser.rl"
1437
+ // line 608 "Parser.rl"
1423
1438
 
1424
1439
  if (parser.createAdditions) {
1425
1440
  RubyHash matchString = parser.matchString;
@@ -1446,7 +1461,7 @@ case 5:
1446
1461
  }
1447
1462
  }
1448
1463
 
1449
- if (cs >= JSON_string_first_final && result != null) {
1464
+ if (cs >= JSON_string_first_final && result != null) {
1450
1465
  if (result instanceof RubyString) {
1451
1466
  ((RubyString)result).force_encoding(context, info.utf8.get());
1452
1467
  }
@@ -1457,7 +1472,7 @@ case 5:
1457
1472
  }
1458
1473
 
1459
1474
 
1460
- // line 1461 "Parser.java"
1475
+ // line 1476 "Parser.java"
1461
1476
  private static byte[] init__JSON_array_actions_0()
1462
1477
  {
1463
1478
  return new byte [] {
@@ -1570,7 +1585,7 @@ static final int JSON_array_error = 0;
1570
1585
  static final int JSON_array_en_main = 1;
1571
1586
 
1572
1587
 
1573
- // line 666 "Parser.rl"
1588
+ // line 681 "Parser.rl"
1574
1589
 
1575
1590
 
1576
1591
  void parseArray(ParserResult res, int p, int pe) {
@@ -1590,14 +1605,14 @@ static final int JSON_array_en_main = 1;
1590
1605
  }
1591
1606
 
1592
1607
 
1593
- // line 1594 "Parser.java"
1608
+ // line 1609 "Parser.java"
1594
1609
  {
1595
1610
  cs = JSON_array_start;
1596
1611
  }
1597
1612
 
1598
- // line 685 "Parser.rl"
1613
+ // line 700 "Parser.rl"
1599
1614
 
1600
- // line 1601 "Parser.java"
1615
+ // line 1616 "Parser.java"
1601
1616
  {
1602
1617
  int _klen;
1603
1618
  int _trans = 0;
@@ -1678,7 +1693,7 @@ case 1:
1678
1693
  switch ( _JSON_array_actions[_acts++] )
1679
1694
  {
1680
1695
  case 0:
1681
- // line 635 "Parser.rl"
1696
+ // line 650 "Parser.rl"
1682
1697
  {
1683
1698
  parseValue(res, p, pe);
1684
1699
  if (res.result == null) {
@@ -1695,13 +1710,13 @@ case 1:
1695
1710
  }
1696
1711
  break;
1697
1712
  case 1:
1698
- // line 650 "Parser.rl"
1713
+ // line 665 "Parser.rl"
1699
1714
  {
1700
1715
  p--;
1701
1716
  { p += 1; _goto_targ = 5; if (true) continue _goto;}
1702
1717
  }
1703
1718
  break;
1704
- // line 1705 "Parser.java"
1719
+ // line 1720 "Parser.java"
1705
1720
  }
1706
1721
  }
1707
1722
  }
@@ -1721,7 +1736,7 @@ case 5:
1721
1736
  break; }
1722
1737
  }
1723
1738
 
1724
- // line 686 "Parser.rl"
1739
+ // line 701 "Parser.rl"
1725
1740
 
1726
1741
  if (cs >= JSON_array_first_final) {
1727
1742
  res.update(result, p + 1);
@@ -1731,7 +1746,7 @@ case 5:
1731
1746
  }
1732
1747
 
1733
1748
 
1734
- // line 1735 "Parser.java"
1749
+ // line 1750 "Parser.java"
1735
1750
  private static byte[] init__JSON_object_actions_0()
1736
1751
  {
1737
1752
  return new byte [] {
@@ -1854,7 +1869,7 @@ static final int JSON_object_error = 0;
1854
1869
  static final int JSON_object_en_main = 1;
1855
1870
 
1856
1871
 
1857
- // line 745 "Parser.rl"
1872
+ // line 760 "Parser.rl"
1858
1873
 
1859
1874
 
1860
1875
  void parseObject(ParserResult res, int p, int pe) {
@@ -1879,14 +1894,14 @@ static final int JSON_object_en_main = 1;
1879
1894
  }
1880
1895
 
1881
1896
 
1882
- // line 1883 "Parser.java"
1897
+ // line 1898 "Parser.java"
1883
1898
  {
1884
1899
  cs = JSON_object_start;
1885
1900
  }
1886
1901
 
1887
- // line 769 "Parser.rl"
1902
+ // line 784 "Parser.rl"
1888
1903
 
1889
- // line 1890 "Parser.java"
1904
+ // line 1905 "Parser.java"
1890
1905
  {
1891
1906
  int _klen;
1892
1907
  int _trans = 0;
@@ -1967,7 +1982,7 @@ case 1:
1967
1982
  switch ( _JSON_object_actions[_acts++] )
1968
1983
  {
1969
1984
  case 0:
1970
- // line 700 "Parser.rl"
1985
+ // line 715 "Parser.rl"
1971
1986
  {
1972
1987
  parseValue(res, p, pe);
1973
1988
  if (res.result == null) {
@@ -1984,7 +1999,7 @@ case 1:
1984
1999
  }
1985
2000
  break;
1986
2001
  case 1:
1987
- // line 715 "Parser.rl"
2002
+ // line 730 "Parser.rl"
1988
2003
  {
1989
2004
  parseString(res, p, pe);
1990
2005
  if (res.result == null) {
@@ -2004,13 +2019,13 @@ case 1:
2004
2019
  }
2005
2020
  break;
2006
2021
  case 2:
2007
- // line 733 "Parser.rl"
2022
+ // line 748 "Parser.rl"
2008
2023
  {
2009
2024
  p--;
2010
2025
  { p += 1; _goto_targ = 5; if (true) continue _goto;}
2011
2026
  }
2012
2027
  break;
2013
- // line 2014 "Parser.java"
2028
+ // line 2029 "Parser.java"
2014
2029
  }
2015
2030
  }
2016
2031
  }
@@ -2030,7 +2045,7 @@ case 5:
2030
2045
  break; }
2031
2046
  }
2032
2047
 
2033
- // line 770 "Parser.rl"
2048
+ // line 785 "Parser.rl"
2034
2049
 
2035
2050
  if (cs < JSON_object_first_final) {
2036
2051
  res.update(null, p + 1);
@@ -2063,7 +2078,7 @@ case 5:
2063
2078
  }
2064
2079
 
2065
2080
 
2066
- // line 2067 "Parser.java"
2081
+ // line 2082 "Parser.java"
2067
2082
  private static byte[] init__JSON_actions_0()
2068
2083
  {
2069
2084
  return new byte [] {
@@ -2166,7 +2181,7 @@ static final int JSON_error = 0;
2166
2181
  static final int JSON_en_main = 1;
2167
2182
 
2168
2183
 
2169
- // line 821 "Parser.rl"
2184
+ // line 836 "Parser.rl"
2170
2185
 
2171
2186
 
2172
2187
  public IRubyObject parseImplemetation() {
@@ -2176,16 +2191,16 @@ static final int JSON_en_main = 1;
2176
2191
  ParserResult res = new ParserResult();
2177
2192
 
2178
2193
 
2179
- // line 2180 "Parser.java"
2194
+ // line 2195 "Parser.java"
2180
2195
  {
2181
2196
  cs = JSON_start;
2182
2197
  }
2183
2198
 
2184
- // line 830 "Parser.rl"
2199
+ // line 845 "Parser.rl"
2185
2200
  p = byteList.begin();
2186
2201
  pe = p + byteList.length();
2187
2202
 
2188
- // line 2189 "Parser.java"
2203
+ // line 2204 "Parser.java"
2189
2204
  {
2190
2205
  int _klen;
2191
2206
  int _trans = 0;
@@ -2266,7 +2281,7 @@ case 1:
2266
2281
  switch ( _JSON_actions[_acts++] )
2267
2282
  {
2268
2283
  case 0:
2269
- // line 807 "Parser.rl"
2284
+ // line 822 "Parser.rl"
2270
2285
  {
2271
2286
  parseValue(res, p, pe);
2272
2287
  if (res.result == null) {
@@ -2278,7 +2293,7 @@ case 1:
2278
2293
  }
2279
2294
  }
2280
2295
  break;
2281
- // line 2282 "Parser.java"
2296
+ // line 2297 "Parser.java"
2282
2297
  }
2283
2298
  }
2284
2299
  }
@@ -2298,7 +2313,7 @@ case 5:
2298
2313
  break; }
2299
2314
  }
2300
2315
 
2301
- // line 833 "Parser.rl"
2316
+ // line 848 "Parser.rl"
2302
2317
 
2303
2318
  if (cs >= JSON_first_final && p == pe) {
2304
2319
  return result;