json_pure 2.2.0 → 2.5.0

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