json_pure 1.6.3 → 1.6.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +4 -0
- data/README.rdoc +1 -1
- data/VERSION +1 -1
- data/ext/json/ext/generator/extconf.rb +3 -3
- data/ext/json/ext/parser/extconf.rb +3 -3
- data/ext/json/ext/parser/parser.c +77 -71
- data/ext/json/ext/parser/parser.rl +8 -2
- data/java/src/json/ext/OptionsReader.java +1 -7
- data/java/src/json/ext/Parser.java +207 -156
- data/java/src/json/ext/Parser.rl +127 -76
- data/json.gemspec +4 -4
- data/json_pure.gemspec +4 -4
- data/lib/json/version.rb +1 -1
- data/tests/test_json.rb +53 -2
- metadata +229 -236
- data/java/lib/bytelist-1.0.6.jar +0 -0
- data/java/lib/jcodings.jar +0 -0
@@ -79,7 +79,7 @@ static VALUE CNaN, CInfinity, CMinusInfinity;
|
|
79
79
|
static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
|
80
80
|
i_chr, i_max_nesting, i_allow_nan, i_symbolize_names, i_quirks_mode,
|
81
81
|
i_object_class, i_array_class, i_key_p, i_deep_const_get, i_match,
|
82
|
-
i_match_string, i_aset, i_leftshift;
|
82
|
+
i_match_string, i_aset, i_aref, i_leftshift;
|
83
83
|
|
84
84
|
%%{
|
85
85
|
machine JSON_common;
|
@@ -167,7 +167,12 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu
|
|
167
167
|
|
168
168
|
if (cs >= JSON_object_first_final) {
|
169
169
|
if (json->create_additions) {
|
170
|
-
VALUE klassname
|
170
|
+
VALUE klassname;
|
171
|
+
if (NIL_P(json->object_class)) {
|
172
|
+
klassname = rb_hash_aref(*result, json->create_id);
|
173
|
+
} else {
|
174
|
+
klassname = rb_funcall(*result, i_aref, 1, json->create_id);
|
175
|
+
}
|
171
176
|
if (!NIL_P(klassname)) {
|
172
177
|
VALUE klass = rb_funcall(mJSON, i_deep_const_get, 1, klassname);
|
173
178
|
if (RTEST(rb_funcall(klass, i_json_creatable_p, 0))) {
|
@@ -896,6 +901,7 @@ void Init_parser()
|
|
896
901
|
i_key_p = rb_intern("key?");
|
897
902
|
i_deep_const_get = rb_intern("deep_const_get");
|
898
903
|
i_aset = rb_intern("[]=");
|
904
|
+
i_aref = rb_intern("[]");
|
899
905
|
i_leftshift = rb_intern("<<");
|
900
906
|
#ifdef HAVE_RUBY_ENCODING_H
|
901
907
|
CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8"));
|
@@ -102,13 +102,7 @@ final class OptionsReader {
|
|
102
102
|
IRubyObject value = get(key);
|
103
103
|
|
104
104
|
if (value == null || value.isNil()) return defaultValue;
|
105
|
-
|
106
|
-
if (value instanceof RubyClass &&
|
107
|
-
((RubyClass)value).getAllocator() == defaultValue.getAllocator()) {
|
108
|
-
return (RubyClass)value;
|
109
|
-
}
|
110
|
-
throw runtime.newTypeError(key + " option must be a subclass of "
|
111
|
-
+ defaultValue);
|
105
|
+
return (RubyClass)value;
|
112
106
|
}
|
113
107
|
|
114
108
|
public RubyHash getHash(String key) {
|
@@ -28,6 +28,8 @@ import org.jruby.runtime.ThreadContext;
|
|
28
28
|
import org.jruby.runtime.Visibility;
|
29
29
|
import org.jruby.runtime.builtin.IRubyObject;
|
30
30
|
import org.jruby.util.ByteList;
|
31
|
+
import org.jruby.util.ConvertBytes;
|
32
|
+
import static org.jruby.util.ConvertDouble.DoubleConverter;
|
31
33
|
|
32
34
|
/**
|
33
35
|
* The <code>JSON::Ext::Parser</code> class.
|
@@ -58,7 +60,7 @@ public class Parser extends RubyObject {
|
|
58
60
|
|
59
61
|
private static final int DEFAULT_MAX_NESTING = 19;
|
60
62
|
|
61
|
-
private static final
|
63
|
+
private static final ByteList JSON_MINUS_INFINITY = new ByteList(ByteList.plain("-Infinity"));
|
62
64
|
// constant names in the JSON module containing those values
|
63
65
|
private static final String CONST_NAN = "NaN";
|
64
66
|
private static final String CONST_INFINITY = "Infinity";
|
@@ -82,13 +84,13 @@ public class Parser extends RubyObject {
|
|
82
84
|
* The result of the successful parsing. Should never be
|
83
85
|
* <code>null</code>.
|
84
86
|
*/
|
85
|
-
|
87
|
+
IRubyObject result;
|
86
88
|
/**
|
87
89
|
* The point where the parser returned.
|
88
90
|
*/
|
89
|
-
|
91
|
+
int p;
|
90
92
|
|
91
|
-
|
93
|
+
void update(IRubyObject result, int p) {
|
92
94
|
this.result = result;
|
93
95
|
this.p = p;
|
94
96
|
}
|
@@ -303,9 +305,11 @@ public class Parser extends RubyObject {
|
|
303
305
|
private final Parser parser;
|
304
306
|
private final ThreadContext context;
|
305
307
|
private final ByteList byteList;
|
308
|
+
private final ByteList view;
|
306
309
|
private final byte[] data;
|
307
310
|
private final StringDecoder decoder;
|
308
311
|
private int currentNesting = 0;
|
312
|
+
private final DoubleConverter dc;
|
309
313
|
|
310
314
|
// initialization value for all state variables.
|
311
315
|
// no idea about the origins of this value, ask Flori ;)
|
@@ -316,7 +320,9 @@ public class Parser extends RubyObject {
|
|
316
320
|
this.context = context;
|
317
321
|
this.byteList = parser.checkAndGetSource().getByteList();
|
318
322
|
this.data = byteList.unsafeBytes();
|
323
|
+
this.view = new ByteList(data, false);
|
319
324
|
this.decoder = new StringDecoder(context);
|
325
|
+
this.dc = new DoubleConverter();
|
320
326
|
}
|
321
327
|
|
322
328
|
private RaiseException unexpectedToken(int absStart, int absEnd) {
|
@@ -331,11 +337,11 @@ public class Parser extends RubyObject {
|
|
331
337
|
}
|
332
338
|
|
333
339
|
|
334
|
-
// line
|
340
|
+
// line 363 "Parser.rl"
|
335
341
|
|
336
342
|
|
337
343
|
|
338
|
-
// line
|
344
|
+
// line 345 "Parser.java"
|
339
345
|
private static byte[] init__JSON_value_actions_0()
|
340
346
|
{
|
341
347
|
return new byte [] {
|
@@ -449,22 +455,22 @@ static final int JSON_value_error = 0;
|
|
449
455
|
static final int JSON_value_en_main = 1;
|
450
456
|
|
451
457
|
|
452
|
-
// line
|
458
|
+
// line 469 "Parser.rl"
|
453
459
|
|
454
460
|
|
455
|
-
|
461
|
+
void parseValue(ParserResult res, int p, int pe) {
|
456
462
|
int cs = EVIL;
|
457
463
|
IRubyObject result = null;
|
458
464
|
|
459
465
|
|
460
|
-
// line
|
466
|
+
// line 467 "Parser.java"
|
461
467
|
{
|
462
468
|
cs = JSON_value_start;
|
463
469
|
}
|
464
470
|
|
465
|
-
// line
|
471
|
+
// line 476 "Parser.rl"
|
466
472
|
|
467
|
-
// line
|
473
|
+
// line 474 "Parser.java"
|
468
474
|
{
|
469
475
|
int _klen;
|
470
476
|
int _trans = 0;
|
@@ -490,13 +496,13 @@ case 1:
|
|
490
496
|
while ( _nacts-- > 0 ) {
|
491
497
|
switch ( _JSON_value_actions[_acts++] ) {
|
492
498
|
case 9:
|
493
|
-
// line
|
499
|
+
// line 454 "Parser.rl"
|
494
500
|
{
|
495
501
|
p--;
|
496
502
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
497
503
|
}
|
498
504
|
break;
|
499
|
-
// line
|
505
|
+
// line 506 "Parser.java"
|
500
506
|
}
|
501
507
|
}
|
502
508
|
|
@@ -559,25 +565,25 @@ case 1:
|
|
559
565
|
switch ( _JSON_value_actions[_acts++] )
|
560
566
|
{
|
561
567
|
case 0:
|
562
|
-
// line
|
568
|
+
// line 371 "Parser.rl"
|
563
569
|
{
|
564
570
|
result = getRuntime().getNil();
|
565
571
|
}
|
566
572
|
break;
|
567
573
|
case 1:
|
568
|
-
// line
|
574
|
+
// line 374 "Parser.rl"
|
569
575
|
{
|
570
576
|
result = getRuntime().getFalse();
|
571
577
|
}
|
572
578
|
break;
|
573
579
|
case 2:
|
574
|
-
// line
|
580
|
+
// line 377 "Parser.rl"
|
575
581
|
{
|
576
582
|
result = getRuntime().getTrue();
|
577
583
|
}
|
578
584
|
break;
|
579
585
|
case 3:
|
580
|
-
// line
|
586
|
+
// line 380 "Parser.rl"
|
581
587
|
{
|
582
588
|
if (parser.allowNaN) {
|
583
589
|
result = getConstant(CONST_NAN);
|
@@ -587,7 +593,7 @@ case 1:
|
|
587
593
|
}
|
588
594
|
break;
|
589
595
|
case 4:
|
590
|
-
// line
|
596
|
+
// line 387 "Parser.rl"
|
591
597
|
{
|
592
598
|
if (parser.allowNaN) {
|
593
599
|
result = getConstant(CONST_INFINITY);
|
@@ -597,10 +603,10 @@ case 1:
|
|
597
603
|
}
|
598
604
|
break;
|
599
605
|
case 5:
|
600
|
-
// line
|
606
|
+
// line 394 "Parser.rl"
|
601
607
|
{
|
602
608
|
if (pe > p + 9 - (parser.quirksMode ? 1 : 0) &&
|
603
|
-
absSubSequence(p, p + 9).
|
609
|
+
absSubSequence(p, p + 9).equals(JSON_MINUS_INFINITY)) {
|
604
610
|
|
605
611
|
if (parser.allowNaN) {
|
606
612
|
result = getConstant(CONST_MINUS_INFINITY);
|
@@ -611,13 +617,13 @@ case 1:
|
|
611
617
|
throw unexpectedToken(p, pe);
|
612
618
|
}
|
613
619
|
}
|
614
|
-
|
615
|
-
if (res != null) {
|
620
|
+
parseFloat(res, p, pe);
|
621
|
+
if (res.result != null) {
|
616
622
|
result = res.result;
|
617
623
|
{p = (( res.p))-1;}
|
618
624
|
}
|
619
|
-
res
|
620
|
-
if (res != null) {
|
625
|
+
parseInteger(res, p, pe);
|
626
|
+
if (res.result != null) {
|
621
627
|
result = res.result;
|
622
628
|
{p = (( res.p))-1;}
|
623
629
|
}
|
@@ -626,10 +632,10 @@ case 1:
|
|
626
632
|
}
|
627
633
|
break;
|
628
634
|
case 6:
|
629
|
-
// line
|
635
|
+
// line 420 "Parser.rl"
|
630
636
|
{
|
631
|
-
|
632
|
-
if (res == null) {
|
637
|
+
parseString(res, p, pe);
|
638
|
+
if (res.result == null) {
|
633
639
|
p--;
|
634
640
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
635
641
|
} else {
|
@@ -639,12 +645,12 @@ case 1:
|
|
639
645
|
}
|
640
646
|
break;
|
641
647
|
case 7:
|
642
|
-
// line
|
648
|
+
// line 430 "Parser.rl"
|
643
649
|
{
|
644
650
|
currentNesting++;
|
645
|
-
|
651
|
+
parseArray(res, p, pe);
|
646
652
|
currentNesting--;
|
647
|
-
if (res == null) {
|
653
|
+
if (res.result == null) {
|
648
654
|
p--;
|
649
655
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
650
656
|
} else {
|
@@ -654,12 +660,12 @@ case 1:
|
|
654
660
|
}
|
655
661
|
break;
|
656
662
|
case 8:
|
657
|
-
// line
|
663
|
+
// line 442 "Parser.rl"
|
658
664
|
{
|
659
665
|
currentNesting++;
|
660
|
-
|
666
|
+
parseObject(res, p, pe);
|
661
667
|
currentNesting--;
|
662
|
-
if (res == null) {
|
668
|
+
if (res.result == null) {
|
663
669
|
p--;
|
664
670
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
665
671
|
} else {
|
@@ -668,7 +674,7 @@ case 1:
|
|
668
674
|
}
|
669
675
|
}
|
670
676
|
break;
|
671
|
-
// line
|
677
|
+
// line 678 "Parser.java"
|
672
678
|
}
|
673
679
|
}
|
674
680
|
}
|
@@ -688,17 +694,17 @@ case 5:
|
|
688
694
|
break; }
|
689
695
|
}
|
690
696
|
|
691
|
-
// line
|
697
|
+
// line 477 "Parser.rl"
|
692
698
|
|
693
699
|
if (cs >= JSON_value_first_final && result != null) {
|
694
|
-
|
700
|
+
res.update(result, p);
|
695
701
|
} else {
|
696
|
-
|
702
|
+
res.update(null, p);
|
697
703
|
}
|
698
704
|
}
|
699
705
|
|
700
706
|
|
701
|
-
// line
|
707
|
+
// line 708 "Parser.java"
|
702
708
|
private static byte[] init__JSON_integer_actions_0()
|
703
709
|
{
|
704
710
|
return new byte [] {
|
@@ -797,22 +803,33 @@ static final int JSON_integer_error = 0;
|
|
797
803
|
static final int JSON_integer_en_main = 1;
|
798
804
|
|
799
805
|
|
800
|
-
// line
|
806
|
+
// line 496 "Parser.rl"
|
801
807
|
|
802
808
|
|
803
|
-
|
809
|
+
void parseInteger(ParserResult res, int p, int pe) {
|
810
|
+
int new_p = parseIntegerInternal(p, pe);
|
811
|
+
if (new_p == -1) {
|
812
|
+
res.update(null, p);
|
813
|
+
return;
|
814
|
+
}
|
815
|
+
RubyInteger number = createInteger(p, new_p);
|
816
|
+
res.update(number, new_p + 1);
|
817
|
+
return;
|
818
|
+
}
|
819
|
+
|
820
|
+
int parseIntegerInternal(int p, int pe) {
|
804
821
|
int cs = EVIL;
|
805
822
|
|
806
823
|
|
807
|
-
// line
|
824
|
+
// line 825 "Parser.java"
|
808
825
|
{
|
809
826
|
cs = JSON_integer_start;
|
810
827
|
}
|
811
828
|
|
812
|
-
// line
|
829
|
+
// line 513 "Parser.rl"
|
813
830
|
int memo = p;
|
814
831
|
|
815
|
-
// line
|
832
|
+
// line 833 "Parser.java"
|
816
833
|
{
|
817
834
|
int _klen;
|
818
835
|
int _trans = 0;
|
@@ -893,13 +910,13 @@ case 1:
|
|
893
910
|
switch ( _JSON_integer_actions[_acts++] )
|
894
911
|
{
|
895
912
|
case 0:
|
896
|
-
// line
|
913
|
+
// line 490 "Parser.rl"
|
897
914
|
{
|
898
915
|
p--;
|
899
916
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
900
917
|
}
|
901
918
|
break;
|
902
|
-
// line
|
919
|
+
// line 920 "Parser.java"
|
903
920
|
}
|
904
921
|
}
|
905
922
|
}
|
@@ -919,22 +936,29 @@ case 5:
|
|
919
936
|
break; }
|
920
937
|
}
|
921
938
|
|
922
|
-
// line
|
939
|
+
// line 515 "Parser.rl"
|
923
940
|
|
924
941
|
if (cs < JSON_integer_first_final) {
|
925
|
-
return
|
942
|
+
return -1;
|
926
943
|
}
|
927
944
|
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
945
|
+
return p;
|
946
|
+
}
|
947
|
+
|
948
|
+
RubyInteger createInteger(int p, int new_p) {
|
949
|
+
Ruby runtime = getRuntime();
|
950
|
+
ByteList num = absSubSequence(p, new_p);
|
951
|
+
return bytesToInum(runtime, num);
|
952
|
+
}
|
953
|
+
|
954
|
+
RubyInteger bytesToInum(Ruby runtime, ByteList num) {
|
955
|
+
return runtime.is1_9() ?
|
956
|
+
ConvertBytes.byteListToInum19(runtime, num, 10, true) :
|
957
|
+
ConvertBytes.byteListToInum(runtime, num, 10, true);
|
934
958
|
}
|
935
959
|
|
936
960
|
|
937
|
-
// line
|
961
|
+
// line 962 "Parser.java"
|
938
962
|
private static byte[] init__JSON_float_actions_0()
|
939
963
|
{
|
940
964
|
return new byte [] {
|
@@ -1036,22 +1060,33 @@ static final int JSON_float_error = 0;
|
|
1036
1060
|
static final int JSON_float_en_main = 1;
|
1037
1061
|
|
1038
1062
|
|
1039
|
-
// line
|
1063
|
+
// line 550 "Parser.rl"
|
1040
1064
|
|
1041
1065
|
|
1042
|
-
|
1066
|
+
void parseFloat(ParserResult res, int p, int pe) {
|
1067
|
+
int new_p = parseFloatInternal(p, pe);
|
1068
|
+
if (new_p == -1) {
|
1069
|
+
res.update(null, p);
|
1070
|
+
return;
|
1071
|
+
}
|
1072
|
+
RubyFloat number = createFloat(p, new_p);
|
1073
|
+
res.update(number, new_p + 1);
|
1074
|
+
return;
|
1075
|
+
}
|
1076
|
+
|
1077
|
+
int parseFloatInternal(int p, int pe) {
|
1043
1078
|
int cs = EVIL;
|
1044
1079
|
|
1045
1080
|
|
1046
|
-
// line
|
1081
|
+
// line 1082 "Parser.java"
|
1047
1082
|
{
|
1048
1083
|
cs = JSON_float_start;
|
1049
1084
|
}
|
1050
1085
|
|
1051
|
-
// line
|
1086
|
+
// line 567 "Parser.rl"
|
1052
1087
|
int memo = p;
|
1053
1088
|
|
1054
|
-
// line
|
1089
|
+
// line 1090 "Parser.java"
|
1055
1090
|
{
|
1056
1091
|
int _klen;
|
1057
1092
|
int _trans = 0;
|
@@ -1132,13 +1167,13 @@ case 1:
|
|
1132
1167
|
switch ( _JSON_float_actions[_acts++] )
|
1133
1168
|
{
|
1134
1169
|
case 0:
|
1135
|
-
// line
|
1170
|
+
// line 541 "Parser.rl"
|
1136
1171
|
{
|
1137
1172
|
p--;
|
1138
1173
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1139
1174
|
}
|
1140
1175
|
break;
|
1141
|
-
// line
|
1176
|
+
// line 1177 "Parser.java"
|
1142
1177
|
}
|
1143
1178
|
}
|
1144
1179
|
}
|
@@ -1158,22 +1193,23 @@ case 5:
|
|
1158
1193
|
break; }
|
1159
1194
|
}
|
1160
1195
|
|
1161
|
-
// line
|
1196
|
+
// line 569 "Parser.rl"
|
1162
1197
|
|
1163
1198
|
if (cs < JSON_float_first_final) {
|
1164
|
-
return
|
1199
|
+
return -1;
|
1165
1200
|
}
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1172
|
-
|
1201
|
+
|
1202
|
+
return p;
|
1203
|
+
}
|
1204
|
+
|
1205
|
+
RubyFloat createFloat(int p, int new_p) {
|
1206
|
+
Ruby runtime = getRuntime();
|
1207
|
+
ByteList num = absSubSequence(p, new_p);
|
1208
|
+
return RubyFloat.newFloat(runtime, dc.parse(num, true, runtime.is1_9()));
|
1173
1209
|
}
|
1174
1210
|
|
1175
1211
|
|
1176
|
-
// line
|
1212
|
+
// line 1213 "Parser.java"
|
1177
1213
|
private static byte[] init__JSON_string_actions_0()
|
1178
1214
|
{
|
1179
1215
|
return new byte [] {
|
@@ -1275,23 +1311,23 @@ static final int JSON_string_error = 0;
|
|
1275
1311
|
static final int JSON_string_en_main = 1;
|
1276
1312
|
|
1277
1313
|
|
1278
|
-
// line
|
1314
|
+
// line 614 "Parser.rl"
|
1279
1315
|
|
1280
1316
|
|
1281
|
-
|
1317
|
+
void parseString(ParserResult res, int p, int pe) {
|
1282
1318
|
int cs = EVIL;
|
1283
1319
|
IRubyObject result = null;
|
1284
1320
|
|
1285
1321
|
|
1286
|
-
// line
|
1322
|
+
// line 1323 "Parser.java"
|
1287
1323
|
{
|
1288
1324
|
cs = JSON_string_start;
|
1289
1325
|
}
|
1290
1326
|
|
1291
|
-
// line
|
1327
|
+
// line 621 "Parser.rl"
|
1292
1328
|
int memo = p;
|
1293
1329
|
|
1294
|
-
// line
|
1330
|
+
// line 1331 "Parser.java"
|
1295
1331
|
{
|
1296
1332
|
int _klen;
|
1297
1333
|
int _trans = 0;
|
@@ -1372,7 +1408,7 @@ case 1:
|
|
1372
1408
|
switch ( _JSON_string_actions[_acts++] )
|
1373
1409
|
{
|
1374
1410
|
case 0:
|
1375
|
-
// line
|
1411
|
+
// line 589 "Parser.rl"
|
1376
1412
|
{
|
1377
1413
|
int offset = byteList.begin();
|
1378
1414
|
ByteList decoded = decoder.decode(byteList, memo + 1 - offset,
|
@@ -1387,13 +1423,13 @@ case 1:
|
|
1387
1423
|
}
|
1388
1424
|
break;
|
1389
1425
|
case 1:
|
1390
|
-
// line
|
1426
|
+
// line 602 "Parser.rl"
|
1391
1427
|
{
|
1392
1428
|
p--;
|
1393
1429
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1394
1430
|
}
|
1395
1431
|
break;
|
1396
|
-
// line
|
1432
|
+
// line 1433 "Parser.java"
|
1397
1433
|
}
|
1398
1434
|
}
|
1399
1435
|
}
|
@@ -1413,7 +1449,7 @@ case 5:
|
|
1413
1449
|
break; }
|
1414
1450
|
}
|
1415
1451
|
|
1416
|
-
// line
|
1452
|
+
// line 623 "Parser.rl"
|
1417
1453
|
|
1418
1454
|
if (parser.createAdditions) {
|
1419
1455
|
RubyHash match_string = parser.match_string;
|
@@ -1441,14 +1477,14 @@ case 5:
|
|
1441
1477
|
}
|
1442
1478
|
|
1443
1479
|
if (cs >= JSON_string_first_final && result != null) {
|
1444
|
-
|
1480
|
+
res.update(result, p + 1);
|
1445
1481
|
} else {
|
1446
|
-
|
1482
|
+
res.update(null, p + 1);
|
1447
1483
|
}
|
1448
1484
|
}
|
1449
1485
|
|
1450
1486
|
|
1451
|
-
// line
|
1487
|
+
// line 1488 "Parser.java"
|
1452
1488
|
private static byte[] init__JSON_array_actions_0()
|
1453
1489
|
{
|
1454
1490
|
return new byte [] {
|
@@ -1561,10 +1597,10 @@ static final int JSON_array_error = 0;
|
|
1561
1597
|
static final int JSON_array_en_main = 1;
|
1562
1598
|
|
1563
1599
|
|
1564
|
-
// line
|
1600
|
+
// line 693 "Parser.rl"
|
1565
1601
|
|
1566
1602
|
|
1567
|
-
|
1603
|
+
void parseArray(ParserResult res, int p, int pe) {
|
1568
1604
|
int cs = EVIL;
|
1569
1605
|
|
1570
1606
|
if (parser.maxNesting > 0 && currentNesting > parser.maxNesting) {
|
@@ -1572,21 +1608,23 @@ static final int JSON_array_en_main = 1;
|
|
1572
1608
|
"nesting of " + currentNesting + " is too deep");
|
1573
1609
|
}
|
1574
1610
|
|
1575
|
-
|
1576
|
-
|
1577
|
-
|
1578
|
-
|
1579
|
-
|
1611
|
+
IRubyObject result;
|
1612
|
+
if (parser.arrayClass == getRuntime().getArray()) {
|
1613
|
+
result = RubyArray.newArray(getRuntime());
|
1614
|
+
} else {
|
1615
|
+
result = parser.arrayClass.newInstance(context,
|
1616
|
+
IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
|
1617
|
+
}
|
1580
1618
|
|
1581
1619
|
|
1582
|
-
// line
|
1620
|
+
// line 1623 "Parser.java"
|
1583
1621
|
{
|
1584
1622
|
cs = JSON_array_start;
|
1585
1623
|
}
|
1586
1624
|
|
1587
|
-
// line
|
1625
|
+
// line 714 "Parser.rl"
|
1588
1626
|
|
1589
|
-
// line
|
1627
|
+
// line 1630 "Parser.java"
|
1590
1628
|
{
|
1591
1629
|
int _klen;
|
1592
1630
|
int _trans = 0;
|
@@ -1667,30 +1705,30 @@ case 1:
|
|
1667
1705
|
switch ( _JSON_array_actions[_acts++] )
|
1668
1706
|
{
|
1669
1707
|
case 0:
|
1670
|
-
// line
|
1708
|
+
// line 662 "Parser.rl"
|
1671
1709
|
{
|
1672
|
-
|
1673
|
-
if (res == null) {
|
1710
|
+
parseValue(res, p, pe);
|
1711
|
+
if (res.result == null) {
|
1674
1712
|
p--;
|
1675
1713
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1676
1714
|
} else {
|
1677
|
-
if (
|
1678
|
-
result.
|
1715
|
+
if (parser.arrayClass == getRuntime().getArray()) {
|
1716
|
+
((RubyArray)result).append(res.result);
|
1679
1717
|
} else {
|
1680
|
-
result.
|
1718
|
+
result.callMethod(context, "<<", res.result);
|
1681
1719
|
}
|
1682
1720
|
{p = (( res.p))-1;}
|
1683
1721
|
}
|
1684
1722
|
}
|
1685
1723
|
break;
|
1686
1724
|
case 1:
|
1687
|
-
// line
|
1725
|
+
// line 677 "Parser.rl"
|
1688
1726
|
{
|
1689
1727
|
p--;
|
1690
1728
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1691
1729
|
}
|
1692
1730
|
break;
|
1693
|
-
// line
|
1731
|
+
// line 1734 "Parser.java"
|
1694
1732
|
}
|
1695
1733
|
}
|
1696
1734
|
}
|
@@ -1710,17 +1748,17 @@ case 5:
|
|
1710
1748
|
break; }
|
1711
1749
|
}
|
1712
1750
|
|
1713
|
-
// line
|
1751
|
+
// line 715 "Parser.rl"
|
1714
1752
|
|
1715
1753
|
if (cs >= JSON_array_first_final) {
|
1716
|
-
|
1754
|
+
res.update(result, p + 1);
|
1717
1755
|
} else {
|
1718
1756
|
throw unexpectedToken(p, pe);
|
1719
1757
|
}
|
1720
1758
|
}
|
1721
1759
|
|
1722
1760
|
|
1723
|
-
// line
|
1761
|
+
// line 1764 "Parser.java"
|
1724
1762
|
private static byte[] init__JSON_object_actions_0()
|
1725
1763
|
{
|
1726
1764
|
return new byte [] {
|
@@ -1843,12 +1881,13 @@ static final int JSON_object_error = 0;
|
|
1843
1881
|
static final int JSON_object_en_main = 1;
|
1844
1882
|
|
1845
1883
|
|
1846
|
-
// line
|
1884
|
+
// line 774 "Parser.rl"
|
1847
1885
|
|
1848
1886
|
|
1849
|
-
|
1887
|
+
void parseObject(ParserResult res, int p, int pe) {
|
1850
1888
|
int cs = EVIL;
|
1851
1889
|
IRubyObject lastName = null;
|
1890
|
+
boolean objectDefault = true;
|
1852
1891
|
|
1853
1892
|
if (parser.maxNesting > 0 && currentNesting > parser.maxNesting) {
|
1854
1893
|
throw newException(Utils.M_NESTING_ERROR,
|
@@ -1857,19 +1896,24 @@ static final int JSON_object_en_main = 1;
|
|
1857
1896
|
|
1858
1897
|
// this is guaranteed to be a RubyHash due to the earlier
|
1859
1898
|
// allocator test at OptionsReader#getClass
|
1860
|
-
|
1861
|
-
|
1862
|
-
|
1899
|
+
IRubyObject result;
|
1900
|
+
if (parser.objectClass == getRuntime().getHash()) {
|
1901
|
+
result = RubyHash.newHash(getRuntime());
|
1902
|
+
} else {
|
1903
|
+
objectDefault = false;
|
1904
|
+
result = parser.objectClass.newInstance(context,
|
1905
|
+
IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
|
1906
|
+
}
|
1863
1907
|
|
1864
1908
|
|
1865
|
-
// line
|
1909
|
+
// line 1912 "Parser.java"
|
1866
1910
|
{
|
1867
1911
|
cs = JSON_object_start;
|
1868
1912
|
}
|
1869
1913
|
|
1870
|
-
// line
|
1914
|
+
// line 798 "Parser.rl"
|
1871
1915
|
|
1872
|
-
// line
|
1916
|
+
// line 1919 "Parser.java"
|
1873
1917
|
{
|
1874
1918
|
int _klen;
|
1875
1919
|
int _trans = 0;
|
@@ -1950,27 +1994,27 @@ case 1:
|
|
1950
1994
|
switch ( _JSON_object_actions[_acts++] )
|
1951
1995
|
{
|
1952
1996
|
case 0:
|
1953
|
-
// line
|
1997
|
+
// line 729 "Parser.rl"
|
1954
1998
|
{
|
1955
|
-
|
1956
|
-
if (res == null) {
|
1999
|
+
parseValue(res, p, pe);
|
2000
|
+
if (res.result == null) {
|
1957
2001
|
p--;
|
1958
2002
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1959
2003
|
} else {
|
1960
|
-
if (
|
1961
|
-
result.
|
2004
|
+
if (parser.objectClass == getRuntime().getHash()) {
|
2005
|
+
((RubyHash)result).op_aset(context, lastName, res.result);
|
1962
2006
|
} else {
|
1963
|
-
result.
|
2007
|
+
result.callMethod(context, "[]=", new IRubyObject[] { lastName, res.result });
|
1964
2008
|
}
|
1965
2009
|
{p = (( res.p))-1;}
|
1966
2010
|
}
|
1967
2011
|
}
|
1968
2012
|
break;
|
1969
2013
|
case 1:
|
1970
|
-
// line
|
2014
|
+
// line 744 "Parser.rl"
|
1971
2015
|
{
|
1972
|
-
|
1973
|
-
if (res == null) {
|
2016
|
+
parseString(res, p, pe);
|
2017
|
+
if (res.result == null) {
|
1974
2018
|
p--;
|
1975
2019
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1976
2020
|
} else {
|
@@ -1987,13 +2031,13 @@ case 1:
|
|
1987
2031
|
}
|
1988
2032
|
break;
|
1989
2033
|
case 2:
|
1990
|
-
// line
|
2034
|
+
// line 762 "Parser.rl"
|
1991
2035
|
{
|
1992
2036
|
p--;
|
1993
2037
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1994
2038
|
}
|
1995
2039
|
break;
|
1996
|
-
// line
|
2040
|
+
// line 2043 "Parser.java"
|
1997
2041
|
}
|
1998
2042
|
}
|
1999
2043
|
}
|
@@ -2013,17 +2057,24 @@ case 5:
|
|
2013
2057
|
break; }
|
2014
2058
|
}
|
2015
2059
|
|
2016
|
-
// line
|
2060
|
+
// line 799 "Parser.rl"
|
2017
2061
|
|
2018
2062
|
if (cs < JSON_object_first_final) {
|
2019
|
-
|
2063
|
+
res.update(null, p + 1);
|
2064
|
+
return;
|
2020
2065
|
}
|
2021
2066
|
|
2022
2067
|
IRubyObject returnedResult = result;
|
2023
2068
|
|
2024
2069
|
// attempt to de-serialize object
|
2025
2070
|
if (parser.createAdditions) {
|
2026
|
-
IRubyObject vKlassName
|
2071
|
+
IRubyObject vKlassName;
|
2072
|
+
if (objectDefault) {
|
2073
|
+
vKlassName = ((RubyHash)result).op_aref(context, parser.createId);
|
2074
|
+
} else {
|
2075
|
+
vKlassName = result.callMethod(context, "[]", parser.createId);
|
2076
|
+
}
|
2077
|
+
|
2027
2078
|
if (!vKlassName.isNil()) {
|
2028
2079
|
// might throw ArgumentError, we let it propagate
|
2029
2080
|
IRubyObject klass = parser.info.jsonModule.get().
|
@@ -2035,11 +2086,11 @@ case 5:
|
|
2035
2086
|
}
|
2036
2087
|
}
|
2037
2088
|
}
|
2038
|
-
|
2089
|
+
res.update(returnedResult, p + 1);
|
2039
2090
|
}
|
2040
2091
|
|
2041
2092
|
|
2042
|
-
// line
|
2093
|
+
// line 2096 "Parser.java"
|
2043
2094
|
private static byte[] init__JSON_actions_0()
|
2044
2095
|
{
|
2045
2096
|
return new byte [] {
|
@@ -2143,25 +2194,26 @@ static final int JSON_error = 0;
|
|
2143
2194
|
static final int JSON_en_main = 1;
|
2144
2195
|
|
2145
2196
|
|
2146
|
-
// line
|
2197
|
+
// line 864 "Parser.rl"
|
2147
2198
|
|
2148
2199
|
|
2149
2200
|
public IRubyObject parseStrict() {
|
2150
2201
|
int cs = EVIL;
|
2151
2202
|
int p, pe;
|
2152
2203
|
IRubyObject result = null;
|
2204
|
+
ParserResult res = new ParserResult();
|
2153
2205
|
|
2154
2206
|
|
2155
|
-
// line
|
2207
|
+
// line 2210 "Parser.java"
|
2156
2208
|
{
|
2157
2209
|
cs = JSON_start;
|
2158
2210
|
}
|
2159
2211
|
|
2160
|
-
// line
|
2212
|
+
// line 873 "Parser.rl"
|
2161
2213
|
p = byteList.begin();
|
2162
2214
|
pe = p + byteList.length();
|
2163
2215
|
|
2164
|
-
// line
|
2216
|
+
// line 2219 "Parser.java"
|
2165
2217
|
{
|
2166
2218
|
int _klen;
|
2167
2219
|
int _trans = 0;
|
@@ -2242,11 +2294,11 @@ case 1:
|
|
2242
2294
|
switch ( _JSON_actions[_acts++] )
|
2243
2295
|
{
|
2244
2296
|
case 0:
|
2245
|
-
// line
|
2297
|
+
// line 836 "Parser.rl"
|
2246
2298
|
{
|
2247
2299
|
currentNesting = 1;
|
2248
|
-
|
2249
|
-
if (res == null) {
|
2300
|
+
parseObject(res, p, pe);
|
2301
|
+
if (res.result == null) {
|
2250
2302
|
p--;
|
2251
2303
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
2252
2304
|
} else {
|
@@ -2256,11 +2308,11 @@ case 1:
|
|
2256
2308
|
}
|
2257
2309
|
break;
|
2258
2310
|
case 1:
|
2259
|
-
// line
|
2311
|
+
// line 848 "Parser.rl"
|
2260
2312
|
{
|
2261
2313
|
currentNesting = 1;
|
2262
|
-
|
2263
|
-
if (res == null) {
|
2314
|
+
parseArray(res, p, pe);
|
2315
|
+
if (res.result == null) {
|
2264
2316
|
p--;
|
2265
2317
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
2266
2318
|
} else {
|
@@ -2269,7 +2321,7 @@ case 1:
|
|
2269
2321
|
}
|
2270
2322
|
}
|
2271
2323
|
break;
|
2272
|
-
// line
|
2324
|
+
// line 2327 "Parser.java"
|
2273
2325
|
}
|
2274
2326
|
}
|
2275
2327
|
}
|
@@ -2289,7 +2341,7 @@ case 5:
|
|
2289
2341
|
break; }
|
2290
2342
|
}
|
2291
2343
|
|
2292
|
-
// line
|
2344
|
+
// line 876 "Parser.rl"
|
2293
2345
|
|
2294
2346
|
if (cs >= JSON_first_final && p == pe) {
|
2295
2347
|
return result;
|
@@ -2299,7 +2351,7 @@ case 5:
|
|
2299
2351
|
}
|
2300
2352
|
|
2301
2353
|
|
2302
|
-
// line
|
2354
|
+
// line 2357 "Parser.java"
|
2303
2355
|
private static byte[] init__JSON_quirks_mode_actions_0()
|
2304
2356
|
{
|
2305
2357
|
return new byte [] {
|
@@ -2402,25 +2454,26 @@ static final int JSON_quirks_mode_error = 0;
|
|
2402
2454
|
static final int JSON_quirks_mode_en_main = 1;
|
2403
2455
|
|
2404
2456
|
|
2405
|
-
// line
|
2457
|
+
// line 904 "Parser.rl"
|
2406
2458
|
|
2407
2459
|
|
2408
2460
|
public IRubyObject parseQuirksMode() {
|
2409
2461
|
int cs = EVIL;
|
2410
2462
|
int p, pe;
|
2411
2463
|
IRubyObject result = null;
|
2464
|
+
ParserResult res = new ParserResult();
|
2412
2465
|
|
2413
2466
|
|
2414
|
-
// line
|
2467
|
+
// line 2470 "Parser.java"
|
2415
2468
|
{
|
2416
2469
|
cs = JSON_quirks_mode_start;
|
2417
2470
|
}
|
2418
2471
|
|
2419
|
-
// line
|
2472
|
+
// line 913 "Parser.rl"
|
2420
2473
|
p = byteList.begin();
|
2421
2474
|
pe = p + byteList.length();
|
2422
2475
|
|
2423
|
-
// line
|
2476
|
+
// line 2479 "Parser.java"
|
2424
2477
|
{
|
2425
2478
|
int _klen;
|
2426
2479
|
int _trans = 0;
|
@@ -2501,10 +2554,10 @@ case 1:
|
|
2501
2554
|
switch ( _JSON_quirks_mode_actions[_acts++] )
|
2502
2555
|
{
|
2503
2556
|
case 0:
|
2504
|
-
// line
|
2557
|
+
// line 890 "Parser.rl"
|
2505
2558
|
{
|
2506
|
-
|
2507
|
-
if (res == null) {
|
2559
|
+
parseValue(res, p, pe);
|
2560
|
+
if (res.result == null) {
|
2508
2561
|
p--;
|
2509
2562
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
2510
2563
|
} else {
|
@@ -2513,7 +2566,7 @@ case 1:
|
|
2513
2566
|
}
|
2514
2567
|
}
|
2515
2568
|
break;
|
2516
|
-
// line
|
2569
|
+
// line 2572 "Parser.java"
|
2517
2570
|
}
|
2518
2571
|
}
|
2519
2572
|
}
|
@@ -2533,7 +2586,7 @@ case 5:
|
|
2533
2586
|
break; }
|
2534
2587
|
}
|
2535
2588
|
|
2536
|
-
// line
|
2589
|
+
// line 916 "Parser.rl"
|
2537
2590
|
|
2538
2591
|
if (cs >= JSON_quirks_mode_first_final && p == pe) {
|
2539
2592
|
return result;
|
@@ -2552,16 +2605,14 @@ case 5:
|
|
2552
2605
|
}
|
2553
2606
|
|
2554
2607
|
/**
|
2555
|
-
*
|
2556
|
-
* array byte offsets (i.e., the ByteList's own begin offset is not
|
2557
|
-
* automatically added).
|
2608
|
+
* Updates the "view" bytelist with the new offsets and returns it.
|
2558
2609
|
* @param start
|
2559
2610
|
* @param end
|
2560
2611
|
*/
|
2561
2612
|
private ByteList absSubSequence(int absStart, int absEnd) {
|
2562
|
-
|
2563
|
-
|
2564
|
-
|
2613
|
+
view.setBegin(absStart);
|
2614
|
+
view.setRealSize(absEnd - absStart);
|
2615
|
+
return view;
|
2565
2616
|
}
|
2566
2617
|
|
2567
2618
|
/**
|