scout 5.6.7 → 5.6.8.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. data/CHANGELOG.markdown +4 -0
  2. data/lib/scout/version.rb +1 -1
  3. data/vendor/json_pure/.gitignore +12 -0
  4. data/vendor/json_pure/.travis.yml +20 -0
  5. data/vendor/json_pure/CHANGES +120 -0
  6. data/vendor/json_pure/COPYING-json-jruby +57 -0
  7. data/vendor/json_pure/Gemfile +11 -0
  8. data/vendor/json_pure/README-json-jruby.markdown +33 -0
  9. data/vendor/json_pure/{README → README.rdoc} +7 -7
  10. data/vendor/json_pure/Rakefile +305 -185
  11. data/vendor/json_pure/VERSION +1 -1
  12. data/vendor/json_pure/diagrams/.keep +0 -0
  13. data/vendor/json_pure/ext/json/ext/fbuffer/fbuffer.h +181 -0
  14. data/vendor/json_pure/ext/json/ext/generator/depend +1 -0
  15. data/vendor/json_pure/ext/json/ext/generator/extconf.rb +4 -6
  16. data/vendor/json_pure/ext/json/ext/generator/generator.c +463 -369
  17. data/vendor/json_pure/ext/json/ext/generator/generator.h +44 -66
  18. data/vendor/json_pure/ext/json/ext/parser/depend +1 -0
  19. data/vendor/json_pure/ext/json/ext/parser/extconf.rb +3 -5
  20. data/vendor/json_pure/ext/json/ext/parser/parser.c +580 -311
  21. data/vendor/json_pure/ext/json/ext/parser/parser.h +14 -8
  22. data/vendor/json_pure/ext/json/ext/parser/parser.rl +242 -107
  23. data/vendor/json_pure/install.rb +8 -11
  24. data/vendor/json_pure/java/src/json/ext/ByteListTranscoder.java +167 -0
  25. data/vendor/json_pure/java/src/json/ext/Generator.java +444 -0
  26. data/vendor/json_pure/java/src/json/ext/GeneratorMethods.java +232 -0
  27. data/vendor/json_pure/java/src/json/ext/GeneratorService.java +43 -0
  28. data/vendor/json_pure/java/src/json/ext/GeneratorState.java +543 -0
  29. data/vendor/json_pure/java/src/json/ext/OptionsReader.java +114 -0
  30. data/vendor/json_pure/java/src/json/ext/Parser.java +2644 -0
  31. data/vendor/json_pure/java/src/json/ext/Parser.rl +968 -0
  32. data/vendor/json_pure/java/src/json/ext/ParserService.java +35 -0
  33. data/vendor/json_pure/java/src/json/ext/RuntimeInfo.java +121 -0
  34. data/vendor/json_pure/java/src/json/ext/StringDecoder.java +167 -0
  35. data/vendor/json_pure/java/src/json/ext/StringEncoder.java +106 -0
  36. data/vendor/json_pure/java/src/json/ext/Utils.java +89 -0
  37. data/vendor/json_pure/json-java.gemspec +23 -0
  38. data/vendor/json_pure/json.gemspec +37 -0
  39. data/vendor/json_pure/json_pure.gemspec +39 -0
  40. data/vendor/json_pure/lib/json.rb +52 -0
  41. data/vendor/json_pure/lib/json/add/bigdecimal.rb +28 -0
  42. data/vendor/json_pure/lib/json/add/complex.rb +22 -0
  43. data/vendor/json_pure/lib/json/add/core.rb +9 -146
  44. data/vendor/json_pure/lib/json/add/date.rb +34 -0
  45. data/vendor/json_pure/lib/json/add/date_time.rb +50 -0
  46. data/vendor/json_pure/lib/json/add/exception.rb +31 -0
  47. data/vendor/json_pure/lib/json/add/ostruct.rb +31 -0
  48. data/vendor/json_pure/lib/json/add/range.rb +29 -0
  49. data/vendor/json_pure/lib/json/add/rational.rb +22 -0
  50. data/vendor/json_pure/lib/json/add/regexp.rb +30 -0
  51. data/vendor/json_pure/lib/json/add/struct.rb +30 -0
  52. data/vendor/json_pure/lib/json/add/symbol.rb +25 -0
  53. data/vendor/json_pure/lib/json/add/time.rb +38 -0
  54. data/vendor/json_pure/lib/json/common.rb +157 -67
  55. data/vendor/json_pure/lib/json/ext.rb +8 -2
  56. data/vendor/json_pure/lib/json/ext/.keep +0 -0
  57. data/vendor/json_pure/lib/json/generic_object.rb +70 -0
  58. data/vendor/json_pure/lib/json/pure.rb +8 -64
  59. data/vendor/json_pure/lib/json/pure/generator.rb +183 -113
  60. data/vendor/json_pure/lib/json/pure/parser.rb +118 -66
  61. data/vendor/json_pure/lib/json/version.rb +1 -1
  62. data/vendor/json_pure/tests/fixtures/fail18.json +1 -1
  63. data/vendor/json_pure/tests/setup_variant.rb +11 -0
  64. data/vendor/json_pure/tests/test_json.rb +233 -28
  65. data/vendor/json_pure/tests/test_json_addition.rb +68 -34
  66. data/vendor/json_pure/tests/test_json_encoding.rb +11 -14
  67. data/vendor/json_pure/tests/test_json_fixtures.rb +11 -10
  68. data/vendor/json_pure/tests/test_json_generate.rb +207 -7
  69. data/vendor/json_pure/tests/test_json_generic_object.rb +75 -0
  70. data/vendor/json_pure/tests/test_json_string_matching.rb +39 -0
  71. data/vendor/json_pure/tests/test_json_unicode.rb +3 -7
  72. data/vendor/json_pure/tools/fuzz.rb +1 -1
  73. data/vendor/json_pure/tools/server.rb +1 -0
  74. metadata +87 -94
  75. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log +0 -52
  76. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat +0 -1000
  77. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat +0 -1001
  78. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat +0 -900
  79. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat +0 -901
  80. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat +0 -1000
  81. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat +0 -1001
  82. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log +0 -261
  83. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat +0 -1000
  84. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat +0 -1001
  85. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat +0 -1000
  86. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat +0 -1001
  87. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat +0 -1000
  88. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat +0 -1001
  89. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log +0 -262
  90. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat +0 -1000
  91. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat +0 -1001
  92. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log +0 -82
  93. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log +0 -34
  94. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat +0 -900
  95. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat +0 -901
  96. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log +0 -81
  97. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat +0 -1000
  98. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat +0 -1001
  99. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log +0 -82
  100. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat +0 -1000
  101. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat +0 -1001
  102. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log +0 -82
  103. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat +0 -1000
  104. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat +0 -1001
  105. data/vendor/json_pure/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log +0 -82
  106. data/vendor/json_pure/benchmarks/generator2_benchmark.rb +0 -222
  107. data/vendor/json_pure/benchmarks/generator_benchmark.rb +0 -224
  108. data/vendor/json_pure/benchmarks/ohai.json +0 -1216
  109. data/vendor/json_pure/benchmarks/ohai.ruby +0 -1
  110. data/vendor/json_pure/benchmarks/parser2_benchmark.rb +0 -251
  111. data/vendor/json_pure/benchmarks/parser_benchmark.rb +0 -259
  112. data/vendor/json_pure/bin/edit_json.rb +0 -9
  113. data/vendor/json_pure/bin/prettify_json.rb +0 -75
  114. data/vendor/json_pure/lib/json/Array.xpm +0 -21
  115. data/vendor/json_pure/lib/json/FalseClass.xpm +0 -21
  116. data/vendor/json_pure/lib/json/Hash.xpm +0 -21
  117. data/vendor/json_pure/lib/json/Key.xpm +0 -73
  118. data/vendor/json_pure/lib/json/NilClass.xpm +0 -21
  119. data/vendor/json_pure/lib/json/Numeric.xpm +0 -28
  120. data/vendor/json_pure/lib/json/String.xpm +0 -96
  121. data/vendor/json_pure/lib/json/TrueClass.xpm +0 -21
  122. data/vendor/json_pure/lib/json/add/rails.rb +0 -58
  123. data/vendor/json_pure/lib/json/editor.rb +0 -1371
  124. data/vendor/json_pure/lib/json/json.xpm +0 -1499
  125. data/vendor/json_pure/tests/test_json_rails.rb +0 -144
@@ -0,0 +1,114 @@
1
+ /*
2
+ * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
3
+ *
4
+ * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
5
+ * for details.
6
+ */
7
+ package json.ext;
8
+
9
+ import org.jruby.Ruby;
10
+ import org.jruby.RubyClass;
11
+ import org.jruby.RubyHash;
12
+ import org.jruby.RubyNumeric;
13
+ import org.jruby.RubyString;
14
+ import org.jruby.runtime.ThreadContext;
15
+ import org.jruby.runtime.builtin.IRubyObject;
16
+ import org.jruby.util.ByteList;
17
+
18
+ final class OptionsReader {
19
+ private final ThreadContext context;
20
+ private final Ruby runtime;
21
+ private final RubyHash opts;
22
+ private RuntimeInfo info;
23
+
24
+ OptionsReader(ThreadContext context, IRubyObject vOpts) {
25
+ this.context = context;
26
+ this.runtime = context.getRuntime();
27
+ if (vOpts == null || vOpts.isNil()) {
28
+ opts = null;
29
+ } else if (vOpts.respondsTo("to_hash")) {
30
+ opts = vOpts.convertToHash();
31
+ } else if (vOpts.respondsTo("to_h")) {
32
+ opts = vOpts.callMethod(context, "to_h").convertToHash();
33
+ } else {
34
+ opts = vOpts.convertToHash(); /* Should just raise the correct TypeError */
35
+ }
36
+ }
37
+
38
+ private RuntimeInfo getRuntimeInfo() {
39
+ if (info != null) return info;
40
+ info = RuntimeInfo.forRuntime(runtime);
41
+ return info;
42
+ }
43
+
44
+ /**
45
+ * Efficiently looks up items with a {@link RubySymbol Symbol} key
46
+ * @param key The Symbol name to look up for
47
+ * @return The item in the {@link RubyHash Hash}, or <code>null</code>
48
+ * if not found
49
+ */
50
+ IRubyObject get(String key) {
51
+ return opts == null ? null : opts.fastARef(runtime.newSymbol(key));
52
+ }
53
+
54
+ boolean getBool(String key, boolean defaultValue) {
55
+ IRubyObject value = get(key);
56
+ return value == null ? defaultValue : value.isTrue();
57
+ }
58
+
59
+ int getInt(String key, int defaultValue) {
60
+ IRubyObject value = get(key);
61
+ if (value == null) return defaultValue;
62
+ if (!value.isTrue()) return 0;
63
+ return RubyNumeric.fix2int(value);
64
+ }
65
+
66
+ /**
67
+ * Reads the setting from the options hash. If no entry is set for this
68
+ * key or if it evaluates to <code>false</code>, returns null; attempts to
69
+ * coerce the value to {@link RubyString String} otherwise.
70
+ * @param key The Symbol name to look up for
71
+ * @return <code>null</code> if the key is not in the Hash or if
72
+ * its value evaluates to <code>false</code>
73
+ * @throws RaiseException <code>TypeError</code> if the value does not
74
+ * evaluate to <code>false</code> and can't be
75
+ * converted to string
76
+ */
77
+ ByteList getString(String key) {
78
+ RubyString str = getString(key, null);
79
+ return str == null ? null : str.getByteList().dup();
80
+ }
81
+
82
+ RubyString getString(String key, RubyString defaultValue) {
83
+ IRubyObject value = get(key);
84
+ if (value == null || !value.isTrue()) return defaultValue;
85
+
86
+ RubyString str = value.convertToString();
87
+ RuntimeInfo info = getRuntimeInfo();
88
+ if (info.encodingsSupported() && str.encoding(context) != info.utf8.get()) {
89
+ str = (RubyString)str.encode(context, info.utf8.get());
90
+ }
91
+ return str;
92
+ }
93
+
94
+ /**
95
+ * Reads the setting from the options hash. If it is <code>nil</code> or
96
+ * undefined, returns the default value given.
97
+ * If not, ensures it is a RubyClass instance and shares the same
98
+ * allocator as the default value (i.e. for the basic types which have
99
+ * their specific allocators, this ensures the passed value is
100
+ * a subclass of them).
101
+ */
102
+ RubyClass getClass(String key, RubyClass defaultValue) {
103
+ IRubyObject value = get(key);
104
+
105
+ if (value == null || value.isNil()) return defaultValue;
106
+ return (RubyClass)value;
107
+ }
108
+
109
+ public RubyHash getHash(String key) {
110
+ IRubyObject value = get(key);
111
+ if (value == null || value.isNil()) return new RubyHash(runtime);
112
+ return (RubyHash) value;
113
+ }
114
+ }
@@ -0,0 +1,2644 @@
1
+
2
+ // line 1 "Parser.rl"
3
+ /*
4
+ * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
5
+ *
6
+ * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
7
+ * for details.
8
+ */
9
+ package json.ext;
10
+
11
+ import org.jruby.Ruby;
12
+ import org.jruby.RubyArray;
13
+ import org.jruby.RubyClass;
14
+ import org.jruby.RubyEncoding;
15
+ import org.jruby.RubyFloat;
16
+ import org.jruby.RubyHash;
17
+ import org.jruby.RubyInteger;
18
+ import org.jruby.RubyModule;
19
+ import org.jruby.RubyNumeric;
20
+ import org.jruby.RubyObject;
21
+ import org.jruby.RubyString;
22
+ import org.jruby.anno.JRubyMethod;
23
+ import org.jruby.exceptions.JumpException;
24
+ import org.jruby.exceptions.RaiseException;
25
+ import org.jruby.runtime.Block;
26
+ import org.jruby.runtime.ObjectAllocator;
27
+ import org.jruby.runtime.ThreadContext;
28
+ import org.jruby.runtime.Visibility;
29
+ import org.jruby.runtime.builtin.IRubyObject;
30
+ import org.jruby.util.ByteList;
31
+ import org.jruby.util.ConvertBytes;
32
+ import static org.jruby.util.ConvertDouble.DoubleConverter;
33
+
34
+ /**
35
+ * The <code>JSON::Ext::Parser</code> class.
36
+ *
37
+ * <p>This is the JSON parser implemented as a Java class. To use it as the
38
+ * standard parser, set
39
+ * <pre>JSON.parser = JSON::Ext::Parser</pre>
40
+ * This is performed for you when you <code>include "json/ext"</code>.
41
+ *
42
+ * <p>This class does not perform the actual parsing, just acts as an interface
43
+ * to Ruby code. When the {@link #parse()} method is invoked, a
44
+ * Parser.ParserSession object is instantiated, which handles the process.
45
+ *
46
+ * @author mernen
47
+ */
48
+ public class Parser extends RubyObject {
49
+ private final RuntimeInfo info;
50
+ private RubyString vSource;
51
+ private RubyString createId;
52
+ private boolean createAdditions;
53
+ private int maxNesting;
54
+ private boolean allowNaN;
55
+ private boolean symbolizeNames;
56
+ private boolean quirksMode;
57
+ private RubyClass objectClass;
58
+ private RubyClass arrayClass;
59
+ private RubyHash match_string;
60
+
61
+ private static final int DEFAULT_MAX_NESTING = 100;
62
+
63
+ private static final ByteList JSON_MINUS_INFINITY = new ByteList(ByteList.plain("-Infinity"));
64
+ // constant names in the JSON module containing those values
65
+ private static final String CONST_NAN = "NaN";
66
+ private static final String CONST_INFINITY = "Infinity";
67
+ private static final String CONST_MINUS_INFINITY = "MinusInfinity";
68
+
69
+ static final ObjectAllocator ALLOCATOR = new ObjectAllocator() {
70
+ public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
71
+ return new Parser(runtime, klazz);
72
+ }
73
+ };
74
+
75
+ /**
76
+ * Multiple-value return for internal parser methods.
77
+ *
78
+ * <p>All the <code>parse<var>Stuff</var></code> methods return instances of
79
+ * <code>ParserResult</code> when successful, or <code>null</code> when
80
+ * there's a problem with the input data.
81
+ */
82
+ static final class ParserResult {
83
+ /**
84
+ * The result of the successful parsing. Should never be
85
+ * <code>null</code>.
86
+ */
87
+ IRubyObject result;
88
+ /**
89
+ * The point where the parser returned.
90
+ */
91
+ int p;
92
+
93
+ void update(IRubyObject result, int p) {
94
+ this.result = result;
95
+ this.p = p;
96
+ }
97
+ }
98
+
99
+ public Parser(Ruby runtime, RubyClass metaClass) {
100
+ super(runtime, metaClass);
101
+ info = RuntimeInfo.forRuntime(runtime);
102
+ }
103
+
104
+ /**
105
+ * <code>Parser.new(source, opts = {})</code>
106
+ *
107
+ * <p>Creates a new <code>JSON::Ext::Parser</code> instance for the string
108
+ * <code>source</code>.
109
+ * It will be configured by the <code>opts</code> Hash.
110
+ * <code>opts</code> can have the following keys:
111
+ *
112
+ * <dl>
113
+ * <dt><code>:max_nesting</code>
114
+ * <dd>The maximum depth of nesting allowed in the parsed data
115
+ * structures. Disable depth checking with <code>:max_nesting => false|nil|0</code>,
116
+ * it defaults to 100.
117
+ *
118
+ * <dt><code>:allow_nan</code>
119
+ * <dd>If set to <code>true</code>, allow <code>NaN</code>,
120
+ * <code>Infinity</code> and <code>-Infinity</code> in defiance of RFC 4627
121
+ * to be parsed by the Parser. This option defaults to <code>false</code>.
122
+ *
123
+ * <dt><code>:symbolize_names</code>
124
+ * <dd>If set to <code>true</code>, returns symbols for the names (keys) in
125
+ * a JSON object. Otherwise strings are returned, which is also the default.
126
+ *
127
+ * <dt><code>:quirks_mode?</code>
128
+ * <dd>If set to <code>true</code>, if the parse is in quirks_mode, false
129
+ * otherwise.
130
+ *
131
+ * <dt><code>:create_additions</code>
132
+ * <dd>If set to <code>false</code>, the Parser doesn't create additions
133
+ * even if a matchin class and <code>create_id</code> was found. This option
134
+ * defaults to <code>true</code>.
135
+ *
136
+ * <dt><code>:object_class</code>
137
+ * <dd>Defaults to Hash.
138
+ *
139
+ * <dt><code>:array_class</code>
140
+ * <dd>Defaults to Array.
141
+ *
142
+ * <dt><code>:quirks_mode</code>
143
+ * <dd>Enables quirks_mode for parser, that is for example parsing single
144
+ * JSON values instead of documents is possible.
145
+ * </dl>
146
+ */
147
+ @JRubyMethod(name = "new", required = 1, optional = 1, meta = true)
148
+ public static IRubyObject newInstance(IRubyObject clazz, IRubyObject[] args, Block block) {
149
+ Parser parser = (Parser)((RubyClass)clazz).allocate();
150
+
151
+ parser.callInit(args, block);
152
+
153
+ return parser;
154
+ }
155
+
156
+ @JRubyMethod(required = 1, optional = 1, visibility = Visibility.PRIVATE)
157
+ public IRubyObject initialize(ThreadContext context, IRubyObject[] args) {
158
+ Ruby runtime = context.getRuntime();
159
+ if (this.vSource != null) {
160
+ throw runtime.newTypeError("already initialized instance");
161
+ }
162
+
163
+ OptionsReader opts = new OptionsReader(context, args.length > 1 ? args[1] : null);
164
+ this.maxNesting = opts.getInt("max_nesting", DEFAULT_MAX_NESTING);
165
+ this.allowNaN = opts.getBool("allow_nan", false);
166
+ this.symbolizeNames = opts.getBool("symbolize_names", false);
167
+ this.quirksMode = opts.getBool("quirks_mode", false);
168
+ this.createId = opts.getString("create_id", getCreateId(context));
169
+ this.createAdditions = opts.getBool("create_additions", false);
170
+ this.objectClass = opts.getClass("object_class", runtime.getHash());
171
+ this.arrayClass = opts.getClass("array_class", runtime.getArray());
172
+ this.match_string = opts.getHash("match_string");
173
+
174
+ this.vSource = args[0].convertToString();
175
+ if (!quirksMode) this.vSource = convertEncoding(context, vSource);
176
+
177
+ return this;
178
+ }
179
+
180
+ /**
181
+ * Checks the given string's encoding. If a non-UTF-8 encoding is detected,
182
+ * a converted copy is returned.
183
+ * Returns the source string if no conversion is needed.
184
+ */
185
+ private RubyString convertEncoding(ThreadContext context, RubyString source) {
186
+ ByteList bl = source.getByteList();
187
+ int len = bl.length();
188
+ if (len < 2) {
189
+ throw Utils.newException(context, Utils.M_PARSER_ERROR,
190
+ "A JSON text must at least contain two octets!");
191
+ }
192
+
193
+ if (info.encodingsSupported()) {
194
+ RubyEncoding encoding = (RubyEncoding)source.encoding(context);
195
+ if (encoding != info.ascii8bit.get()) {
196
+ return (RubyString)source.encode(context, info.utf8.get());
197
+ }
198
+
199
+ String sniffedEncoding = sniffByteList(bl);
200
+ if (sniffedEncoding == null) return source; // assume UTF-8
201
+ return reinterpretEncoding(context, source, sniffedEncoding);
202
+ }
203
+
204
+ String sniffedEncoding = sniffByteList(bl);
205
+ if (sniffedEncoding == null) return source; // assume UTF-8
206
+ Ruby runtime = context.getRuntime();
207
+ return (RubyString)info.jsonModule.get().
208
+ callMethod(context, "iconv",
209
+ new IRubyObject[] {
210
+ runtime.newString("utf-8"),
211
+ runtime.newString(sniffedEncoding),
212
+ source});
213
+ }
214
+
215
+ /**
216
+ * Checks the first four bytes of the given ByteList to infer its encoding,
217
+ * using the principle demonstrated on section 3 of RFC 4627 (JSON).
218
+ */
219
+ private static String sniffByteList(ByteList bl) {
220
+ if (bl.length() < 4) return null;
221
+ if (bl.get(0) == 0 && bl.get(2) == 0) {
222
+ return bl.get(1) == 0 ? "utf-32be" : "utf-16be";
223
+ }
224
+ if (bl.get(1) == 0 && bl.get(3) == 0) {
225
+ return bl.get(2) == 0 ? "utf-32le" : "utf-16le";
226
+ }
227
+ return null;
228
+ }
229
+
230
+ /**
231
+ * Assumes the given (binary) RubyString to be in the given encoding, then
232
+ * converts it to UTF-8.
233
+ */
234
+ private RubyString reinterpretEncoding(ThreadContext context,
235
+ RubyString str, String sniffedEncoding) {
236
+ RubyEncoding actualEncoding = info.getEncoding(context, sniffedEncoding);
237
+ RubyEncoding targetEncoding = info.utf8.get();
238
+ RubyString dup = (RubyString)str.dup();
239
+ dup.force_encoding(context, actualEncoding);
240
+ return (RubyString)dup.encode_bang(context, targetEncoding);
241
+ }
242
+
243
+ /**
244
+ * <code>Parser#parse()</code>
245
+ *
246
+ * <p>Parses the current JSON text <code>source</code> and returns the
247
+ * complete data structure as a result.
248
+ */
249
+ @JRubyMethod
250
+ public IRubyObject parse(ThreadContext context) {
251
+ return new ParserSession(this, context).parse();
252
+ }
253
+
254
+ /**
255
+ * <code>Parser#source()</code>
256
+ *
257
+ * <p>Returns a copy of the current <code>source</code> string, that was
258
+ * used to construct this Parser.
259
+ */
260
+ @JRubyMethod(name = "source")
261
+ public IRubyObject source_get() {
262
+ return checkAndGetSource().dup();
263
+ }
264
+
265
+ /**
266
+ * <code>Parser#quirks_mode?()</code>
267
+ *
268
+ * <p>If set to <code>true</code>, if the parse is in quirks_mode, false
269
+ * otherwise.
270
+ */
271
+ @JRubyMethod(name = "quirks_mode?")
272
+ public IRubyObject quirks_mode_p(ThreadContext context) {
273
+ return context.getRuntime().newBoolean(quirksMode);
274
+ }
275
+
276
+ public RubyString checkAndGetSource() {
277
+ if (vSource != null) {
278
+ return vSource;
279
+ } else {
280
+ throw getRuntime().newTypeError("uninitialized instance");
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Queries <code>JSON.create_id</code>. Returns <code>null</code> if it is
286
+ * set to <code>nil</code> or <code>false</code>, and a String if not.
287
+ */
288
+ private RubyString getCreateId(ThreadContext context) {
289
+ IRubyObject v = info.jsonModule.get().callMethod(context, "create_id");
290
+ return v.isTrue() ? v.convertToString() : null;
291
+ }
292
+
293
+ /**
294
+ * A string parsing session.
295
+ *
296
+ * <p>Once a ParserSession is instantiated, the source string should not
297
+ * change until the parsing is complete. The ParserSession object assumes
298
+ * the source {@link RubyString} is still associated to its original
299
+ * {@link ByteList}, which in turn must still be bound to the same
300
+ * <code>byte[]</code> value (and on the same offset).
301
+ */
302
+ // Ragel uses lots of fall-through
303
+ @SuppressWarnings("fallthrough")
304
+ private static class ParserSession {
305
+ private final Parser parser;
306
+ private final ThreadContext context;
307
+ private final ByteList byteList;
308
+ private final ByteList view;
309
+ private final byte[] data;
310
+ private final StringDecoder decoder;
311
+ private int currentNesting = 0;
312
+ private final DoubleConverter dc;
313
+
314
+ // initialization value for all state variables.
315
+ // no idea about the origins of this value, ask Flori ;)
316
+ private static final int EVIL = 0x666;
317
+
318
+ private ParserSession(Parser parser, ThreadContext context) {
319
+ this.parser = parser;
320
+ this.context = context;
321
+ this.byteList = parser.checkAndGetSource().getByteList();
322
+ this.data = byteList.unsafeBytes();
323
+ this.view = new ByteList(data, false);
324
+ this.decoder = new StringDecoder(context);
325
+ this.dc = new DoubleConverter();
326
+ }
327
+
328
+ private RaiseException unexpectedToken(int absStart, int absEnd) {
329
+ RubyString msg = getRuntime().newString("unexpected token at '")
330
+ .cat(data, absStart, absEnd - absStart)
331
+ .cat((byte)'\'');
332
+ return newException(Utils.M_PARSER_ERROR, msg);
333
+ }
334
+
335
+ private Ruby getRuntime() {
336
+ return context.getRuntime();
337
+ }
338
+
339
+
340
+ // line 363 "Parser.rl"
341
+
342
+
343
+
344
+ // line 345 "Parser.java"
345
+ private static byte[] init__JSON_value_actions_0()
346
+ {
347
+ return new byte [] {
348
+ 0, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1,
349
+ 5, 1, 6, 1, 7, 1, 8, 1, 9
350
+ };
351
+ }
352
+
353
+ private static final byte _JSON_value_actions[] = init__JSON_value_actions_0();
354
+
355
+
356
+ private static byte[] init__JSON_value_key_offsets_0()
357
+ {
358
+ return new byte [] {
359
+ 0, 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
360
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30
361
+ };
362
+ }
363
+
364
+ private static final byte _JSON_value_key_offsets[] = init__JSON_value_key_offsets_0();
365
+
366
+
367
+ private static char[] init__JSON_value_trans_keys_0()
368
+ {
369
+ return new char [] {
370
+ 34, 45, 73, 78, 91, 102, 110, 116, 123, 48, 57, 110,
371
+ 102, 105, 110, 105, 116, 121, 97, 78, 97, 108, 115, 101,
372
+ 117, 108, 108, 114, 117, 101, 0
373
+ };
374
+ }
375
+
376
+ private static final char _JSON_value_trans_keys[] = init__JSON_value_trans_keys_0();
377
+
378
+
379
+ private static byte[] init__JSON_value_single_lengths_0()
380
+ {
381
+ return new byte [] {
382
+ 0, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
383
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0
384
+ };
385
+ }
386
+
387
+ private static final byte _JSON_value_single_lengths[] = init__JSON_value_single_lengths_0();
388
+
389
+
390
+ private static byte[] init__JSON_value_range_lengths_0()
391
+ {
392
+ return new byte [] {
393
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
394
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
395
+ };
396
+ }
397
+
398
+ private static final byte _JSON_value_range_lengths[] = init__JSON_value_range_lengths_0();
399
+
400
+
401
+ private static byte[] init__JSON_value_index_offsets_0()
402
+ {
403
+ return new byte [] {
404
+ 0, 0, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29,
405
+ 31, 33, 35, 37, 39, 41, 43, 45, 47, 49
406
+ };
407
+ }
408
+
409
+ private static final byte _JSON_value_index_offsets[] = init__JSON_value_index_offsets_0();
410
+
411
+
412
+ private static byte[] init__JSON_value_trans_targs_0()
413
+ {
414
+ return new byte [] {
415
+ 21, 21, 2, 9, 21, 11, 15, 18, 21, 21, 0, 3,
416
+ 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 21,
417
+ 0, 10, 0, 21, 0, 12, 0, 13, 0, 14, 0, 21,
418
+ 0, 16, 0, 17, 0, 21, 0, 19, 0, 20, 0, 21,
419
+ 0, 0, 0
420
+ };
421
+ }
422
+
423
+ private static final byte _JSON_value_trans_targs[] = init__JSON_value_trans_targs_0();
424
+
425
+
426
+ private static byte[] init__JSON_value_trans_actions_0()
427
+ {
428
+ return new byte [] {
429
+ 13, 11, 0, 0, 15, 0, 0, 0, 17, 11, 0, 0,
430
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
431
+ 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 3,
432
+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 5,
433
+ 0, 0, 0
434
+ };
435
+ }
436
+
437
+ private static final byte _JSON_value_trans_actions[] = init__JSON_value_trans_actions_0();
438
+
439
+
440
+ private static byte[] init__JSON_value_from_state_actions_0()
441
+ {
442
+ return new byte [] {
443
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
444
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 19
445
+ };
446
+ }
447
+
448
+ private static final byte _JSON_value_from_state_actions[] = init__JSON_value_from_state_actions_0();
449
+
450
+
451
+ static final int JSON_value_start = 1;
452
+ static final int JSON_value_first_final = 21;
453
+ static final int JSON_value_error = 0;
454
+
455
+ static final int JSON_value_en_main = 1;
456
+
457
+
458
+ // line 469 "Parser.rl"
459
+
460
+
461
+ void parseValue(ParserResult res, int p, int pe) {
462
+ int cs = EVIL;
463
+ IRubyObject result = null;
464
+
465
+
466
+ // line 467 "Parser.java"
467
+ {
468
+ cs = JSON_value_start;
469
+ }
470
+
471
+ // line 476 "Parser.rl"
472
+
473
+ // line 474 "Parser.java"
474
+ {
475
+ int _klen;
476
+ int _trans = 0;
477
+ int _acts;
478
+ int _nacts;
479
+ int _keys;
480
+ int _goto_targ = 0;
481
+
482
+ _goto: while (true) {
483
+ switch ( _goto_targ ) {
484
+ case 0:
485
+ if ( p == pe ) {
486
+ _goto_targ = 4;
487
+ continue _goto;
488
+ }
489
+ if ( cs == 0 ) {
490
+ _goto_targ = 5;
491
+ continue _goto;
492
+ }
493
+ case 1:
494
+ _acts = _JSON_value_from_state_actions[cs];
495
+ _nacts = (int) _JSON_value_actions[_acts++];
496
+ while ( _nacts-- > 0 ) {
497
+ switch ( _JSON_value_actions[_acts++] ) {
498
+ case 9:
499
+ // line 454 "Parser.rl"
500
+ {
501
+ p--;
502
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
503
+ }
504
+ break;
505
+ // line 506 "Parser.java"
506
+ }
507
+ }
508
+
509
+ _match: do {
510
+ _keys = _JSON_value_key_offsets[cs];
511
+ _trans = _JSON_value_index_offsets[cs];
512
+ _klen = _JSON_value_single_lengths[cs];
513
+ if ( _klen > 0 ) {
514
+ int _lower = _keys;
515
+ int _mid;
516
+ int _upper = _keys + _klen - 1;
517
+ while (true) {
518
+ if ( _upper < _lower )
519
+ break;
520
+
521
+ _mid = _lower + ((_upper-_lower) >> 1);
522
+ if ( data[p] < _JSON_value_trans_keys[_mid] )
523
+ _upper = _mid - 1;
524
+ else if ( data[p] > _JSON_value_trans_keys[_mid] )
525
+ _lower = _mid + 1;
526
+ else {
527
+ _trans += (_mid - _keys);
528
+ break _match;
529
+ }
530
+ }
531
+ _keys += _klen;
532
+ _trans += _klen;
533
+ }
534
+
535
+ _klen = _JSON_value_range_lengths[cs];
536
+ if ( _klen > 0 ) {
537
+ int _lower = _keys;
538
+ int _mid;
539
+ int _upper = _keys + (_klen<<1) - 2;
540
+ while (true) {
541
+ if ( _upper < _lower )
542
+ break;
543
+
544
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
545
+ if ( data[p] < _JSON_value_trans_keys[_mid] )
546
+ _upper = _mid - 2;
547
+ else if ( data[p] > _JSON_value_trans_keys[_mid+1] )
548
+ _lower = _mid + 2;
549
+ else {
550
+ _trans += ((_mid - _keys)>>1);
551
+ break _match;
552
+ }
553
+ }
554
+ _trans += _klen;
555
+ }
556
+ } while (false);
557
+
558
+ cs = _JSON_value_trans_targs[_trans];
559
+
560
+ if ( _JSON_value_trans_actions[_trans] != 0 ) {
561
+ _acts = _JSON_value_trans_actions[_trans];
562
+ _nacts = (int) _JSON_value_actions[_acts++];
563
+ while ( _nacts-- > 0 )
564
+ {
565
+ switch ( _JSON_value_actions[_acts++] )
566
+ {
567
+ case 0:
568
+ // line 371 "Parser.rl"
569
+ {
570
+ result = getRuntime().getNil();
571
+ }
572
+ break;
573
+ case 1:
574
+ // line 374 "Parser.rl"
575
+ {
576
+ result = getRuntime().getFalse();
577
+ }
578
+ break;
579
+ case 2:
580
+ // line 377 "Parser.rl"
581
+ {
582
+ result = getRuntime().getTrue();
583
+ }
584
+ break;
585
+ case 3:
586
+ // line 380 "Parser.rl"
587
+ {
588
+ if (parser.allowNaN) {
589
+ result = getConstant(CONST_NAN);
590
+ } else {
591
+ throw unexpectedToken(p - 2, pe);
592
+ }
593
+ }
594
+ break;
595
+ case 4:
596
+ // line 387 "Parser.rl"
597
+ {
598
+ if (parser.allowNaN) {
599
+ result = getConstant(CONST_INFINITY);
600
+ } else {
601
+ throw unexpectedToken(p - 7, pe);
602
+ }
603
+ }
604
+ break;
605
+ case 5:
606
+ // line 394 "Parser.rl"
607
+ {
608
+ if (pe > p + 9 - (parser.quirksMode ? 1 : 0) &&
609
+ absSubSequence(p, p + 9).equals(JSON_MINUS_INFINITY)) {
610
+
611
+ if (parser.allowNaN) {
612
+ result = getConstant(CONST_MINUS_INFINITY);
613
+ {p = (( p + 10))-1;}
614
+ p--;
615
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
616
+ } else {
617
+ throw unexpectedToken(p, pe);
618
+ }
619
+ }
620
+ parseFloat(res, p, pe);
621
+ if (res.result != null) {
622
+ result = res.result;
623
+ {p = (( res.p))-1;}
624
+ }
625
+ parseInteger(res, p, pe);
626
+ if (res.result != null) {
627
+ result = res.result;
628
+ {p = (( res.p))-1;}
629
+ }
630
+ p--;
631
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
632
+ }
633
+ break;
634
+ case 6:
635
+ // line 420 "Parser.rl"
636
+ {
637
+ parseString(res, p, pe);
638
+ if (res.result == null) {
639
+ p--;
640
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
641
+ } else {
642
+ result = res.result;
643
+ {p = (( res.p))-1;}
644
+ }
645
+ }
646
+ break;
647
+ case 7:
648
+ // line 430 "Parser.rl"
649
+ {
650
+ currentNesting++;
651
+ parseArray(res, p, pe);
652
+ currentNesting--;
653
+ if (res.result == null) {
654
+ p--;
655
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
656
+ } else {
657
+ result = res.result;
658
+ {p = (( res.p))-1;}
659
+ }
660
+ }
661
+ break;
662
+ case 8:
663
+ // line 442 "Parser.rl"
664
+ {
665
+ currentNesting++;
666
+ parseObject(res, p, pe);
667
+ currentNesting--;
668
+ if (res.result == null) {
669
+ p--;
670
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
671
+ } else {
672
+ result = res.result;
673
+ {p = (( res.p))-1;}
674
+ }
675
+ }
676
+ break;
677
+ // line 678 "Parser.java"
678
+ }
679
+ }
680
+ }
681
+
682
+ case 2:
683
+ if ( cs == 0 ) {
684
+ _goto_targ = 5;
685
+ continue _goto;
686
+ }
687
+ if ( ++p != pe ) {
688
+ _goto_targ = 1;
689
+ continue _goto;
690
+ }
691
+ case 4:
692
+ case 5:
693
+ }
694
+ break; }
695
+ }
696
+
697
+ // line 477 "Parser.rl"
698
+
699
+ if (cs >= JSON_value_first_final && result != null) {
700
+ res.update(result, p);
701
+ } else {
702
+ res.update(null, p);
703
+ }
704
+ }
705
+
706
+
707
+ // line 708 "Parser.java"
708
+ private static byte[] init__JSON_integer_actions_0()
709
+ {
710
+ return new byte [] {
711
+ 0, 1, 0
712
+ };
713
+ }
714
+
715
+ private static final byte _JSON_integer_actions[] = init__JSON_integer_actions_0();
716
+
717
+
718
+ private static byte[] init__JSON_integer_key_offsets_0()
719
+ {
720
+ return new byte [] {
721
+ 0, 0, 4, 7, 9, 9
722
+ };
723
+ }
724
+
725
+ private static final byte _JSON_integer_key_offsets[] = init__JSON_integer_key_offsets_0();
726
+
727
+
728
+ private static char[] init__JSON_integer_trans_keys_0()
729
+ {
730
+ return new char [] {
731
+ 45, 48, 49, 57, 48, 49, 57, 48, 57, 48, 57, 0
732
+ };
733
+ }
734
+
735
+ private static final char _JSON_integer_trans_keys[] = init__JSON_integer_trans_keys_0();
736
+
737
+
738
+ private static byte[] init__JSON_integer_single_lengths_0()
739
+ {
740
+ return new byte [] {
741
+ 0, 2, 1, 0, 0, 0
742
+ };
743
+ }
744
+
745
+ private static final byte _JSON_integer_single_lengths[] = init__JSON_integer_single_lengths_0();
746
+
747
+
748
+ private static byte[] init__JSON_integer_range_lengths_0()
749
+ {
750
+ return new byte [] {
751
+ 0, 1, 1, 1, 0, 1
752
+ };
753
+ }
754
+
755
+ private static final byte _JSON_integer_range_lengths[] = init__JSON_integer_range_lengths_0();
756
+
757
+
758
+ private static byte[] init__JSON_integer_index_offsets_0()
759
+ {
760
+ return new byte [] {
761
+ 0, 0, 4, 7, 9, 10
762
+ };
763
+ }
764
+
765
+ private static final byte _JSON_integer_index_offsets[] = init__JSON_integer_index_offsets_0();
766
+
767
+
768
+ private static byte[] init__JSON_integer_indicies_0()
769
+ {
770
+ return new byte [] {
771
+ 0, 2, 3, 1, 2, 3, 1, 1, 4, 1, 3, 4,
772
+ 0
773
+ };
774
+ }
775
+
776
+ private static final byte _JSON_integer_indicies[] = init__JSON_integer_indicies_0();
777
+
778
+
779
+ private static byte[] init__JSON_integer_trans_targs_0()
780
+ {
781
+ return new byte [] {
782
+ 2, 0, 3, 5, 4
783
+ };
784
+ }
785
+
786
+ private static final byte _JSON_integer_trans_targs[] = init__JSON_integer_trans_targs_0();
787
+
788
+
789
+ private static byte[] init__JSON_integer_trans_actions_0()
790
+ {
791
+ return new byte [] {
792
+ 0, 0, 0, 0, 1
793
+ };
794
+ }
795
+
796
+ private static final byte _JSON_integer_trans_actions[] = init__JSON_integer_trans_actions_0();
797
+
798
+
799
+ static final int JSON_integer_start = 1;
800
+ static final int JSON_integer_first_final = 3;
801
+ static final int JSON_integer_error = 0;
802
+
803
+ static final int JSON_integer_en_main = 1;
804
+
805
+
806
+ // line 496 "Parser.rl"
807
+
808
+
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) {
821
+ int cs = EVIL;
822
+
823
+
824
+ // line 825 "Parser.java"
825
+ {
826
+ cs = JSON_integer_start;
827
+ }
828
+
829
+ // line 513 "Parser.rl"
830
+ int memo = p;
831
+
832
+ // line 833 "Parser.java"
833
+ {
834
+ int _klen;
835
+ int _trans = 0;
836
+ int _acts;
837
+ int _nacts;
838
+ int _keys;
839
+ int _goto_targ = 0;
840
+
841
+ _goto: while (true) {
842
+ switch ( _goto_targ ) {
843
+ case 0:
844
+ if ( p == pe ) {
845
+ _goto_targ = 4;
846
+ continue _goto;
847
+ }
848
+ if ( cs == 0 ) {
849
+ _goto_targ = 5;
850
+ continue _goto;
851
+ }
852
+ case 1:
853
+ _match: do {
854
+ _keys = _JSON_integer_key_offsets[cs];
855
+ _trans = _JSON_integer_index_offsets[cs];
856
+ _klen = _JSON_integer_single_lengths[cs];
857
+ if ( _klen > 0 ) {
858
+ int _lower = _keys;
859
+ int _mid;
860
+ int _upper = _keys + _klen - 1;
861
+ while (true) {
862
+ if ( _upper < _lower )
863
+ break;
864
+
865
+ _mid = _lower + ((_upper-_lower) >> 1);
866
+ if ( data[p] < _JSON_integer_trans_keys[_mid] )
867
+ _upper = _mid - 1;
868
+ else if ( data[p] > _JSON_integer_trans_keys[_mid] )
869
+ _lower = _mid + 1;
870
+ else {
871
+ _trans += (_mid - _keys);
872
+ break _match;
873
+ }
874
+ }
875
+ _keys += _klen;
876
+ _trans += _klen;
877
+ }
878
+
879
+ _klen = _JSON_integer_range_lengths[cs];
880
+ if ( _klen > 0 ) {
881
+ int _lower = _keys;
882
+ int _mid;
883
+ int _upper = _keys + (_klen<<1) - 2;
884
+ while (true) {
885
+ if ( _upper < _lower )
886
+ break;
887
+
888
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
889
+ if ( data[p] < _JSON_integer_trans_keys[_mid] )
890
+ _upper = _mid - 2;
891
+ else if ( data[p] > _JSON_integer_trans_keys[_mid+1] )
892
+ _lower = _mid + 2;
893
+ else {
894
+ _trans += ((_mid - _keys)>>1);
895
+ break _match;
896
+ }
897
+ }
898
+ _trans += _klen;
899
+ }
900
+ } while (false);
901
+
902
+ _trans = _JSON_integer_indicies[_trans];
903
+ cs = _JSON_integer_trans_targs[_trans];
904
+
905
+ if ( _JSON_integer_trans_actions[_trans] != 0 ) {
906
+ _acts = _JSON_integer_trans_actions[_trans];
907
+ _nacts = (int) _JSON_integer_actions[_acts++];
908
+ while ( _nacts-- > 0 )
909
+ {
910
+ switch ( _JSON_integer_actions[_acts++] )
911
+ {
912
+ case 0:
913
+ // line 490 "Parser.rl"
914
+ {
915
+ p--;
916
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
917
+ }
918
+ break;
919
+ // line 920 "Parser.java"
920
+ }
921
+ }
922
+ }
923
+
924
+ case 2:
925
+ if ( cs == 0 ) {
926
+ _goto_targ = 5;
927
+ continue _goto;
928
+ }
929
+ if ( ++p != pe ) {
930
+ _goto_targ = 1;
931
+ continue _goto;
932
+ }
933
+ case 4:
934
+ case 5:
935
+ }
936
+ break; }
937
+ }
938
+
939
+ // line 515 "Parser.rl"
940
+
941
+ if (cs < JSON_integer_first_final) {
942
+ return -1;
943
+ }
944
+
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);
958
+ }
959
+
960
+
961
+ // line 962 "Parser.java"
962
+ private static byte[] init__JSON_float_actions_0()
963
+ {
964
+ return new byte [] {
965
+ 0, 1, 0
966
+ };
967
+ }
968
+
969
+ private static final byte _JSON_float_actions[] = init__JSON_float_actions_0();
970
+
971
+
972
+ private static byte[] init__JSON_float_key_offsets_0()
973
+ {
974
+ return new byte [] {
975
+ 0, 0, 4, 7, 10, 12, 16, 18, 23, 29, 29
976
+ };
977
+ }
978
+
979
+ private static final byte _JSON_float_key_offsets[] = init__JSON_float_key_offsets_0();
980
+
981
+
982
+ private static char[] init__JSON_float_trans_keys_0()
983
+ {
984
+ return new char [] {
985
+ 45, 48, 49, 57, 48, 49, 57, 46, 69, 101, 48, 57,
986
+ 43, 45, 48, 57, 48, 57, 46, 69, 101, 48, 57, 69,
987
+ 101, 45, 46, 48, 57, 69, 101, 45, 46, 48, 57, 0
988
+ };
989
+ }
990
+
991
+ private static final char _JSON_float_trans_keys[] = init__JSON_float_trans_keys_0();
992
+
993
+
994
+ private static byte[] init__JSON_float_single_lengths_0()
995
+ {
996
+ return new byte [] {
997
+ 0, 2, 1, 3, 0, 2, 0, 3, 2, 0, 2
998
+ };
999
+ }
1000
+
1001
+ private static final byte _JSON_float_single_lengths[] = init__JSON_float_single_lengths_0();
1002
+
1003
+
1004
+ private static byte[] init__JSON_float_range_lengths_0()
1005
+ {
1006
+ return new byte [] {
1007
+ 0, 1, 1, 0, 1, 1, 1, 1, 2, 0, 2
1008
+ };
1009
+ }
1010
+
1011
+ private static final byte _JSON_float_range_lengths[] = init__JSON_float_range_lengths_0();
1012
+
1013
+
1014
+ private static byte[] init__JSON_float_index_offsets_0()
1015
+ {
1016
+ return new byte [] {
1017
+ 0, 0, 4, 7, 11, 13, 17, 19, 24, 29, 30
1018
+ };
1019
+ }
1020
+
1021
+ private static final byte _JSON_float_index_offsets[] = init__JSON_float_index_offsets_0();
1022
+
1023
+
1024
+ private static byte[] init__JSON_float_indicies_0()
1025
+ {
1026
+ return new byte [] {
1027
+ 0, 2, 3, 1, 2, 3, 1, 4, 5, 5, 1, 6,
1028
+ 1, 7, 7, 8, 1, 8, 1, 4, 5, 5, 3, 1,
1029
+ 5, 5, 1, 6, 9, 1, 1, 1, 1, 8, 9, 0
1030
+ };
1031
+ }
1032
+
1033
+ private static final byte _JSON_float_indicies[] = init__JSON_float_indicies_0();
1034
+
1035
+
1036
+ private static byte[] init__JSON_float_trans_targs_0()
1037
+ {
1038
+ return new byte [] {
1039
+ 2, 0, 3, 7, 4, 5, 8, 6, 10, 9
1040
+ };
1041
+ }
1042
+
1043
+ private static final byte _JSON_float_trans_targs[] = init__JSON_float_trans_targs_0();
1044
+
1045
+
1046
+ private static byte[] init__JSON_float_trans_actions_0()
1047
+ {
1048
+ return new byte [] {
1049
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
1050
+ };
1051
+ }
1052
+
1053
+ private static final byte _JSON_float_trans_actions[] = init__JSON_float_trans_actions_0();
1054
+
1055
+
1056
+ static final int JSON_float_start = 1;
1057
+ static final int JSON_float_first_final = 8;
1058
+ static final int JSON_float_error = 0;
1059
+
1060
+ static final int JSON_float_en_main = 1;
1061
+
1062
+
1063
+ // line 550 "Parser.rl"
1064
+
1065
+
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) {
1078
+ int cs = EVIL;
1079
+
1080
+
1081
+ // line 1082 "Parser.java"
1082
+ {
1083
+ cs = JSON_float_start;
1084
+ }
1085
+
1086
+ // line 567 "Parser.rl"
1087
+ int memo = p;
1088
+
1089
+ // line 1090 "Parser.java"
1090
+ {
1091
+ int _klen;
1092
+ int _trans = 0;
1093
+ int _acts;
1094
+ int _nacts;
1095
+ int _keys;
1096
+ int _goto_targ = 0;
1097
+
1098
+ _goto: while (true) {
1099
+ switch ( _goto_targ ) {
1100
+ case 0:
1101
+ if ( p == pe ) {
1102
+ _goto_targ = 4;
1103
+ continue _goto;
1104
+ }
1105
+ if ( cs == 0 ) {
1106
+ _goto_targ = 5;
1107
+ continue _goto;
1108
+ }
1109
+ case 1:
1110
+ _match: do {
1111
+ _keys = _JSON_float_key_offsets[cs];
1112
+ _trans = _JSON_float_index_offsets[cs];
1113
+ _klen = _JSON_float_single_lengths[cs];
1114
+ if ( _klen > 0 ) {
1115
+ int _lower = _keys;
1116
+ int _mid;
1117
+ int _upper = _keys + _klen - 1;
1118
+ while (true) {
1119
+ if ( _upper < _lower )
1120
+ break;
1121
+
1122
+ _mid = _lower + ((_upper-_lower) >> 1);
1123
+ if ( data[p] < _JSON_float_trans_keys[_mid] )
1124
+ _upper = _mid - 1;
1125
+ else if ( data[p] > _JSON_float_trans_keys[_mid] )
1126
+ _lower = _mid + 1;
1127
+ else {
1128
+ _trans += (_mid - _keys);
1129
+ break _match;
1130
+ }
1131
+ }
1132
+ _keys += _klen;
1133
+ _trans += _klen;
1134
+ }
1135
+
1136
+ _klen = _JSON_float_range_lengths[cs];
1137
+ if ( _klen > 0 ) {
1138
+ int _lower = _keys;
1139
+ int _mid;
1140
+ int _upper = _keys + (_klen<<1) - 2;
1141
+ while (true) {
1142
+ if ( _upper < _lower )
1143
+ break;
1144
+
1145
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
1146
+ if ( data[p] < _JSON_float_trans_keys[_mid] )
1147
+ _upper = _mid - 2;
1148
+ else if ( data[p] > _JSON_float_trans_keys[_mid+1] )
1149
+ _lower = _mid + 2;
1150
+ else {
1151
+ _trans += ((_mid - _keys)>>1);
1152
+ break _match;
1153
+ }
1154
+ }
1155
+ _trans += _klen;
1156
+ }
1157
+ } while (false);
1158
+
1159
+ _trans = _JSON_float_indicies[_trans];
1160
+ cs = _JSON_float_trans_targs[_trans];
1161
+
1162
+ if ( _JSON_float_trans_actions[_trans] != 0 ) {
1163
+ _acts = _JSON_float_trans_actions[_trans];
1164
+ _nacts = (int) _JSON_float_actions[_acts++];
1165
+ while ( _nacts-- > 0 )
1166
+ {
1167
+ switch ( _JSON_float_actions[_acts++] )
1168
+ {
1169
+ case 0:
1170
+ // line 541 "Parser.rl"
1171
+ {
1172
+ p--;
1173
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
1174
+ }
1175
+ break;
1176
+ // line 1177 "Parser.java"
1177
+ }
1178
+ }
1179
+ }
1180
+
1181
+ case 2:
1182
+ if ( cs == 0 ) {
1183
+ _goto_targ = 5;
1184
+ continue _goto;
1185
+ }
1186
+ if ( ++p != pe ) {
1187
+ _goto_targ = 1;
1188
+ continue _goto;
1189
+ }
1190
+ case 4:
1191
+ case 5:
1192
+ }
1193
+ break; }
1194
+ }
1195
+
1196
+ // line 569 "Parser.rl"
1197
+
1198
+ if (cs < JSON_float_first_final) {
1199
+ return -1;
1200
+ }
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()));
1209
+ }
1210
+
1211
+
1212
+ // line 1213 "Parser.java"
1213
+ private static byte[] init__JSON_string_actions_0()
1214
+ {
1215
+ return new byte [] {
1216
+ 0, 2, 0, 1
1217
+ };
1218
+ }
1219
+
1220
+ private static final byte _JSON_string_actions[] = init__JSON_string_actions_0();
1221
+
1222
+
1223
+ private static byte[] init__JSON_string_key_offsets_0()
1224
+ {
1225
+ return new byte [] {
1226
+ 0, 0, 1, 5, 8, 14, 20, 26, 32
1227
+ };
1228
+ }
1229
+
1230
+ private static final byte _JSON_string_key_offsets[] = init__JSON_string_key_offsets_0();
1231
+
1232
+
1233
+ private static char[] init__JSON_string_trans_keys_0()
1234
+ {
1235
+ return new char [] {
1236
+ 34, 34, 92, 0, 31, 117, 0, 31, 48, 57, 65, 70,
1237
+ 97, 102, 48, 57, 65, 70, 97, 102, 48, 57, 65, 70,
1238
+ 97, 102, 48, 57, 65, 70, 97, 102, 0
1239
+ };
1240
+ }
1241
+
1242
+ private static final char _JSON_string_trans_keys[] = init__JSON_string_trans_keys_0();
1243
+
1244
+
1245
+ private static byte[] init__JSON_string_single_lengths_0()
1246
+ {
1247
+ return new byte [] {
1248
+ 0, 1, 2, 1, 0, 0, 0, 0, 0
1249
+ };
1250
+ }
1251
+
1252
+ private static final byte _JSON_string_single_lengths[] = init__JSON_string_single_lengths_0();
1253
+
1254
+
1255
+ private static byte[] init__JSON_string_range_lengths_0()
1256
+ {
1257
+ return new byte [] {
1258
+ 0, 0, 1, 1, 3, 3, 3, 3, 0
1259
+ };
1260
+ }
1261
+
1262
+ private static final byte _JSON_string_range_lengths[] = init__JSON_string_range_lengths_0();
1263
+
1264
+
1265
+ private static byte[] init__JSON_string_index_offsets_0()
1266
+ {
1267
+ return new byte [] {
1268
+ 0, 0, 2, 6, 9, 13, 17, 21, 25
1269
+ };
1270
+ }
1271
+
1272
+ private static final byte _JSON_string_index_offsets[] = init__JSON_string_index_offsets_0();
1273
+
1274
+
1275
+ private static byte[] init__JSON_string_indicies_0()
1276
+ {
1277
+ return new byte [] {
1278
+ 0, 1, 2, 3, 1, 0, 4, 1, 0, 5, 5, 5,
1279
+ 1, 6, 6, 6, 1, 7, 7, 7, 1, 0, 0, 0,
1280
+ 1, 1, 0
1281
+ };
1282
+ }
1283
+
1284
+ private static final byte _JSON_string_indicies[] = init__JSON_string_indicies_0();
1285
+
1286
+
1287
+ private static byte[] init__JSON_string_trans_targs_0()
1288
+ {
1289
+ return new byte [] {
1290
+ 2, 0, 8, 3, 4, 5, 6, 7
1291
+ };
1292
+ }
1293
+
1294
+ private static final byte _JSON_string_trans_targs[] = init__JSON_string_trans_targs_0();
1295
+
1296
+
1297
+ private static byte[] init__JSON_string_trans_actions_0()
1298
+ {
1299
+ return new byte [] {
1300
+ 0, 0, 1, 0, 0, 0, 0, 0
1301
+ };
1302
+ }
1303
+
1304
+ private static final byte _JSON_string_trans_actions[] = init__JSON_string_trans_actions_0();
1305
+
1306
+
1307
+ static final int JSON_string_start = 1;
1308
+ static final int JSON_string_first_final = 8;
1309
+ static final int JSON_string_error = 0;
1310
+
1311
+ static final int JSON_string_en_main = 1;
1312
+
1313
+
1314
+ // line 614 "Parser.rl"
1315
+
1316
+
1317
+ void parseString(ParserResult res, int p, int pe) {
1318
+ int cs = EVIL;
1319
+ IRubyObject result = null;
1320
+
1321
+
1322
+ // line 1323 "Parser.java"
1323
+ {
1324
+ cs = JSON_string_start;
1325
+ }
1326
+
1327
+ // line 621 "Parser.rl"
1328
+ int memo = p;
1329
+
1330
+ // line 1331 "Parser.java"
1331
+ {
1332
+ int _klen;
1333
+ int _trans = 0;
1334
+ int _acts;
1335
+ int _nacts;
1336
+ int _keys;
1337
+ int _goto_targ = 0;
1338
+
1339
+ _goto: while (true) {
1340
+ switch ( _goto_targ ) {
1341
+ case 0:
1342
+ if ( p == pe ) {
1343
+ _goto_targ = 4;
1344
+ continue _goto;
1345
+ }
1346
+ if ( cs == 0 ) {
1347
+ _goto_targ = 5;
1348
+ continue _goto;
1349
+ }
1350
+ case 1:
1351
+ _match: do {
1352
+ _keys = _JSON_string_key_offsets[cs];
1353
+ _trans = _JSON_string_index_offsets[cs];
1354
+ _klen = _JSON_string_single_lengths[cs];
1355
+ if ( _klen > 0 ) {
1356
+ int _lower = _keys;
1357
+ int _mid;
1358
+ int _upper = _keys + _klen - 1;
1359
+ while (true) {
1360
+ if ( _upper < _lower )
1361
+ break;
1362
+
1363
+ _mid = _lower + ((_upper-_lower) >> 1);
1364
+ if ( data[p] < _JSON_string_trans_keys[_mid] )
1365
+ _upper = _mid - 1;
1366
+ else if ( data[p] > _JSON_string_trans_keys[_mid] )
1367
+ _lower = _mid + 1;
1368
+ else {
1369
+ _trans += (_mid - _keys);
1370
+ break _match;
1371
+ }
1372
+ }
1373
+ _keys += _klen;
1374
+ _trans += _klen;
1375
+ }
1376
+
1377
+ _klen = _JSON_string_range_lengths[cs];
1378
+ if ( _klen > 0 ) {
1379
+ int _lower = _keys;
1380
+ int _mid;
1381
+ int _upper = _keys + (_klen<<1) - 2;
1382
+ while (true) {
1383
+ if ( _upper < _lower )
1384
+ break;
1385
+
1386
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
1387
+ if ( data[p] < _JSON_string_trans_keys[_mid] )
1388
+ _upper = _mid - 2;
1389
+ else if ( data[p] > _JSON_string_trans_keys[_mid+1] )
1390
+ _lower = _mid + 2;
1391
+ else {
1392
+ _trans += ((_mid - _keys)>>1);
1393
+ break _match;
1394
+ }
1395
+ }
1396
+ _trans += _klen;
1397
+ }
1398
+ } while (false);
1399
+
1400
+ _trans = _JSON_string_indicies[_trans];
1401
+ cs = _JSON_string_trans_targs[_trans];
1402
+
1403
+ if ( _JSON_string_trans_actions[_trans] != 0 ) {
1404
+ _acts = _JSON_string_trans_actions[_trans];
1405
+ _nacts = (int) _JSON_string_actions[_acts++];
1406
+ while ( _nacts-- > 0 )
1407
+ {
1408
+ switch ( _JSON_string_actions[_acts++] )
1409
+ {
1410
+ case 0:
1411
+ // line 589 "Parser.rl"
1412
+ {
1413
+ int offset = byteList.begin();
1414
+ ByteList decoded = decoder.decode(byteList, memo + 1 - offset,
1415
+ p - offset);
1416
+ result = getRuntime().newString(decoded);
1417
+ if (result == null) {
1418
+ p--;
1419
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
1420
+ } else {
1421
+ {p = (( p + 1))-1;}
1422
+ }
1423
+ }
1424
+ break;
1425
+ case 1:
1426
+ // line 602 "Parser.rl"
1427
+ {
1428
+ p--;
1429
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
1430
+ }
1431
+ break;
1432
+ // line 1433 "Parser.java"
1433
+ }
1434
+ }
1435
+ }
1436
+
1437
+ case 2:
1438
+ if ( cs == 0 ) {
1439
+ _goto_targ = 5;
1440
+ continue _goto;
1441
+ }
1442
+ if ( ++p != pe ) {
1443
+ _goto_targ = 1;
1444
+ continue _goto;
1445
+ }
1446
+ case 4:
1447
+ case 5:
1448
+ }
1449
+ break; }
1450
+ }
1451
+
1452
+ // line 623 "Parser.rl"
1453
+
1454
+ if (parser.createAdditions) {
1455
+ RubyHash match_string = parser.match_string;
1456
+ if (match_string != null) {
1457
+ final IRubyObject[] memoArray = { result, null };
1458
+ try {
1459
+ match_string.visitAll(new RubyHash.Visitor() {
1460
+ @Override
1461
+ public void visit(IRubyObject pattern, IRubyObject klass) {
1462
+ if (pattern.callMethod(context, "===", memoArray[0]).isTrue()) {
1463
+ memoArray[1] = klass;
1464
+ throw JumpException.SPECIAL_JUMP;
1465
+ }
1466
+ }
1467
+ });
1468
+ } catch (JumpException e) { }
1469
+ if (memoArray[1] != null) {
1470
+ RubyClass klass = (RubyClass) memoArray[1];
1471
+ if (klass.respondsTo("json_creatable?") &&
1472
+ klass.callMethod(context, "json_creatable?").isTrue()) {
1473
+ result = klass.callMethod(context, "json_create", result);
1474
+ }
1475
+ }
1476
+ }
1477
+ }
1478
+
1479
+ if (cs >= JSON_string_first_final && result != null) {
1480
+ RuntimeInfo info = RuntimeInfo.forRuntime(context.getRuntime());
1481
+ if (info.encodingsSupported() && result instanceof RubyString) {
1482
+ ((RubyString)result).force_encoding(context, info.utf8.get());
1483
+ }
1484
+ res.update(result, p + 1);
1485
+ } else {
1486
+ res.update(null, p + 1);
1487
+ }
1488
+ }
1489
+
1490
+
1491
+ // line 1492 "Parser.java"
1492
+ private static byte[] init__JSON_array_actions_0()
1493
+ {
1494
+ return new byte [] {
1495
+ 0, 1, 0, 1, 1
1496
+ };
1497
+ }
1498
+
1499
+ private static final byte _JSON_array_actions[] = init__JSON_array_actions_0();
1500
+
1501
+
1502
+ private static byte[] init__JSON_array_key_offsets_0()
1503
+ {
1504
+ return new byte [] {
1505
+ 0, 0, 1, 18, 25, 41, 43, 44, 46, 47, 49, 50,
1506
+ 52, 53, 55, 56, 58, 59
1507
+ };
1508
+ }
1509
+
1510
+ private static final byte _JSON_array_key_offsets[] = init__JSON_array_key_offsets_0();
1511
+
1512
+
1513
+ private static char[] init__JSON_array_trans_keys_0()
1514
+ {
1515
+ return new char [] {
1516
+ 91, 13, 32, 34, 45, 47, 73, 78, 91, 93, 102, 110,
1517
+ 116, 123, 9, 10, 48, 57, 13, 32, 44, 47, 93, 9,
1518
+ 10, 13, 32, 34, 45, 47, 73, 78, 91, 102, 110, 116,
1519
+ 123, 9, 10, 48, 57, 42, 47, 42, 42, 47, 10, 42,
1520
+ 47, 42, 42, 47, 10, 42, 47, 42, 42, 47, 10, 0
1521
+ };
1522
+ }
1523
+
1524
+ private static final char _JSON_array_trans_keys[] = init__JSON_array_trans_keys_0();
1525
+
1526
+
1527
+ private static byte[] init__JSON_array_single_lengths_0()
1528
+ {
1529
+ return new byte [] {
1530
+ 0, 1, 13, 5, 12, 2, 1, 2, 1, 2, 1, 2,
1531
+ 1, 2, 1, 2, 1, 0
1532
+ };
1533
+ }
1534
+
1535
+ private static final byte _JSON_array_single_lengths[] = init__JSON_array_single_lengths_0();
1536
+
1537
+
1538
+ private static byte[] init__JSON_array_range_lengths_0()
1539
+ {
1540
+ return new byte [] {
1541
+ 0, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0,
1542
+ 0, 0, 0, 0, 0, 0
1543
+ };
1544
+ }
1545
+
1546
+ private static final byte _JSON_array_range_lengths[] = init__JSON_array_range_lengths_0();
1547
+
1548
+
1549
+ private static byte[] init__JSON_array_index_offsets_0()
1550
+ {
1551
+ return new byte [] {
1552
+ 0, 0, 2, 18, 25, 40, 43, 45, 48, 50, 53, 55,
1553
+ 58, 60, 63, 65, 68, 70
1554
+ };
1555
+ }
1556
+
1557
+ private static final byte _JSON_array_index_offsets[] = init__JSON_array_index_offsets_0();
1558
+
1559
+
1560
+ private static byte[] init__JSON_array_indicies_0()
1561
+ {
1562
+ return new byte [] {
1563
+ 0, 1, 0, 0, 2, 2, 3, 2, 2, 2, 4, 2,
1564
+ 2, 2, 2, 0, 2, 1, 5, 5, 6, 7, 4, 5,
1565
+ 1, 6, 6, 2, 2, 8, 2, 2, 2, 2, 2, 2,
1566
+ 2, 6, 2, 1, 9, 10, 1, 11, 9, 11, 6, 9,
1567
+ 6, 10, 12, 13, 1, 14, 12, 14, 5, 12, 5, 13,
1568
+ 15, 16, 1, 17, 15, 17, 0, 15, 0, 16, 1, 0
1569
+ };
1570
+ }
1571
+
1572
+ private static final byte _JSON_array_indicies[] = init__JSON_array_indicies_0();
1573
+
1574
+
1575
+ private static byte[] init__JSON_array_trans_targs_0()
1576
+ {
1577
+ return new byte [] {
1578
+ 2, 0, 3, 13, 17, 3, 4, 9, 5, 6, 8, 7,
1579
+ 10, 12, 11, 14, 16, 15
1580
+ };
1581
+ }
1582
+
1583
+ private static final byte _JSON_array_trans_targs[] = init__JSON_array_trans_targs_0();
1584
+
1585
+
1586
+ private static byte[] init__JSON_array_trans_actions_0()
1587
+ {
1588
+ return new byte [] {
1589
+ 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0,
1590
+ 0, 0, 0, 0, 0, 0
1591
+ };
1592
+ }
1593
+
1594
+ private static final byte _JSON_array_trans_actions[] = init__JSON_array_trans_actions_0();
1595
+
1596
+
1597
+ static final int JSON_array_start = 1;
1598
+ static final int JSON_array_first_final = 17;
1599
+ static final int JSON_array_error = 0;
1600
+
1601
+ static final int JSON_array_en_main = 1;
1602
+
1603
+
1604
+ // line 697 "Parser.rl"
1605
+
1606
+
1607
+ void parseArray(ParserResult res, int p, int pe) {
1608
+ int cs = EVIL;
1609
+
1610
+ if (parser.maxNesting > 0 && currentNesting > parser.maxNesting) {
1611
+ throw newException(Utils.M_NESTING_ERROR,
1612
+ "nesting of " + currentNesting + " is too deep");
1613
+ }
1614
+
1615
+ IRubyObject result;
1616
+ if (parser.arrayClass == getRuntime().getArray()) {
1617
+ result = RubyArray.newArray(getRuntime());
1618
+ } else {
1619
+ result = parser.arrayClass.newInstance(context,
1620
+ IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
1621
+ }
1622
+
1623
+
1624
+ // line 1625 "Parser.java"
1625
+ {
1626
+ cs = JSON_array_start;
1627
+ }
1628
+
1629
+ // line 716 "Parser.rl"
1630
+
1631
+ // line 1632 "Parser.java"
1632
+ {
1633
+ int _klen;
1634
+ int _trans = 0;
1635
+ int _acts;
1636
+ int _nacts;
1637
+ int _keys;
1638
+ int _goto_targ = 0;
1639
+
1640
+ _goto: while (true) {
1641
+ switch ( _goto_targ ) {
1642
+ case 0:
1643
+ if ( p == pe ) {
1644
+ _goto_targ = 4;
1645
+ continue _goto;
1646
+ }
1647
+ if ( cs == 0 ) {
1648
+ _goto_targ = 5;
1649
+ continue _goto;
1650
+ }
1651
+ case 1:
1652
+ _match: do {
1653
+ _keys = _JSON_array_key_offsets[cs];
1654
+ _trans = _JSON_array_index_offsets[cs];
1655
+ _klen = _JSON_array_single_lengths[cs];
1656
+ if ( _klen > 0 ) {
1657
+ int _lower = _keys;
1658
+ int _mid;
1659
+ int _upper = _keys + _klen - 1;
1660
+ while (true) {
1661
+ if ( _upper < _lower )
1662
+ break;
1663
+
1664
+ _mid = _lower + ((_upper-_lower) >> 1);
1665
+ if ( data[p] < _JSON_array_trans_keys[_mid] )
1666
+ _upper = _mid - 1;
1667
+ else if ( data[p] > _JSON_array_trans_keys[_mid] )
1668
+ _lower = _mid + 1;
1669
+ else {
1670
+ _trans += (_mid - _keys);
1671
+ break _match;
1672
+ }
1673
+ }
1674
+ _keys += _klen;
1675
+ _trans += _klen;
1676
+ }
1677
+
1678
+ _klen = _JSON_array_range_lengths[cs];
1679
+ if ( _klen > 0 ) {
1680
+ int _lower = _keys;
1681
+ int _mid;
1682
+ int _upper = _keys + (_klen<<1) - 2;
1683
+ while (true) {
1684
+ if ( _upper < _lower )
1685
+ break;
1686
+
1687
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
1688
+ if ( data[p] < _JSON_array_trans_keys[_mid] )
1689
+ _upper = _mid - 2;
1690
+ else if ( data[p] > _JSON_array_trans_keys[_mid+1] )
1691
+ _lower = _mid + 2;
1692
+ else {
1693
+ _trans += ((_mid - _keys)>>1);
1694
+ break _match;
1695
+ }
1696
+ }
1697
+ _trans += _klen;
1698
+ }
1699
+ } while (false);
1700
+
1701
+ _trans = _JSON_array_indicies[_trans];
1702
+ cs = _JSON_array_trans_targs[_trans];
1703
+
1704
+ if ( _JSON_array_trans_actions[_trans] != 0 ) {
1705
+ _acts = _JSON_array_trans_actions[_trans];
1706
+ _nacts = (int) _JSON_array_actions[_acts++];
1707
+ while ( _nacts-- > 0 )
1708
+ {
1709
+ switch ( _JSON_array_actions[_acts++] )
1710
+ {
1711
+ case 0:
1712
+ // line 666 "Parser.rl"
1713
+ {
1714
+ parseValue(res, p, pe);
1715
+ if (res.result == null) {
1716
+ p--;
1717
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
1718
+ } else {
1719
+ if (parser.arrayClass == getRuntime().getArray()) {
1720
+ ((RubyArray)result).append(res.result);
1721
+ } else {
1722
+ result.callMethod(context, "<<", res.result);
1723
+ }
1724
+ {p = (( res.p))-1;}
1725
+ }
1726
+ }
1727
+ break;
1728
+ case 1:
1729
+ // line 681 "Parser.rl"
1730
+ {
1731
+ p--;
1732
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
1733
+ }
1734
+ break;
1735
+ // line 1736 "Parser.java"
1736
+ }
1737
+ }
1738
+ }
1739
+
1740
+ case 2:
1741
+ if ( cs == 0 ) {
1742
+ _goto_targ = 5;
1743
+ continue _goto;
1744
+ }
1745
+ if ( ++p != pe ) {
1746
+ _goto_targ = 1;
1747
+ continue _goto;
1748
+ }
1749
+ case 4:
1750
+ case 5:
1751
+ }
1752
+ break; }
1753
+ }
1754
+
1755
+ // line 717 "Parser.rl"
1756
+
1757
+ if (cs >= JSON_array_first_final) {
1758
+ res.update(result, p + 1);
1759
+ } else {
1760
+ throw unexpectedToken(p, pe);
1761
+ }
1762
+ }
1763
+
1764
+
1765
+ // line 1766 "Parser.java"
1766
+ private static byte[] init__JSON_object_actions_0()
1767
+ {
1768
+ return new byte [] {
1769
+ 0, 1, 0, 1, 1, 1, 2
1770
+ };
1771
+ }
1772
+
1773
+ private static final byte _JSON_object_actions[] = init__JSON_object_actions_0();
1774
+
1775
+
1776
+ private static byte[] init__JSON_object_key_offsets_0()
1777
+ {
1778
+ return new byte [] {
1779
+ 0, 0, 1, 8, 14, 16, 17, 19, 20, 36, 43, 49,
1780
+ 51, 52, 54, 55, 57, 58, 60, 61, 63, 64, 66, 67,
1781
+ 69, 70, 72, 73
1782
+ };
1783
+ }
1784
+
1785
+ private static final byte _JSON_object_key_offsets[] = init__JSON_object_key_offsets_0();
1786
+
1787
+
1788
+ private static char[] init__JSON_object_trans_keys_0()
1789
+ {
1790
+ return new char [] {
1791
+ 123, 13, 32, 34, 47, 125, 9, 10, 13, 32, 47, 58,
1792
+ 9, 10, 42, 47, 42, 42, 47, 10, 13, 32, 34, 45,
1793
+ 47, 73, 78, 91, 102, 110, 116, 123, 9, 10, 48, 57,
1794
+ 13, 32, 44, 47, 125, 9, 10, 13, 32, 34, 47, 9,
1795
+ 10, 42, 47, 42, 42, 47, 10, 42, 47, 42, 42, 47,
1796
+ 10, 42, 47, 42, 42, 47, 10, 42, 47, 42, 42, 47,
1797
+ 10, 0
1798
+ };
1799
+ }
1800
+
1801
+ private static final char _JSON_object_trans_keys[] = init__JSON_object_trans_keys_0();
1802
+
1803
+
1804
+ private static byte[] init__JSON_object_single_lengths_0()
1805
+ {
1806
+ return new byte [] {
1807
+ 0, 1, 5, 4, 2, 1, 2, 1, 12, 5, 4, 2,
1808
+ 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
1809
+ 1, 2, 1, 0
1810
+ };
1811
+ }
1812
+
1813
+ private static final byte _JSON_object_single_lengths[] = init__JSON_object_single_lengths_0();
1814
+
1815
+
1816
+ private static byte[] init__JSON_object_range_lengths_0()
1817
+ {
1818
+ return new byte [] {
1819
+ 0, 0, 1, 1, 0, 0, 0, 0, 2, 1, 1, 0,
1820
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1821
+ 0, 0, 0, 0
1822
+ };
1823
+ }
1824
+
1825
+ private static final byte _JSON_object_range_lengths[] = init__JSON_object_range_lengths_0();
1826
+
1827
+
1828
+ private static byte[] init__JSON_object_index_offsets_0()
1829
+ {
1830
+ return new byte [] {
1831
+ 0, 0, 2, 9, 15, 18, 20, 23, 25, 40, 47, 53,
1832
+ 56, 58, 61, 63, 66, 68, 71, 73, 76, 78, 81, 83,
1833
+ 86, 88, 91, 93
1834
+ };
1835
+ }
1836
+
1837
+ private static final byte _JSON_object_index_offsets[] = init__JSON_object_index_offsets_0();
1838
+
1839
+
1840
+ private static byte[] init__JSON_object_indicies_0()
1841
+ {
1842
+ return new byte [] {
1843
+ 0, 1, 0, 0, 2, 3, 4, 0, 1, 5, 5, 6,
1844
+ 7, 5, 1, 8, 9, 1, 10, 8, 10, 5, 8, 5,
1845
+ 9, 7, 7, 11, 11, 12, 11, 11, 11, 11, 11, 11,
1846
+ 11, 7, 11, 1, 13, 13, 14, 15, 4, 13, 1, 14,
1847
+ 14, 2, 16, 14, 1, 17, 18, 1, 19, 17, 19, 14,
1848
+ 17, 14, 18, 20, 21, 1, 22, 20, 22, 13, 20, 13,
1849
+ 21, 23, 24, 1, 25, 23, 25, 7, 23, 7, 24, 26,
1850
+ 27, 1, 28, 26, 28, 0, 26, 0, 27, 1, 0
1851
+ };
1852
+ }
1853
+
1854
+ private static final byte _JSON_object_indicies[] = init__JSON_object_indicies_0();
1855
+
1856
+
1857
+ private static byte[] init__JSON_object_trans_targs_0()
1858
+ {
1859
+ return new byte [] {
1860
+ 2, 0, 3, 23, 27, 3, 4, 8, 5, 7, 6, 9,
1861
+ 19, 9, 10, 15, 11, 12, 14, 13, 16, 18, 17, 20,
1862
+ 22, 21, 24, 26, 25
1863
+ };
1864
+ }
1865
+
1866
+ private static final byte _JSON_object_trans_targs[] = init__JSON_object_trans_targs_0();
1867
+
1868
+
1869
+ private static byte[] init__JSON_object_trans_actions_0()
1870
+ {
1871
+ return new byte [] {
1872
+ 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 0, 1,
1873
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1874
+ 0, 0, 0, 0, 0
1875
+ };
1876
+ }
1877
+
1878
+ private static final byte _JSON_object_trans_actions[] = init__JSON_object_trans_actions_0();
1879
+
1880
+
1881
+ static final int JSON_object_start = 1;
1882
+ static final int JSON_object_first_final = 27;
1883
+ static final int JSON_object_error = 0;
1884
+
1885
+ static final int JSON_object_en_main = 1;
1886
+
1887
+
1888
+ // line 776 "Parser.rl"
1889
+
1890
+
1891
+ void parseObject(ParserResult res, int p, int pe) {
1892
+ int cs = EVIL;
1893
+ IRubyObject lastName = null;
1894
+ boolean objectDefault = true;
1895
+
1896
+ if (parser.maxNesting > 0 && currentNesting > parser.maxNesting) {
1897
+ throw newException(Utils.M_NESTING_ERROR,
1898
+ "nesting of " + currentNesting + " is too deep");
1899
+ }
1900
+
1901
+ // this is guaranteed to be a RubyHash due to the earlier
1902
+ // allocator test at OptionsReader#getClass
1903
+ IRubyObject result;
1904
+ if (parser.objectClass == getRuntime().getHash()) {
1905
+ result = RubyHash.newHash(getRuntime());
1906
+ } else {
1907
+ objectDefault = false;
1908
+ result = parser.objectClass.newInstance(context,
1909
+ IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
1910
+ }
1911
+
1912
+
1913
+ // line 1914 "Parser.java"
1914
+ {
1915
+ cs = JSON_object_start;
1916
+ }
1917
+
1918
+ // line 800 "Parser.rl"
1919
+
1920
+ // line 1921 "Parser.java"
1921
+ {
1922
+ int _klen;
1923
+ int _trans = 0;
1924
+ int _acts;
1925
+ int _nacts;
1926
+ int _keys;
1927
+ int _goto_targ = 0;
1928
+
1929
+ _goto: while (true) {
1930
+ switch ( _goto_targ ) {
1931
+ case 0:
1932
+ if ( p == pe ) {
1933
+ _goto_targ = 4;
1934
+ continue _goto;
1935
+ }
1936
+ if ( cs == 0 ) {
1937
+ _goto_targ = 5;
1938
+ continue _goto;
1939
+ }
1940
+ case 1:
1941
+ _match: do {
1942
+ _keys = _JSON_object_key_offsets[cs];
1943
+ _trans = _JSON_object_index_offsets[cs];
1944
+ _klen = _JSON_object_single_lengths[cs];
1945
+ if ( _klen > 0 ) {
1946
+ int _lower = _keys;
1947
+ int _mid;
1948
+ int _upper = _keys + _klen - 1;
1949
+ while (true) {
1950
+ if ( _upper < _lower )
1951
+ break;
1952
+
1953
+ _mid = _lower + ((_upper-_lower) >> 1);
1954
+ if ( data[p] < _JSON_object_trans_keys[_mid] )
1955
+ _upper = _mid - 1;
1956
+ else if ( data[p] > _JSON_object_trans_keys[_mid] )
1957
+ _lower = _mid + 1;
1958
+ else {
1959
+ _trans += (_mid - _keys);
1960
+ break _match;
1961
+ }
1962
+ }
1963
+ _keys += _klen;
1964
+ _trans += _klen;
1965
+ }
1966
+
1967
+ _klen = _JSON_object_range_lengths[cs];
1968
+ if ( _klen > 0 ) {
1969
+ int _lower = _keys;
1970
+ int _mid;
1971
+ int _upper = _keys + (_klen<<1) - 2;
1972
+ while (true) {
1973
+ if ( _upper < _lower )
1974
+ break;
1975
+
1976
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
1977
+ if ( data[p] < _JSON_object_trans_keys[_mid] )
1978
+ _upper = _mid - 2;
1979
+ else if ( data[p] > _JSON_object_trans_keys[_mid+1] )
1980
+ _lower = _mid + 2;
1981
+ else {
1982
+ _trans += ((_mid - _keys)>>1);
1983
+ break _match;
1984
+ }
1985
+ }
1986
+ _trans += _klen;
1987
+ }
1988
+ } while (false);
1989
+
1990
+ _trans = _JSON_object_indicies[_trans];
1991
+ cs = _JSON_object_trans_targs[_trans];
1992
+
1993
+ if ( _JSON_object_trans_actions[_trans] != 0 ) {
1994
+ _acts = _JSON_object_trans_actions[_trans];
1995
+ _nacts = (int) _JSON_object_actions[_acts++];
1996
+ while ( _nacts-- > 0 )
1997
+ {
1998
+ switch ( _JSON_object_actions[_acts++] )
1999
+ {
2000
+ case 0:
2001
+ // line 731 "Parser.rl"
2002
+ {
2003
+ parseValue(res, p, pe);
2004
+ if (res.result == null) {
2005
+ p--;
2006
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
2007
+ } else {
2008
+ if (parser.objectClass == getRuntime().getHash()) {
2009
+ ((RubyHash)result).op_aset(context, lastName, res.result);
2010
+ } else {
2011
+ result.callMethod(context, "[]=", new IRubyObject[] { lastName, res.result });
2012
+ }
2013
+ {p = (( res.p))-1;}
2014
+ }
2015
+ }
2016
+ break;
2017
+ case 1:
2018
+ // line 746 "Parser.rl"
2019
+ {
2020
+ parseString(res, p, pe);
2021
+ if (res.result == null) {
2022
+ p--;
2023
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
2024
+ } else {
2025
+ RubyString name = (RubyString)res.result;
2026
+ if (parser.symbolizeNames) {
2027
+ lastName = context.getRuntime().is1_9()
2028
+ ? name.intern19()
2029
+ : name.intern();
2030
+ } else {
2031
+ lastName = name;
2032
+ }
2033
+ {p = (( res.p))-1;}
2034
+ }
2035
+ }
2036
+ break;
2037
+ case 2:
2038
+ // line 764 "Parser.rl"
2039
+ {
2040
+ p--;
2041
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
2042
+ }
2043
+ break;
2044
+ // line 2045 "Parser.java"
2045
+ }
2046
+ }
2047
+ }
2048
+
2049
+ case 2:
2050
+ if ( cs == 0 ) {
2051
+ _goto_targ = 5;
2052
+ continue _goto;
2053
+ }
2054
+ if ( ++p != pe ) {
2055
+ _goto_targ = 1;
2056
+ continue _goto;
2057
+ }
2058
+ case 4:
2059
+ case 5:
2060
+ }
2061
+ break; }
2062
+ }
2063
+
2064
+ // line 801 "Parser.rl"
2065
+
2066
+ if (cs < JSON_object_first_final) {
2067
+ res.update(null, p + 1);
2068
+ return;
2069
+ }
2070
+
2071
+ IRubyObject returnedResult = result;
2072
+
2073
+ // attempt to de-serialize object
2074
+ if (parser.createAdditions) {
2075
+ IRubyObject vKlassName;
2076
+ if (objectDefault) {
2077
+ vKlassName = ((RubyHash)result).op_aref(context, parser.createId);
2078
+ } else {
2079
+ vKlassName = result.callMethod(context, "[]", parser.createId);
2080
+ }
2081
+
2082
+ if (!vKlassName.isNil()) {
2083
+ // might throw ArgumentError, we let it propagate
2084
+ IRubyObject klass = parser.info.jsonModule.get().
2085
+ callMethod(context, "deep_const_get", vKlassName);
2086
+ if (klass.respondsTo("json_creatable?") &&
2087
+ klass.callMethod(context, "json_creatable?").isTrue()) {
2088
+
2089
+ returnedResult = klass.callMethod(context, "json_create", result);
2090
+ }
2091
+ }
2092
+ }
2093
+ res.update(returnedResult, p + 1);
2094
+ }
2095
+
2096
+
2097
+ // line 2098 "Parser.java"
2098
+ private static byte[] init__JSON_actions_0()
2099
+ {
2100
+ return new byte [] {
2101
+ 0, 1, 0, 1, 1
2102
+ };
2103
+ }
2104
+
2105
+ private static final byte _JSON_actions[] = init__JSON_actions_0();
2106
+
2107
+
2108
+ private static byte[] init__JSON_key_offsets_0()
2109
+ {
2110
+ return new byte [] {
2111
+ 0, 0, 7, 9, 10, 12, 13, 15, 16, 18, 19
2112
+ };
2113
+ }
2114
+
2115
+ private static final byte _JSON_key_offsets[] = init__JSON_key_offsets_0();
2116
+
2117
+
2118
+ private static char[] init__JSON_trans_keys_0()
2119
+ {
2120
+ return new char [] {
2121
+ 13, 32, 47, 91, 123, 9, 10, 42, 47, 42, 42, 47,
2122
+ 10, 42, 47, 42, 42, 47, 10, 13, 32, 47, 9, 10,
2123
+ 0
2124
+ };
2125
+ }
2126
+
2127
+ private static final char _JSON_trans_keys[] = init__JSON_trans_keys_0();
2128
+
2129
+
2130
+ private static byte[] init__JSON_single_lengths_0()
2131
+ {
2132
+ return new byte [] {
2133
+ 0, 5, 2, 1, 2, 1, 2, 1, 2, 1, 3
2134
+ };
2135
+ }
2136
+
2137
+ private static final byte _JSON_single_lengths[] = init__JSON_single_lengths_0();
2138
+
2139
+
2140
+ private static byte[] init__JSON_range_lengths_0()
2141
+ {
2142
+ return new byte [] {
2143
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
2144
+ };
2145
+ }
2146
+
2147
+ private static final byte _JSON_range_lengths[] = init__JSON_range_lengths_0();
2148
+
2149
+
2150
+ private static byte[] init__JSON_index_offsets_0()
2151
+ {
2152
+ return new byte [] {
2153
+ 0, 0, 7, 10, 12, 15, 17, 20, 22, 25, 27
2154
+ };
2155
+ }
2156
+
2157
+ private static final byte _JSON_index_offsets[] = init__JSON_index_offsets_0();
2158
+
2159
+
2160
+ private static byte[] init__JSON_indicies_0()
2161
+ {
2162
+ return new byte [] {
2163
+ 0, 0, 2, 3, 4, 0, 1, 5, 6, 1, 7, 5,
2164
+ 7, 0, 5, 0, 6, 8, 9, 1, 10, 8, 10, 11,
2165
+ 8, 11, 9, 11, 11, 12, 11, 1, 0
2166
+ };
2167
+ }
2168
+
2169
+ private static final byte _JSON_indicies[] = init__JSON_indicies_0();
2170
+
2171
+
2172
+ private static byte[] init__JSON_trans_targs_0()
2173
+ {
2174
+ return new byte [] {
2175
+ 1, 0, 2, 10, 10, 3, 5, 4, 7, 9, 8, 10,
2176
+ 6
2177
+ };
2178
+ }
2179
+
2180
+ private static final byte _JSON_trans_targs[] = init__JSON_trans_targs_0();
2181
+
2182
+
2183
+ private static byte[] init__JSON_trans_actions_0()
2184
+ {
2185
+ return new byte [] {
2186
+ 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0,
2187
+ 0
2188
+ };
2189
+ }
2190
+
2191
+ private static final byte _JSON_trans_actions[] = init__JSON_trans_actions_0();
2192
+
2193
+
2194
+ static final int JSON_start = 1;
2195
+ static final int JSON_first_final = 10;
2196
+ static final int JSON_error = 0;
2197
+
2198
+ static final int JSON_en_main = 1;
2199
+
2200
+
2201
+ // line 866 "Parser.rl"
2202
+
2203
+
2204
+ public IRubyObject parseStrict() {
2205
+ int cs = EVIL;
2206
+ int p, pe;
2207
+ IRubyObject result = null;
2208
+ ParserResult res = new ParserResult();
2209
+
2210
+
2211
+ // line 2212 "Parser.java"
2212
+ {
2213
+ cs = JSON_start;
2214
+ }
2215
+
2216
+ // line 875 "Parser.rl"
2217
+ p = byteList.begin();
2218
+ pe = p + byteList.length();
2219
+
2220
+ // line 2221 "Parser.java"
2221
+ {
2222
+ int _klen;
2223
+ int _trans = 0;
2224
+ int _acts;
2225
+ int _nacts;
2226
+ int _keys;
2227
+ int _goto_targ = 0;
2228
+
2229
+ _goto: while (true) {
2230
+ switch ( _goto_targ ) {
2231
+ case 0:
2232
+ if ( p == pe ) {
2233
+ _goto_targ = 4;
2234
+ continue _goto;
2235
+ }
2236
+ if ( cs == 0 ) {
2237
+ _goto_targ = 5;
2238
+ continue _goto;
2239
+ }
2240
+ case 1:
2241
+ _match: do {
2242
+ _keys = _JSON_key_offsets[cs];
2243
+ _trans = _JSON_index_offsets[cs];
2244
+ _klen = _JSON_single_lengths[cs];
2245
+ if ( _klen > 0 ) {
2246
+ int _lower = _keys;
2247
+ int _mid;
2248
+ int _upper = _keys + _klen - 1;
2249
+ while (true) {
2250
+ if ( _upper < _lower )
2251
+ break;
2252
+
2253
+ _mid = _lower + ((_upper-_lower) >> 1);
2254
+ if ( data[p] < _JSON_trans_keys[_mid] )
2255
+ _upper = _mid - 1;
2256
+ else if ( data[p] > _JSON_trans_keys[_mid] )
2257
+ _lower = _mid + 1;
2258
+ else {
2259
+ _trans += (_mid - _keys);
2260
+ break _match;
2261
+ }
2262
+ }
2263
+ _keys += _klen;
2264
+ _trans += _klen;
2265
+ }
2266
+
2267
+ _klen = _JSON_range_lengths[cs];
2268
+ if ( _klen > 0 ) {
2269
+ int _lower = _keys;
2270
+ int _mid;
2271
+ int _upper = _keys + (_klen<<1) - 2;
2272
+ while (true) {
2273
+ if ( _upper < _lower )
2274
+ break;
2275
+
2276
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
2277
+ if ( data[p] < _JSON_trans_keys[_mid] )
2278
+ _upper = _mid - 2;
2279
+ else if ( data[p] > _JSON_trans_keys[_mid+1] )
2280
+ _lower = _mid + 2;
2281
+ else {
2282
+ _trans += ((_mid - _keys)>>1);
2283
+ break _match;
2284
+ }
2285
+ }
2286
+ _trans += _klen;
2287
+ }
2288
+ } while (false);
2289
+
2290
+ _trans = _JSON_indicies[_trans];
2291
+ cs = _JSON_trans_targs[_trans];
2292
+
2293
+ if ( _JSON_trans_actions[_trans] != 0 ) {
2294
+ _acts = _JSON_trans_actions[_trans];
2295
+ _nacts = (int) _JSON_actions[_acts++];
2296
+ while ( _nacts-- > 0 )
2297
+ {
2298
+ switch ( _JSON_actions[_acts++] )
2299
+ {
2300
+ case 0:
2301
+ // line 838 "Parser.rl"
2302
+ {
2303
+ currentNesting = 1;
2304
+ parseObject(res, p, pe);
2305
+ if (res.result == null) {
2306
+ p--;
2307
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
2308
+ } else {
2309
+ result = res.result;
2310
+ {p = (( res.p))-1;}
2311
+ }
2312
+ }
2313
+ break;
2314
+ case 1:
2315
+ // line 850 "Parser.rl"
2316
+ {
2317
+ currentNesting = 1;
2318
+ parseArray(res, p, pe);
2319
+ if (res.result == null) {
2320
+ p--;
2321
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
2322
+ } else {
2323
+ result = res.result;
2324
+ {p = (( res.p))-1;}
2325
+ }
2326
+ }
2327
+ break;
2328
+ // line 2329 "Parser.java"
2329
+ }
2330
+ }
2331
+ }
2332
+
2333
+ case 2:
2334
+ if ( cs == 0 ) {
2335
+ _goto_targ = 5;
2336
+ continue _goto;
2337
+ }
2338
+ if ( ++p != pe ) {
2339
+ _goto_targ = 1;
2340
+ continue _goto;
2341
+ }
2342
+ case 4:
2343
+ case 5:
2344
+ }
2345
+ break; }
2346
+ }
2347
+
2348
+ // line 878 "Parser.rl"
2349
+
2350
+ if (cs >= JSON_first_final && p == pe) {
2351
+ return result;
2352
+ } else {
2353
+ throw unexpectedToken(p, pe);
2354
+ }
2355
+ }
2356
+
2357
+
2358
+ // line 2359 "Parser.java"
2359
+ private static byte[] init__JSON_quirks_mode_actions_0()
2360
+ {
2361
+ return new byte [] {
2362
+ 0, 1, 0
2363
+ };
2364
+ }
2365
+
2366
+ private static final byte _JSON_quirks_mode_actions[] = init__JSON_quirks_mode_actions_0();
2367
+
2368
+
2369
+ private static byte[] init__JSON_quirks_mode_key_offsets_0()
2370
+ {
2371
+ return new byte [] {
2372
+ 0, 0, 16, 18, 19, 21, 22, 24, 25, 27, 28
2373
+ };
2374
+ }
2375
+
2376
+ private static final byte _JSON_quirks_mode_key_offsets[] = init__JSON_quirks_mode_key_offsets_0();
2377
+
2378
+
2379
+ private static char[] init__JSON_quirks_mode_trans_keys_0()
2380
+ {
2381
+ return new char [] {
2382
+ 13, 32, 34, 45, 47, 73, 78, 91, 102, 110, 116, 123,
2383
+ 9, 10, 48, 57, 42, 47, 42, 42, 47, 10, 42, 47,
2384
+ 42, 42, 47, 10, 13, 32, 47, 9, 10, 0
2385
+ };
2386
+ }
2387
+
2388
+ private static final char _JSON_quirks_mode_trans_keys[] = init__JSON_quirks_mode_trans_keys_0();
2389
+
2390
+
2391
+ private static byte[] init__JSON_quirks_mode_single_lengths_0()
2392
+ {
2393
+ return new byte [] {
2394
+ 0, 12, 2, 1, 2, 1, 2, 1, 2, 1, 3
2395
+ };
2396
+ }
2397
+
2398
+ private static final byte _JSON_quirks_mode_single_lengths[] = init__JSON_quirks_mode_single_lengths_0();
2399
+
2400
+
2401
+ private static byte[] init__JSON_quirks_mode_range_lengths_0()
2402
+ {
2403
+ return new byte [] {
2404
+ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1
2405
+ };
2406
+ }
2407
+
2408
+ private static final byte _JSON_quirks_mode_range_lengths[] = init__JSON_quirks_mode_range_lengths_0();
2409
+
2410
+
2411
+ private static byte[] init__JSON_quirks_mode_index_offsets_0()
2412
+ {
2413
+ return new byte [] {
2414
+ 0, 0, 15, 18, 20, 23, 25, 28, 30, 33, 35
2415
+ };
2416
+ }
2417
+
2418
+ private static final byte _JSON_quirks_mode_index_offsets[] = init__JSON_quirks_mode_index_offsets_0();
2419
+
2420
+
2421
+ private static byte[] init__JSON_quirks_mode_indicies_0()
2422
+ {
2423
+ return new byte [] {
2424
+ 0, 0, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2,
2425
+ 0, 2, 1, 4, 5, 1, 6, 4, 6, 7, 4, 7,
2426
+ 5, 8, 9, 1, 10, 8, 10, 0, 8, 0, 9, 7,
2427
+ 7, 11, 7, 1, 0
2428
+ };
2429
+ }
2430
+
2431
+ private static final byte _JSON_quirks_mode_indicies[] = init__JSON_quirks_mode_indicies_0();
2432
+
2433
+
2434
+ private static byte[] init__JSON_quirks_mode_trans_targs_0()
2435
+ {
2436
+ return new byte [] {
2437
+ 1, 0, 10, 6, 3, 5, 4, 10, 7, 9, 8, 2
2438
+ };
2439
+ }
2440
+
2441
+ private static final byte _JSON_quirks_mode_trans_targs[] = init__JSON_quirks_mode_trans_targs_0();
2442
+
2443
+
2444
+ private static byte[] init__JSON_quirks_mode_trans_actions_0()
2445
+ {
2446
+ return new byte [] {
2447
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0
2448
+ };
2449
+ }
2450
+
2451
+ private static final byte _JSON_quirks_mode_trans_actions[] = init__JSON_quirks_mode_trans_actions_0();
2452
+
2453
+
2454
+ static final int JSON_quirks_mode_start = 1;
2455
+ static final int JSON_quirks_mode_first_final = 10;
2456
+ static final int JSON_quirks_mode_error = 0;
2457
+
2458
+ static final int JSON_quirks_mode_en_main = 1;
2459
+
2460
+
2461
+ // line 906 "Parser.rl"
2462
+
2463
+
2464
+ public IRubyObject parseQuirksMode() {
2465
+ int cs = EVIL;
2466
+ int p, pe;
2467
+ IRubyObject result = null;
2468
+ ParserResult res = new ParserResult();
2469
+
2470
+
2471
+ // line 2472 "Parser.java"
2472
+ {
2473
+ cs = JSON_quirks_mode_start;
2474
+ }
2475
+
2476
+ // line 915 "Parser.rl"
2477
+ p = byteList.begin();
2478
+ pe = p + byteList.length();
2479
+
2480
+ // line 2481 "Parser.java"
2481
+ {
2482
+ int _klen;
2483
+ int _trans = 0;
2484
+ int _acts;
2485
+ int _nacts;
2486
+ int _keys;
2487
+ int _goto_targ = 0;
2488
+
2489
+ _goto: while (true) {
2490
+ switch ( _goto_targ ) {
2491
+ case 0:
2492
+ if ( p == pe ) {
2493
+ _goto_targ = 4;
2494
+ continue _goto;
2495
+ }
2496
+ if ( cs == 0 ) {
2497
+ _goto_targ = 5;
2498
+ continue _goto;
2499
+ }
2500
+ case 1:
2501
+ _match: do {
2502
+ _keys = _JSON_quirks_mode_key_offsets[cs];
2503
+ _trans = _JSON_quirks_mode_index_offsets[cs];
2504
+ _klen = _JSON_quirks_mode_single_lengths[cs];
2505
+ if ( _klen > 0 ) {
2506
+ int _lower = _keys;
2507
+ int _mid;
2508
+ int _upper = _keys + _klen - 1;
2509
+ while (true) {
2510
+ if ( _upper < _lower )
2511
+ break;
2512
+
2513
+ _mid = _lower + ((_upper-_lower) >> 1);
2514
+ if ( data[p] < _JSON_quirks_mode_trans_keys[_mid] )
2515
+ _upper = _mid - 1;
2516
+ else if ( data[p] > _JSON_quirks_mode_trans_keys[_mid] )
2517
+ _lower = _mid + 1;
2518
+ else {
2519
+ _trans += (_mid - _keys);
2520
+ break _match;
2521
+ }
2522
+ }
2523
+ _keys += _klen;
2524
+ _trans += _klen;
2525
+ }
2526
+
2527
+ _klen = _JSON_quirks_mode_range_lengths[cs];
2528
+ if ( _klen > 0 ) {
2529
+ int _lower = _keys;
2530
+ int _mid;
2531
+ int _upper = _keys + (_klen<<1) - 2;
2532
+ while (true) {
2533
+ if ( _upper < _lower )
2534
+ break;
2535
+
2536
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1);
2537
+ if ( data[p] < _JSON_quirks_mode_trans_keys[_mid] )
2538
+ _upper = _mid - 2;
2539
+ else if ( data[p] > _JSON_quirks_mode_trans_keys[_mid+1] )
2540
+ _lower = _mid + 2;
2541
+ else {
2542
+ _trans += ((_mid - _keys)>>1);
2543
+ break _match;
2544
+ }
2545
+ }
2546
+ _trans += _klen;
2547
+ }
2548
+ } while (false);
2549
+
2550
+ _trans = _JSON_quirks_mode_indicies[_trans];
2551
+ cs = _JSON_quirks_mode_trans_targs[_trans];
2552
+
2553
+ if ( _JSON_quirks_mode_trans_actions[_trans] != 0 ) {
2554
+ _acts = _JSON_quirks_mode_trans_actions[_trans];
2555
+ _nacts = (int) _JSON_quirks_mode_actions[_acts++];
2556
+ while ( _nacts-- > 0 )
2557
+ {
2558
+ switch ( _JSON_quirks_mode_actions[_acts++] )
2559
+ {
2560
+ case 0:
2561
+ // line 892 "Parser.rl"
2562
+ {
2563
+ parseValue(res, p, pe);
2564
+ if (res.result == null) {
2565
+ p--;
2566
+ { p += 1; _goto_targ = 5; if (true) continue _goto;}
2567
+ } else {
2568
+ result = res.result;
2569
+ {p = (( res.p))-1;}
2570
+ }
2571
+ }
2572
+ break;
2573
+ // line 2574 "Parser.java"
2574
+ }
2575
+ }
2576
+ }
2577
+
2578
+ case 2:
2579
+ if ( cs == 0 ) {
2580
+ _goto_targ = 5;
2581
+ continue _goto;
2582
+ }
2583
+ if ( ++p != pe ) {
2584
+ _goto_targ = 1;
2585
+ continue _goto;
2586
+ }
2587
+ case 4:
2588
+ case 5:
2589
+ }
2590
+ break; }
2591
+ }
2592
+
2593
+ // line 918 "Parser.rl"
2594
+
2595
+ if (cs >= JSON_quirks_mode_first_final && p == pe) {
2596
+ return result;
2597
+ } else {
2598
+ throw unexpectedToken(p, pe);
2599
+ }
2600
+ }
2601
+
2602
+ public IRubyObject parse() {
2603
+ if (parser.quirksMode) {
2604
+ return parseQuirksMode();
2605
+ } else {
2606
+ return parseStrict();
2607
+ }
2608
+
2609
+ }
2610
+
2611
+ /**
2612
+ * Updates the "view" bytelist with the new offsets and returns it.
2613
+ * @param start
2614
+ * @param end
2615
+ */
2616
+ private ByteList absSubSequence(int absStart, int absEnd) {
2617
+ view.setBegin(absStart);
2618
+ view.setRealSize(absEnd - absStart);
2619
+ return view;
2620
+ }
2621
+
2622
+ /**
2623
+ * Retrieves a constant directly descended from the <code>JSON</code> module.
2624
+ * @param name The constant name
2625
+ */
2626
+ private IRubyObject getConstant(String name) {
2627
+ return parser.info.jsonModule.get().getConstant(name);
2628
+ }
2629
+
2630
+ private RaiseException newException(String className, String message) {
2631
+ return Utils.newException(context, className, message);
2632
+ }
2633
+
2634
+ private RaiseException newException(String className, RubyString message) {
2635
+ return Utils.newException(context, className, message);
2636
+ }
2637
+
2638
+ private RaiseException newException(String className,
2639
+ String messageBegin, ByteList messageEnd) {
2640
+ return newException(className,
2641
+ getRuntime().newString(messageBegin).cat(messageEnd));
2642
+ }
2643
+ }
2644
+ }