summaryrefslogtreecommitdiff
path: root/src/json/ext/Parser.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/json/ext/Parser.java')
-rw-r--r--src/json/ext/Parser.java2269
1 files changed, 0 insertions, 2269 deletions
diff --git a/src/json/ext/Parser.java b/src/json/ext/Parser.java
deleted file mode 100644
index e7c1b14..0000000
--- a/src/json/ext/Parser.java
+++ /dev/null
@@ -1,2269 +0,0 @@
-
-// line 1 "src/json/ext/Parser.rl"
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import org.jruby.Ruby;
-import org.jruby.RubyArray;
-import org.jruby.RubyClass;
-import org.jruby.RubyEncoding;
-import org.jruby.RubyFloat;
-import org.jruby.RubyHash;
-import org.jruby.RubyInteger;
-import org.jruby.RubyModule;
-import org.jruby.RubyNumeric;
-import org.jruby.RubyObject;
-import org.jruby.RubyString;
-import org.jruby.anno.JRubyMethod;
-import org.jruby.exceptions.RaiseException;
-import org.jruby.runtime.Block;
-import org.jruby.runtime.ObjectAllocator;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.runtime.Visibility;
-import org.jruby.runtime.builtin.IRubyObject;
-import org.jruby.util.ByteList;
-
-/**
- * The <code>JSON::Ext::Parser</code> class.
- *
- * <p>This is the JSON parser implemented as a Java class. To use it as the
- * standard parser, set
- * <pre>JSON.parser = JSON::Ext::Parser</pre>
- * This is performed for you when you <code>include "json/ext"</code>.
- *
- * <p>This class does not perform the actual parsing, just acts as an interface
- * to Ruby code. When the {@link #parse()} method is invoked, a
- * Parser.ParserSession object is instantiated, which handles the process.
- *
- * @author mernen
- */
-public class Parser extends RubyObject {
- private final RuntimeInfo info;
- private RubyString vSource;
- private RubyString createId;
- private int maxNesting;
- private boolean allowNaN;
- private boolean symbolizeNames;
- private RubyClass objectClass;
- private RubyClass arrayClass;
-
- private static final int DEFAULT_MAX_NESTING = 19;
-
- private static final String JSON_MINUS_INFINITY = "-Infinity";
- // constant names in the JSON module containing those values
- private static final String CONST_NAN = "NaN";
- private static final String CONST_INFINITY = "Infinity";
- private static final String CONST_MINUS_INFINITY = "MinusInfinity";
-
- static final ObjectAllocator ALLOCATOR = new ObjectAllocator() {
- public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
- return new Parser(runtime, klazz);
- }
- };
-
- /**
- * Multiple-value return for internal parser methods.
- *
- * <p>All the <code>parse<var>Stuff</var></code> methods return instances of
- * <code>ParserResult</code> when successful, or <code>null</code> when
- * there's a problem with the input data.
- */
- static final class ParserResult {
- /**
- * The result of the successful parsing. Should never be
- * <code>null</code>.
- */
- final IRubyObject result;
- /**
- * The point where the parser returned.
- */
- final int p;
-
- ParserResult(IRubyObject result, int p) {
- this.result = result;
- this.p = p;
- }
- }
-
- public Parser(Ruby runtime, RubyClass metaClass) {
- super(runtime, metaClass);
- info = RuntimeInfo.forRuntime(runtime);
- }
-
- /**
- * <code>Parser.new(source, opts = {})</code>
- *
- * <p>Creates a new <code>JSON::Ext::Parser</code> instance for the string
- * <code>source</code>.
- * It will be configured by the <code>opts</code> Hash.
- * <code>opts</code> can have the following keys:
- *
- * <dl>
- * <dt><code>:max_nesting</code>
- * <dd>The maximum depth of nesting allowed in the parsed data
- * structures. Disable depth checking with <code>:max_nesting => false|nil|0</code>,
- * it defaults to 19.
- *
- * <dt><code>:allow_nan</code>
- * <dd>If set to <code>true</code>, allow <code>NaN</code>,
- * <code>Infinity</code> and <code>-Infinity</code> in defiance of RFC 4627
- * to be parsed by the Parser. This option defaults to <code>false</code>.
- *
- * <dt><code>:symbolize_names</code>
- * <dd>If set to <code>true</code>, returns symbols for the names (keys) in
- * a JSON object. Otherwise strings are returned, which is also the default.
- *
- * <dt><code>:create_additions</code>
- * <dd>If set to <code>false</code>, the Parser doesn't create additions
- * even if a matchin class and <code>create_id</code> was found. This option
- * defaults to <code>true</code>.
- *
- * <dt><code>:object_class</code>
- * <dd>Defaults to Hash.
- *
- * <dt><code>:array_class</code>
- * <dd>Defaults to Array.
- * </dl>
- */
- @JRubyMethod(name = "new", required = 1, optional = 1, meta = true)
- public static IRubyObject newInstance(IRubyObject clazz, IRubyObject[] args, Block block) {
- Parser parser = (Parser)((RubyClass)clazz).allocate();
-
- parser.callInit(args, block);
-
- return parser;
- }
-
- @JRubyMethod(required = 1, optional = 1, visibility = Visibility.PRIVATE)
- public IRubyObject initialize(ThreadContext context, IRubyObject[] args) {
- Ruby runtime = context.getRuntime();
- RubyString source = convertEncoding(context, args[0].convertToString());
-
- OptionsReader opts =
- new OptionsReader(context, args.length > 1 ? args[1] : null);
-
- this.maxNesting = opts.getInt("max_nesting", DEFAULT_MAX_NESTING);
- this.allowNaN = opts.getBool("allow_nan", false);
- this.symbolizeNames = opts.getBool("symbolize_names", false);
- this.createId =
- opts.getBool("create_additions", true) ? getCreateId(context)
- : null;
- this.objectClass = opts.getClass("object_class", runtime.getHash());
- this.arrayClass = opts.getClass("array_class", runtime.getArray());
-
- this.vSource = source;
- return this;
- }
-
- /**
- * Checks the given string's encoding. If a non-UTF-8 encoding is detected,
- * a converted copy is returned.
- * Returns the source string if no conversion is needed.
- */
- private RubyString convertEncoding(ThreadContext context, RubyString source) {
- ByteList bl = source.getByteList();
- int len = bl.length();
- if (len < 2) {
- throw Utils.newException(context, Utils.M_PARSER_ERROR,
- "A JSON text must at least contain two octets!");
- }
-
- if (info.encodingsSupported()) {
- RubyEncoding encoding = (RubyEncoding)source.encoding(context);
- if (encoding != info.ascii8bit) {
- return (RubyString)source.encode(context, info.utf8);
- }
-
- String sniffedEncoding = sniffByteList(bl);
- if (sniffedEncoding == null) return source; // assume UTF-8
- return reinterpretEncoding(context, source, sniffedEncoding);
- }
-
- String sniffedEncoding = sniffByteList(bl);
- if (sniffedEncoding == null) return source; // assume UTF-8
- Ruby runtime = context.getRuntime();
- return (RubyString)info.jsonModule.
- callMethod(context, "iconv",
- new IRubyObject[] {
- runtime.newString("utf-8"),
- runtime.newString(sniffedEncoding),
- source});
- }
-
- /**
- * Checks the first four bytes of the given ByteList to infer its encoding,
- * using the principle demonstrated on section 3 of RFC 4627 (JSON).
- */
- private static String sniffByteList(ByteList bl) {
- if (bl.length() < 4) return null;
- if (bl.get(0) == 0 && bl.get(2) == 0) {
- return bl.get(1) == 0 ? "utf-32be" : "utf-16be";
- }
- if (bl.get(1) == 0 && bl.get(3) == 0) {
- return bl.get(2) == 0 ? "utf-32le" : "utf-16le";
- }
- return null;
- }
-
- /**
- * Assumes the given (binary) RubyString to be in the given encoding, then
- * converts it to UTF-8.
- */
- private RubyString reinterpretEncoding(ThreadContext context,
- RubyString str, String sniffedEncoding) {
- RubyEncoding actualEncoding = info.getEncoding(context, sniffedEncoding);
- RubyEncoding targetEncoding = info.utf8;
- RubyString dup = (RubyString)str.dup();
- dup.force_encoding(context, actualEncoding);
- return (RubyString)dup.encode_bang(context, targetEncoding);
- }
-
- /**
- * <code>Parser#parse()</code>
- *
- * <p>Parses the current JSON text <code>source</code> and returns the
- * complete data structure as a result.
- */
- @JRubyMethod
- public IRubyObject parse(ThreadContext context) {
- return new ParserSession(this, context).parse();
- }
-
- /**
- * <code>Parser#source()</code>
- *
- * <p>Returns a copy of the current <code>source</code> string, that was
- * used to construct this Parser.
- */
- @JRubyMethod(name = "source")
- public IRubyObject source_get() {
- return vSource.dup();
- }
-
- /**
- * Queries <code>JSON.create_id</code>. Returns <code>null</code> if it is
- * set to <code>nil</code> or <code>false</code>, and a String if not.
- */
- private RubyString getCreateId(ThreadContext context) {
- IRubyObject v = info.jsonModule.callMethod(context, "create_id");
- return v.isTrue() ? v.convertToString() : null;
- }
-
- /**
- * A string parsing session.
- *
- * <p>Once a ParserSession is instantiated, the source string should not
- * change until the parsing is complete. The ParserSession object assumes
- * the source {@link RubyString} is still associated to its original
- * {@link ByteList}, which in turn must still be bound to the same
- * <code>byte[]</code> value (and on the same offset).
- */
- // Ragel uses lots of fall-through
- @SuppressWarnings("fallthrough")
- private static class ParserSession {
- private final Parser parser;
- private final ThreadContext context;
- private final ByteList byteList;
- private final byte[] data;
- private final StringDecoder decoder;
- private int currentNesting = 0;
-
- // initialization value for all state variables.
- // no idea about the origins of this value, ask Flori ;)
- private static final int EVIL = 0x666;
-
- private ParserSession(Parser parser, ThreadContext context) {
- this.parser = parser;
- this.context = context;
- this.byteList = parser.vSource.getByteList();
- this.data = byteList.unsafeBytes();
- this.decoder = new StringDecoder(context);
- }
-
- private RaiseException unexpectedToken(int absStart, int absEnd) {
- RubyString msg = getRuntime().newString("unexpected token at '")
- .cat(data, absStart, absEnd - absStart)
- .cat((byte)'\'');
- return newException(Utils.M_PARSER_ERROR, msg);
- }
-
- private Ruby getRuntime() {
- return context.getRuntime();
- }
-
-
-// line 323 "src/json/ext/Parser.rl"
-
-
-
-// line 305 "src/json/ext/Parser.java"
-private static byte[] init__JSON_value_actions_0()
-{
- return new byte [] {
- 0, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1,
- 5, 1, 6, 1, 7, 1, 8, 1, 9
- };
-}
-
-private static final byte _JSON_value_actions[] = init__JSON_value_actions_0();
-
-
-private static byte[] init__JSON_value_key_offsets_0()
-{
- return new byte [] {
- 0, 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
- 21, 22, 23, 24, 25, 26, 27, 28, 29, 30
- };
-}
-
-private static final byte _JSON_value_key_offsets[] = init__JSON_value_key_offsets_0();
-
-
-private static char[] init__JSON_value_trans_keys_0()
-{
- return new char [] {
- 34, 45, 73, 78, 91, 102, 110, 116, 123, 48, 57, 110,
- 102, 105, 110, 105, 116, 121, 97, 78, 97, 108, 115, 101,
- 117, 108, 108, 114, 117, 101, 0
- };
-}
-
-private static final char _JSON_value_trans_keys[] = init__JSON_value_trans_keys_0();
-
-
-private static byte[] init__JSON_value_single_lengths_0()
-{
- return new byte [] {
- 0, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 0
- };
-}
-
-private static final byte _JSON_value_single_lengths[] = init__JSON_value_single_lengths_0();
-
-
-private static byte[] init__JSON_value_range_lengths_0()
-{
- return new byte [] {
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- };
-}
-
-private static final byte _JSON_value_range_lengths[] = init__JSON_value_range_lengths_0();
-
-
-private static byte[] init__JSON_value_index_offsets_0()
-{
- return new byte [] {
- 0, 0, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29,
- 31, 33, 35, 37, 39, 41, 43, 45, 47, 49
- };
-}
-
-private static final byte _JSON_value_index_offsets[] = init__JSON_value_index_offsets_0();
-
-
-private static byte[] init__JSON_value_trans_targs_0()
-{
- return new byte [] {
- 21, 21, 2, 9, 21, 11, 15, 18, 21, 21, 0, 3,
- 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 21,
- 0, 10, 0, 21, 0, 12, 0, 13, 0, 14, 0, 21,
- 0, 16, 0, 17, 0, 21, 0, 19, 0, 20, 0, 21,
- 0, 0, 0
- };
-}
-
-private static final byte _JSON_value_trans_targs[] = init__JSON_value_trans_targs_0();
-
-
-private static byte[] init__JSON_value_trans_actions_0()
-{
- return new byte [] {
- 13, 11, 0, 0, 15, 0, 0, 0, 17, 11, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 5,
- 0, 0, 0
- };
-}
-
-private static final byte _JSON_value_trans_actions[] = init__JSON_value_trans_actions_0();
-
-
-private static byte[] init__JSON_value_from_state_actions_0()
-{
- return new byte [] {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 19
- };
-}
-
-private static final byte _JSON_value_from_state_actions[] = init__JSON_value_from_state_actions_0();
-
-
-static final int JSON_value_start = 1;
-static final int JSON_value_first_final = 21;
-static final int JSON_value_error = 0;
-
-static final int JSON_value_en_main = 1;
-
-
-// line 429 "src/json/ext/Parser.rl"
-
-
- ParserResult parseValue(int p, int pe) {
- int cs = EVIL;
- IRubyObject result = null;
-
-
-// line 427 "src/json/ext/Parser.java"
- {
- cs = JSON_value_start;
- }
-
-// line 436 "src/json/ext/Parser.rl"
-
-// line 434 "src/json/ext/Parser.java"
- {
- int _klen;
- int _trans = 0;
- int _acts;
- int _nacts;
- int _keys;
- int _goto_targ = 0;
-
- _goto: while (true) {
- switch ( _goto_targ ) {
- case 0:
- if ( p == pe ) {
- _goto_targ = 4;
- continue _goto;
- }
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
-case 1:
- _acts = _JSON_value_from_state_actions[cs];
- _nacts = (int) _JSON_value_actions[_acts++];
- while ( _nacts-- > 0 ) {
- switch ( _JSON_value_actions[_acts++] ) {
- case 9:
-// line 414 "src/json/ext/Parser.rl"
- {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- }
- break;
-// line 466 "src/json/ext/Parser.java"
- }
- }
-
- _match: do {
- _keys = _JSON_value_key_offsets[cs];
- _trans = _JSON_value_index_offsets[cs];
- _klen = _JSON_value_single_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + _klen - 1;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + ((_upper-_lower) >> 1);
- if ( data[p] < _JSON_value_trans_keys[_mid] )
- _upper = _mid - 1;
- else if ( data[p] > _JSON_value_trans_keys[_mid] )
- _lower = _mid + 1;
- else {
- _trans += (_mid - _keys);
- break _match;
- }
- }
- _keys += _klen;
- _trans += _klen;
- }
-
- _klen = _JSON_value_range_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + (_klen<<1) - 2;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + (((_upper-_lower) >> 1) & ~1);
- if ( data[p] < _JSON_value_trans_keys[_mid] )
- _upper = _mid - 2;
- else if ( data[p] > _JSON_value_trans_keys[_mid+1] )
- _lower = _mid + 2;
- else {
- _trans += ((_mid - _keys)>>1);
- break _match;
- }
- }
- _trans += _klen;
- }
- } while (false);
-
- cs = _JSON_value_trans_targs[_trans];
-
- if ( _JSON_value_trans_actions[_trans] != 0 ) {
- _acts = _JSON_value_trans_actions[_trans];
- _nacts = (int) _JSON_value_actions[_acts++];
- while ( _nacts-- > 0 )
- {
- switch ( _JSON_value_actions[_acts++] )
- {
- case 0:
-// line 331 "src/json/ext/Parser.rl"
- {
- result = getRuntime().getNil();
- }
- break;
- case 1:
-// line 334 "src/json/ext/Parser.rl"
- {
- result = getRuntime().getFalse();
- }
- break;
- case 2:
-// line 337 "src/json/ext/Parser.rl"
- {
- result = getRuntime().getTrue();
- }
- break;
- case 3:
-// line 340 "src/json/ext/Parser.rl"
- {
- if (parser.allowNaN) {
- result = getConstant(CONST_NAN);
- } else {
- throw unexpectedToken(p - 2, pe);
- }
- }
- break;
- case 4:
-// line 347 "src/json/ext/Parser.rl"
- {
- if (parser.allowNaN) {
- result = getConstant(CONST_INFINITY);
- } else {
- throw unexpectedToken(p - 7, pe);
- }
- }
- break;
- case 5:
-// line 354 "src/json/ext/Parser.rl"
- {
- if (pe > p + 9 &&
- absSubSequence(p, p + 9).toString().equals(JSON_MINUS_INFINITY)) {
-
- if (parser.allowNaN) {
- result = getConstant(CONST_MINUS_INFINITY);
- {p = (( p + 10))-1;}
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- } else {
- throw unexpectedToken(p, pe);
- }
- }
- ParserResult res = parseFloat(p, pe);
- if (res != null) {
- result = res.result;
- {p = (( res.p))-1;}
- }
- res = parseInteger(p, pe);
- if (res != null) {
- result = res.result;
- {p = (( res.p))-1;}
- }
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- }
- break;
- case 6:
-// line 380 "src/json/ext/Parser.rl"
- {
- ParserResult res = parseString(p, pe);
- if (res == null) {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- } else {
- result = res.result;
- {p = (( res.p))-1;}
- }
- }
- break;
- case 7:
-// line 390 "src/json/ext/Parser.rl"
- {
- currentNesting++;
- ParserResult res = parseArray(p, pe);
- currentNesting--;
- if (res == null) {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- } else {
- result = res.result;
- {p = (( res.p))-1;}
- }
- }
- break;
- case 8:
-// line 402 "src/json/ext/Parser.rl"
- {
- currentNesting++;
- ParserResult res = parseObject(p, pe);
- currentNesting--;
- if (res == null) {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- } else {
- result = res.result;
- {p = (( res.p))-1;}
- }
- }
- break;
-// line 638 "src/json/ext/Parser.java"
- }
- }
- }
-
-case 2:
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
- if ( ++p != pe ) {
- _goto_targ = 1;
- continue _goto;
- }
-case 4:
-case 5:
- }
- break; }
- }
-
-// line 437 "src/json/ext/Parser.rl"
-
- if (cs >= JSON_value_first_final && result != null) {
- return new ParserResult(result, p);
- } else {
- return null;
- }
- }
-
-
-// line 668 "src/json/ext/Parser.java"
-private static byte[] init__JSON_integer_actions_0()
-{
- return new byte [] {
- 0, 1, 0
- };
-}
-
-private static final byte _JSON_integer_actions[] = init__JSON_integer_actions_0();
-
-
-private static byte[] init__JSON_integer_key_offsets_0()
-{
- return new byte [] {
- 0, 0, 4, 7, 9, 11
- };
-}
-
-private static final byte _JSON_integer_key_offsets[] = init__JSON_integer_key_offsets_0();
-
-
-private static char[] init__JSON_integer_trans_keys_0()
-{
- return new char [] {
- 45, 48, 49, 57, 48, 49, 57, 48, 57, 48, 57, 0
- };
-}
-
-private static final char _JSON_integer_trans_keys[] = init__JSON_integer_trans_keys_0();
-
-
-private static byte[] init__JSON_integer_single_lengths_0()
-{
- return new byte [] {
- 0, 2, 1, 0, 0, 0
- };
-}
-
-private static final byte _JSON_integer_single_lengths[] = init__JSON_integer_single_lengths_0();
-
-
-private static byte[] init__JSON_integer_range_lengths_0()
-{
- return new byte [] {
- 0, 1, 1, 1, 1, 0
- };
-}
-
-private static final byte _JSON_integer_range_lengths[] = init__JSON_integer_range_lengths_0();
-
-
-private static byte[] init__JSON_integer_index_offsets_0()
-{
- return new byte [] {
- 0, 0, 4, 7, 9, 11
- };
-}
-
-private static final byte _JSON_integer_index_offsets[] = init__JSON_integer_index_offsets_0();
-
-
-private static byte[] init__JSON_integer_indicies_0()
-{
- return new byte [] {
- 0, 2, 3, 1, 2, 3, 1, 1, 4, 3, 4, 1,
- 0
- };
-}
-
-private static final byte _JSON_integer_indicies[] = init__JSON_integer_indicies_0();
-
-
-private static byte[] init__JSON_integer_trans_targs_0()
-{
- return new byte [] {
- 2, 0, 3, 4, 5
- };
-}
-
-private static final byte _JSON_integer_trans_targs[] = init__JSON_integer_trans_targs_0();
-
-
-private static byte[] init__JSON_integer_trans_actions_0()
-{
- return new byte [] {
- 0, 0, 0, 0, 1
- };
-}
-
-private static final byte _JSON_integer_trans_actions[] = init__JSON_integer_trans_actions_0();
-
-
-static final int JSON_integer_start = 1;
-static final int JSON_integer_first_final = 5;
-static final int JSON_integer_error = 0;
-
-static final int JSON_integer_en_main = 1;
-
-
-// line 456 "src/json/ext/Parser.rl"
-
-
- ParserResult parseInteger(int p, int pe) {
- int cs = EVIL;
-
-
-// line 774 "src/json/ext/Parser.java"
- {
- cs = JSON_integer_start;
- }
-
-// line 462 "src/json/ext/Parser.rl"
- int memo = p;
-
-// line 782 "src/json/ext/Parser.java"
- {
- int _klen;
- int _trans = 0;
- int _acts;
- int _nacts;
- int _keys;
- int _goto_targ = 0;
-
- _goto: while (true) {
- switch ( _goto_targ ) {
- case 0:
- if ( p == pe ) {
- _goto_targ = 4;
- continue _goto;
- }
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
-case 1:
- _match: do {
- _keys = _JSON_integer_key_offsets[cs];
- _trans = _JSON_integer_index_offsets[cs];
- _klen = _JSON_integer_single_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + _klen - 1;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + ((_upper-_lower) >> 1);
- if ( data[p] < _JSON_integer_trans_keys[_mid] )
- _upper = _mid - 1;
- else if ( data[p] > _JSON_integer_trans_keys[_mid] )
- _lower = _mid + 1;
- else {
- _trans += (_mid - _keys);
- break _match;
- }
- }
- _keys += _klen;
- _trans += _klen;
- }
-
- _klen = _JSON_integer_range_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + (_klen<<1) - 2;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + (((_upper-_lower) >> 1) & ~1);
- if ( data[p] < _JSON_integer_trans_keys[_mid] )
- _upper = _mid - 2;
- else if ( data[p] > _JSON_integer_trans_keys[_mid+1] )
- _lower = _mid + 2;
- else {
- _trans += ((_mid - _keys)>>1);
- break _match;
- }
- }
- _trans += _klen;
- }
- } while (false);
-
- _trans = _JSON_integer_indicies[_trans];
- cs = _JSON_integer_trans_targs[_trans];
-
- if ( _JSON_integer_trans_actions[_trans] != 0 ) {
- _acts = _JSON_integer_trans_actions[_trans];
- _nacts = (int) _JSON_integer_actions[_acts++];
- while ( _nacts-- > 0 )
- {
- switch ( _JSON_integer_actions[_acts++] )
- {
- case 0:
-// line 450 "src/json/ext/Parser.rl"
- {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- }
- break;
-// line 869 "src/json/ext/Parser.java"
- }
- }
- }
-
-case 2:
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
- if ( ++p != pe ) {
- _goto_targ = 1;
- continue _goto;
- }
-case 4:
-case 5:
- }
- break; }
- }
-
-// line 464 "src/json/ext/Parser.rl"
-
- if (cs < JSON_integer_first_final) {
- return null;
- }
-
- ByteList num = absSubSequence(memo, p);
- // note: this is actually a shared string, but since it is temporary and
- // read-only, it doesn't really matter
- RubyString expr = RubyString.newStringLight(getRuntime(), num);
- RubyInteger number = RubyNumeric.str2inum(getRuntime(), expr, 10, true);
- return new ParserResult(number, p + 1);
- }
-
-
-// line 904 "src/json/ext/Parser.java"
-private static byte[] init__JSON_float_actions_0()
-{
- return new byte [] {
- 0, 1, 0
- };
-}
-
-private static final byte _JSON_float_actions[] = init__JSON_float_actions_0();
-
-
-private static byte[] init__JSON_float_key_offsets_0()
-{
- return new byte [] {
- 0, 0, 4, 7, 10, 12, 18, 22, 24, 30, 35
- };
-}
-
-private static final byte _JSON_float_key_offsets[] = init__JSON_float_key_offsets_0();
-
-
-private static char[] init__JSON_float_trans_keys_0()
-{
- return new char [] {
- 45, 48, 49, 57, 48, 49, 57, 46, 69, 101, 48, 57,
- 69, 101, 45, 46, 48, 57, 43, 45, 48, 57, 48, 57,
- 69, 101, 45, 46, 48, 57, 46, 69, 101, 48, 57, 0
- };
-}
-
-private static final char _JSON_float_trans_keys[] = init__JSON_float_trans_keys_0();
-
-
-private static byte[] init__JSON_float_single_lengths_0()
-{
- return new byte [] {
- 0, 2, 1, 3, 0, 2, 2, 0, 2, 3, 0
- };
-}
-
-private static final byte _JSON_float_single_lengths[] = init__JSON_float_single_lengths_0();
-
-
-private static byte[] init__JSON_float_range_lengths_0()
-{
- return new byte [] {
- 0, 1, 1, 0, 1, 2, 1, 1, 2, 1, 0
- };
-}
-
-private static final byte _JSON_float_range_lengths[] = init__JSON_float_range_lengths_0();
-
-
-private static byte[] init__JSON_float_index_offsets_0()
-{
- return new byte [] {
- 0, 0, 4, 7, 11, 13, 18, 22, 24, 29, 34
- };
-}
-
-private static final byte _JSON_float_index_offsets[] = init__JSON_float_index_offsets_0();
-
-
-private static byte[] init__JSON_float_indicies_0()
-{
- return new byte [] {
- 0, 2, 3, 1, 2, 3, 1, 4, 5, 5, 1, 6,
- 1, 5, 5, 1, 6, 7, 8, 8, 9, 1, 9, 1,
- 1, 1, 1, 9, 7, 4, 5, 5, 3, 1, 1, 0
- };
-}
-
-private static final byte _JSON_float_indicies[] = init__JSON_float_indicies_0();
-
-
-private static byte[] init__JSON_float_trans_targs_0()
-{
- return new byte [] {
- 2, 0, 3, 9, 4, 6, 5, 10, 7, 8
- };
-}
-
-private static final byte _JSON_float_trans_targs[] = init__JSON_float_trans_targs_0();
-
-
-private static byte[] init__JSON_float_trans_actions_0()
-{
- return new byte [] {
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0
- };
-}
-
-private static final byte _JSON_float_trans_actions[] = init__JSON_float_trans_actions_0();
-
-
-static final int JSON_float_start = 1;
-static final int JSON_float_first_final = 10;
-static final int JSON_float_error = 0;
-
-static final int JSON_float_en_main = 1;
-
-
-// line 492 "src/json/ext/Parser.rl"
-
-
- ParserResult parseFloat(int p, int pe) {
- int cs = EVIL;
-
-
-// line 1013 "src/json/ext/Parser.java"
- {
- cs = JSON_float_start;
- }
-
-// line 498 "src/json/ext/Parser.rl"
- int memo = p;
-
-// line 1021 "src/json/ext/Parser.java"
- {
- int _klen;
- int _trans = 0;
- int _acts;
- int _nacts;
- int _keys;
- int _goto_targ = 0;
-
- _goto: while (true) {
- switch ( _goto_targ ) {
- case 0:
- if ( p == pe ) {
- _goto_targ = 4;
- continue _goto;
- }
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
-case 1:
- _match: do {
- _keys = _JSON_float_key_offsets[cs];
- _trans = _JSON_float_index_offsets[cs];
- _klen = _JSON_float_single_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + _klen - 1;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + ((_upper-_lower) >> 1);
- if ( data[p] < _JSON_float_trans_keys[_mid] )
- _upper = _mid - 1;
- else if ( data[p] > _JSON_float_trans_keys[_mid] )
- _lower = _mid + 1;
- else {
- _trans += (_mid - _keys);
- break _match;
- }
- }
- _keys += _klen;
- _trans += _klen;
- }
-
- _klen = _JSON_float_range_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + (_klen<<1) - 2;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + (((_upper-_lower) >> 1) & ~1);
- if ( data[p] < _JSON_float_trans_keys[_mid] )
- _upper = _mid - 2;
- else if ( data[p] > _JSON_float_trans_keys[_mid+1] )
- _lower = _mid + 2;
- else {
- _trans += ((_mid - _keys)>>1);
- break _match;
- }
- }
- _trans += _klen;
- }
- } while (false);
-
- _trans = _JSON_float_indicies[_trans];
- cs = _JSON_float_trans_targs[_trans];
-
- if ( _JSON_float_trans_actions[_trans] != 0 ) {
- _acts = _JSON_float_trans_actions[_trans];
- _nacts = (int) _JSON_float_actions[_acts++];
- while ( _nacts-- > 0 )
- {
- switch ( _JSON_float_actions[_acts++] )
- {
- case 0:
-// line 483 "src/json/ext/Parser.rl"
- {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- }
- break;
-// line 1108 "src/json/ext/Parser.java"
- }
- }
- }
-
-case 2:
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
- if ( ++p != pe ) {
- _goto_targ = 1;
- continue _goto;
- }
-case 4:
-case 5:
- }
- break; }
- }
-
-// line 500 "src/json/ext/Parser.rl"
-
- if (cs < JSON_float_first_final) {
- return null;
- }
-
- ByteList num = absSubSequence(memo, p);
- // note: this is actually a shared string, but since it is temporary and
- // read-only, it doesn't really matter
- RubyString expr = RubyString.newStringLight(getRuntime(), num);
- RubyFloat number = RubyNumeric.str2fnum(getRuntime(), expr, true);
- return new ParserResult(number, p + 1);
- }
-
-
-// line 1143 "src/json/ext/Parser.java"
-private static byte[] init__JSON_string_actions_0()
-{
- return new byte [] {
- 0, 2, 0, 1
- };
-}
-
-private static final byte _JSON_string_actions[] = init__JSON_string_actions_0();
-
-
-private static byte[] init__JSON_string_key_offsets_0()
-{
- return new byte [] {
- 0, 0, 1, 5, 8, 14, 20, 26, 32
- };
-}
-
-private static final byte _JSON_string_key_offsets[] = init__JSON_string_key_offsets_0();
-
-
-private static char[] init__JSON_string_trans_keys_0()
-{
- return new char [] {
- 34, 34, 92, 0, 31, 117, 0, 31, 48, 57, 65, 70,
- 97, 102, 48, 57, 65, 70, 97, 102, 48, 57, 65, 70,
- 97, 102, 48, 57, 65, 70, 97, 102, 0
- };
-}
-
-private static final char _JSON_string_trans_keys[] = init__JSON_string_trans_keys_0();
-
-
-private static byte[] init__JSON_string_single_lengths_0()
-{
- return new byte [] {
- 0, 1, 2, 1, 0, 0, 0, 0, 0
- };
-}
-
-private static final byte _JSON_string_single_lengths[] = init__JSON_string_single_lengths_0();
-
-
-private static byte[] init__JSON_string_range_lengths_0()
-{
- return new byte [] {
- 0, 0, 1, 1, 3, 3, 3, 3, 0
- };
-}
-
-private static final byte _JSON_string_range_lengths[] = init__JSON_string_range_lengths_0();
-
-
-private static byte[] init__JSON_string_index_offsets_0()
-{
- return new byte [] {
- 0, 0, 2, 6, 9, 13, 17, 21, 25
- };
-}
-
-private static final byte _JSON_string_index_offsets[] = init__JSON_string_index_offsets_0();
-
-
-private static byte[] init__JSON_string_indicies_0()
-{
- return new byte [] {
- 0, 1, 2, 3, 1, 0, 4, 1, 0, 5, 5, 5,
- 1, 6, 6, 6, 1, 7, 7, 7, 1, 0, 0, 0,
- 1, 1, 0
- };
-}
-
-private static final byte _JSON_string_indicies[] = init__JSON_string_indicies_0();
-
-
-private static byte[] init__JSON_string_trans_targs_0()
-{
- return new byte [] {
- 2, 0, 8, 3, 4, 5, 6, 7
- };
-}
-
-private static final byte _JSON_string_trans_targs[] = init__JSON_string_trans_targs_0();
-
-
-private static byte[] init__JSON_string_trans_actions_0()
-{
- return new byte [] {
- 0, 0, 1, 0, 0, 0, 0, 0
- };
-}
-
-private static final byte _JSON_string_trans_actions[] = init__JSON_string_trans_actions_0();
-
-
-static final int JSON_string_start = 1;
-static final int JSON_string_first_final = 8;
-static final int JSON_string_error = 0;
-
-static final int JSON_string_en_main = 1;
-
-
-// line 544 "src/json/ext/Parser.rl"
-
-
- ParserResult parseString(int p, int pe) {
- int cs = EVIL;
- RubyString result = null;
-
-
-// line 1253 "src/json/ext/Parser.java"
- {
- cs = JSON_string_start;
- }
-
-// line 551 "src/json/ext/Parser.rl"
- int memo = p;
-
-// line 1261 "src/json/ext/Parser.java"
- {
- int _klen;
- int _trans = 0;
- int _acts;
- int _nacts;
- int _keys;
- int _goto_targ = 0;
-
- _goto: while (true) {
- switch ( _goto_targ ) {
- case 0:
- if ( p == pe ) {
- _goto_targ = 4;
- continue _goto;
- }
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
-case 1:
- _match: do {
- _keys = _JSON_string_key_offsets[cs];
- _trans = _JSON_string_index_offsets[cs];
- _klen = _JSON_string_single_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + _klen - 1;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + ((_upper-_lower) >> 1);
- if ( data[p] < _JSON_string_trans_keys[_mid] )
- _upper = _mid - 1;
- else if ( data[p] > _JSON_string_trans_keys[_mid] )
- _lower = _mid + 1;
- else {
- _trans += (_mid - _keys);
- break _match;
- }
- }
- _keys += _klen;
- _trans += _klen;
- }
-
- _klen = _JSON_string_range_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + (_klen<<1) - 2;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + (((_upper-_lower) >> 1) & ~1);
- if ( data[p] < _JSON_string_trans_keys[_mid] )
- _upper = _mid - 2;
- else if ( data[p] > _JSON_string_trans_keys[_mid+1] )
- _lower = _mid + 2;
- else {
- _trans += ((_mid - _keys)>>1);
- break _match;
- }
- }
- _trans += _klen;
- }
- } while (false);
-
- _trans = _JSON_string_indicies[_trans];
- cs = _JSON_string_trans_targs[_trans];
-
- if ( _JSON_string_trans_actions[_trans] != 0 ) {
- _acts = _JSON_string_trans_actions[_trans];
- _nacts = (int) _JSON_string_actions[_acts++];
- while ( _nacts-- > 0 )
- {
- switch ( _JSON_string_actions[_acts++] )
- {
- case 0:
-// line 519 "src/json/ext/Parser.rl"
- {
- int offset = byteList.begin();
- ByteList decoded = decoder.decode(byteList, memo + 1 - offset,
- p - offset);
- result = getRuntime().newString(decoded);
- if (result == null) {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- } else {
- {p = (( p + 1))-1;}
- }
- }
- break;
- case 1:
-// line 532 "src/json/ext/Parser.rl"
- {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- }
- break;
-// line 1363 "src/json/ext/Parser.java"
- }
- }
- }
-
-case 2:
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
- if ( ++p != pe ) {
- _goto_targ = 1;
- continue _goto;
- }
-case 4:
-case 5:
- }
- break; }
- }
-
-// line 553 "src/json/ext/Parser.rl"
-
- if (cs >= JSON_string_first_final && result != null) {
- return new ParserResult(result, p + 1);
- } else {
- return null;
- }
- }
-
-
-// line 1393 "src/json/ext/Parser.java"
-private static byte[] init__JSON_array_actions_0()
-{
- return new byte [] {
- 0, 1, 0, 1, 1
- };
-}
-
-private static final byte _JSON_array_actions[] = init__JSON_array_actions_0();
-
-
-private static byte[] init__JSON_array_key_offsets_0()
-{
- return new byte [] {
- 0, 0, 1, 18, 25, 41, 43, 44, 46, 47, 49, 50,
- 52, 53, 55, 56, 58, 59
- };
-}
-
-private static final byte _JSON_array_key_offsets[] = init__JSON_array_key_offsets_0();
-
-
-private static char[] init__JSON_array_trans_keys_0()
-{
- return new char [] {
- 91, 13, 32, 34, 45, 47, 73, 78, 91, 93, 102, 110,
- 116, 123, 9, 10, 48, 57, 13, 32, 44, 47, 93, 9,
- 10, 13, 32, 34, 45, 47, 73, 78, 91, 102, 110, 116,
- 123, 9, 10, 48, 57, 42, 47, 42, 42, 47, 10, 42,
- 47, 42, 42, 47, 10, 42, 47, 42, 42, 47, 10, 0
- };
-}
-
-private static final char _JSON_array_trans_keys[] = init__JSON_array_trans_keys_0();
-
-
-private static byte[] init__JSON_array_single_lengths_0()
-{
- return new byte [] {
- 0, 1, 13, 5, 12, 2, 1, 2, 1, 2, 1, 2,
- 1, 2, 1, 2, 1, 0
- };
-}
-
-private static final byte _JSON_array_single_lengths[] = init__JSON_array_single_lengths_0();
-
-
-private static byte[] init__JSON_array_range_lengths_0()
-{
- return new byte [] {
- 0, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0
- };
-}
-
-private static final byte _JSON_array_range_lengths[] = init__JSON_array_range_lengths_0();
-
-
-private static byte[] init__JSON_array_index_offsets_0()
-{
- return new byte [] {
- 0, 0, 2, 18, 25, 40, 43, 45, 48, 50, 53, 55,
- 58, 60, 63, 65, 68, 70
- };
-}
-
-private static final byte _JSON_array_index_offsets[] = init__JSON_array_index_offsets_0();
-
-
-private static byte[] init__JSON_array_indicies_0()
-{
- return new byte [] {
- 0, 1, 0, 0, 2, 2, 3, 2, 2, 2, 4, 2,
- 2, 2, 2, 0, 2, 1, 5, 5, 6, 7, 4, 5,
- 1, 6, 6, 2, 2, 8, 2, 2, 2, 2, 2, 2,
- 2, 6, 2, 1, 9, 10, 1, 11, 9, 11, 6, 9,
- 6, 10, 12, 13, 1, 14, 12, 14, 5, 12, 5, 13,
- 15, 16, 1, 17, 15, 17, 0, 15, 0, 16, 1, 0
- };
-}
-
-private static final byte _JSON_array_indicies[] = init__JSON_array_indicies_0();
-
-
-private static byte[] init__JSON_array_trans_targs_0()
-{
- return new byte [] {
- 2, 0, 3, 13, 17, 3, 4, 9, 5, 6, 8, 7,
- 10, 12, 11, 14, 16, 15
- };
-}
-
-private static final byte _JSON_array_trans_targs[] = init__JSON_array_trans_targs_0();
-
-
-private static byte[] init__JSON_array_trans_actions_0()
-{
- return new byte [] {
- 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0
- };
-}
-
-private static final byte _JSON_array_trans_actions[] = init__JSON_array_trans_actions_0();
-
-
-static final int JSON_array_start = 1;
-static final int JSON_array_first_final = 17;
-static final int JSON_array_error = 0;
-
-static final int JSON_array_en_main = 1;
-
-
-// line 594 "src/json/ext/Parser.rl"
-
-
- ParserResult parseArray(int p, int pe) {
- int cs = EVIL;
-
- if (parser.maxNesting > 0 && currentNesting > parser.maxNesting) {
- throw newException(Utils.M_NESTING_ERROR,
- "nesting of " + currentNesting + " is too deep");
- }
-
- // this is guaranteed to be a RubyArray due to the earlier
- // allocator test at OptionsReader#getClass
- RubyArray result =
- (RubyArray)parser.arrayClass.newInstance(context,
- IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
-
-
-// line 1524 "src/json/ext/Parser.java"
- {
- cs = JSON_array_start;
- }
-
-// line 611 "src/json/ext/Parser.rl"
-
-// line 1531 "src/json/ext/Parser.java"
- {
- int _klen;
- int _trans = 0;
- int _acts;
- int _nacts;
- int _keys;
- int _goto_targ = 0;
-
- _goto: while (true) {
- switch ( _goto_targ ) {
- case 0:
- if ( p == pe ) {
- _goto_targ = 4;
- continue _goto;
- }
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
-case 1:
- _match: do {
- _keys = _JSON_array_key_offsets[cs];
- _trans = _JSON_array_index_offsets[cs];
- _klen = _JSON_array_single_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + _klen - 1;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + ((_upper-_lower) >> 1);
- if ( data[p] < _JSON_array_trans_keys[_mid] )
- _upper = _mid - 1;
- else if ( data[p] > _JSON_array_trans_keys[_mid] )
- _lower = _mid + 1;
- else {
- _trans += (_mid - _keys);
- break _match;
- }
- }
- _keys += _klen;
- _trans += _klen;
- }
-
- _klen = _JSON_array_range_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + (_klen<<1) - 2;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + (((_upper-_lower) >> 1) & ~1);
- if ( data[p] < _JSON_array_trans_keys[_mid] )
- _upper = _mid - 2;
- else if ( data[p] > _JSON_array_trans_keys[_mid+1] )
- _lower = _mid + 2;
- else {
- _trans += ((_mid - _keys)>>1);
- break _match;
- }
- }
- _trans += _klen;
- }
- } while (false);
-
- _trans = _JSON_array_indicies[_trans];
- cs = _JSON_array_trans_targs[_trans];
-
- if ( _JSON_array_trans_actions[_trans] != 0 ) {
- _acts = _JSON_array_trans_actions[_trans];
- _nacts = (int) _JSON_array_actions[_acts++];
- while ( _nacts-- > 0 )
- {
- switch ( _JSON_array_actions[_acts++] )
- {
- case 0:
-// line 567 "src/json/ext/Parser.rl"
- {
- ParserResult res = parseValue(p, pe);
- if (res == null) {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- } else {
- result.append(res.result);
- {p = (( res.p))-1;}
- }
- }
- break;
- case 1:
-// line 578 "src/json/ext/Parser.rl"
- {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- }
- break;
-// line 1631 "src/json/ext/Parser.java"
- }
- }
- }
-
-case 2:
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
- if ( ++p != pe ) {
- _goto_targ = 1;
- continue _goto;
- }
-case 4:
-case 5:
- }
- break; }
- }
-
-// line 612 "src/json/ext/Parser.rl"
-
- if (cs >= JSON_array_first_final) {
- return new ParserResult(result, p + 1);
- } else {
- throw unexpectedToken(p, pe);
- }
- }
-
-
-// line 1661 "src/json/ext/Parser.java"
-private static byte[] init__JSON_object_actions_0()
-{
- return new byte [] {
- 0, 1, 0, 1, 1, 1, 2
- };
-}
-
-private static final byte _JSON_object_actions[] = init__JSON_object_actions_0();
-
-
-private static byte[] init__JSON_object_key_offsets_0()
-{
- return new byte [] {
- 0, 0, 1, 8, 14, 16, 17, 19, 20, 36, 43, 49,
- 51, 52, 54, 55, 57, 58, 60, 61, 63, 64, 66, 67,
- 69, 70, 72, 73
- };
-}
-
-private static final byte _JSON_object_key_offsets[] = init__JSON_object_key_offsets_0();
-
-
-private static char[] init__JSON_object_trans_keys_0()
-{
- return new char [] {
- 123, 13, 32, 34, 47, 125, 9, 10, 13, 32, 47, 58,
- 9, 10, 42, 47, 42, 42, 47, 10, 13, 32, 34, 45,
- 47, 73, 78, 91, 102, 110, 116, 123, 9, 10, 48, 57,
- 13, 32, 44, 47, 125, 9, 10, 13, 32, 34, 47, 9,
- 10, 42, 47, 42, 42, 47, 10, 42, 47, 42, 42, 47,
- 10, 42, 47, 42, 42, 47, 10, 42, 47, 42, 42, 47,
- 10, 0
- };
-}
-
-private static final char _JSON_object_trans_keys[] = init__JSON_object_trans_keys_0();
-
-
-private static byte[] init__JSON_object_single_lengths_0()
-{
- return new byte [] {
- 0, 1, 5, 4, 2, 1, 2, 1, 12, 5, 4, 2,
- 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
- 1, 2, 1, 0
- };
-}
-
-private static final byte _JSON_object_single_lengths[] = init__JSON_object_single_lengths_0();
-
-
-private static byte[] init__JSON_object_range_lengths_0()
-{
- return new byte [] {
- 0, 0, 1, 1, 0, 0, 0, 0, 2, 1, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0
- };
-}
-
-private static final byte _JSON_object_range_lengths[] = init__JSON_object_range_lengths_0();
-
-
-private static byte[] init__JSON_object_index_offsets_0()
-{
- return new byte [] {
- 0, 0, 2, 9, 15, 18, 20, 23, 25, 40, 47, 53,
- 56, 58, 61, 63, 66, 68, 71, 73, 76, 78, 81, 83,
- 86, 88, 91, 93
- };
-}
-
-private static final byte _JSON_object_index_offsets[] = init__JSON_object_index_offsets_0();
-
-
-private static byte[] init__JSON_object_indicies_0()
-{
- return new byte [] {
- 0, 1, 0, 0, 2, 3, 4, 0, 1, 5, 5, 6,
- 7, 5, 1, 8, 9, 1, 10, 8, 10, 5, 8, 5,
- 9, 7, 7, 11, 11, 12, 11, 11, 11, 11, 11, 11,
- 11, 7, 11, 1, 13, 13, 14, 15, 4, 13, 1, 14,
- 14, 2, 16, 14, 1, 17, 18, 1, 19, 17, 19, 14,
- 17, 14, 18, 20, 21, 1, 22, 20, 22, 13, 20, 13,
- 21, 23, 24, 1, 25, 23, 25, 7, 23, 7, 24, 26,
- 27, 1, 28, 26, 28, 0, 26, 0, 27, 1, 0
- };
-}
-
-private static final byte _JSON_object_indicies[] = init__JSON_object_indicies_0();
-
-
-private static byte[] init__JSON_object_trans_targs_0()
-{
- return new byte [] {
- 2, 0, 3, 23, 27, 3, 4, 8, 5, 7, 6, 9,
- 19, 9, 10, 15, 11, 12, 14, 13, 16, 18, 17, 20,
- 22, 21, 24, 26, 25
- };
-}
-
-private static final byte _JSON_object_trans_targs[] = init__JSON_object_trans_targs_0();
-
-
-private static byte[] init__JSON_object_trans_actions_0()
-{
- return new byte [] {
- 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0
- };
-}
-
-private static final byte _JSON_object_trans_actions[] = init__JSON_object_trans_actions_0();
-
-
-static final int JSON_object_start = 1;
-static final int JSON_object_first_final = 27;
-static final int JSON_object_error = 0;
-
-static final int JSON_object_en_main = 1;
-
-
-// line 668 "src/json/ext/Parser.rl"
-
-
- ParserResult parseObject(int p, int pe) {
- int cs = EVIL;
- IRubyObject lastName = null;
-
- if (parser.maxNesting > 0 && currentNesting > parser.maxNesting) {
- throw newException(Utils.M_NESTING_ERROR,
- "nesting of " + currentNesting + " is too deep");
- }
-
- // this is guaranteed to be a RubyHash due to the earlier
- // allocator test at OptionsReader#getClass
- RubyHash result =
- (RubyHash)parser.objectClass.newInstance(context,
- IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
-
-
-// line 1803 "src/json/ext/Parser.java"
- {
- cs = JSON_object_start;
- }
-
-// line 686 "src/json/ext/Parser.rl"
-
-// line 1810 "src/json/ext/Parser.java"
- {
- int _klen;
- int _trans = 0;
- int _acts;
- int _nacts;
- int _keys;
- int _goto_targ = 0;
-
- _goto: while (true) {
- switch ( _goto_targ ) {
- case 0:
- if ( p == pe ) {
- _goto_targ = 4;
- continue _goto;
- }
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
-case 1:
- _match: do {
- _keys = _JSON_object_key_offsets[cs];
- _trans = _JSON_object_index_offsets[cs];
- _klen = _JSON_object_single_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + _klen - 1;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + ((_upper-_lower) >> 1);
- if ( data[p] < _JSON_object_trans_keys[_mid] )
- _upper = _mid - 1;
- else if ( data[p] > _JSON_object_trans_keys[_mid] )
- _lower = _mid + 1;
- else {
- _trans += (_mid - _keys);
- break _match;
- }
- }
- _keys += _klen;
- _trans += _klen;
- }
-
- _klen = _JSON_object_range_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + (_klen<<1) - 2;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + (((_upper-_lower) >> 1) & ~1);
- if ( data[p] < _JSON_object_trans_keys[_mid] )
- _upper = _mid - 2;
- else if ( data[p] > _JSON_object_trans_keys[_mid+1] )
- _lower = _mid + 2;
- else {
- _trans += ((_mid - _keys)>>1);
- break _match;
- }
- }
- _trans += _klen;
- }
- } while (false);
-
- _trans = _JSON_object_indicies[_trans];
- cs = _JSON_object_trans_targs[_trans];
-
- if ( _JSON_object_trans_actions[_trans] != 0 ) {
- _acts = _JSON_object_trans_actions[_trans];
- _nacts = (int) _JSON_object_actions[_acts++];
- while ( _nacts-- > 0 )
- {
- switch ( _JSON_object_actions[_acts++] )
- {
- case 0:
-// line 626 "src/json/ext/Parser.rl"
- {
- ParserResult res = parseValue(p, pe);
- if (res == null) {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- } else {
- result.op_aset(context, lastName, res.result);
- {p = (( res.p))-1;}
- }
- }
- break;
- case 1:
-// line 637 "src/json/ext/Parser.rl"
- {
- ParserResult res = parseString(p, pe);
- if (res == null) {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- } else {
- RubyString name = (RubyString)res.result;
- if (parser.symbolizeNames) {
- lastName = context.getRuntime().is1_9()
- ? name.intern19()
- : name.intern();
- } else {
- lastName = name;
- }
- {p = (( res.p))-1;}
- }
- }
- break;
- case 2:
-// line 655 "src/json/ext/Parser.rl"
- {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- }
- break;
-// line 1930 "src/json/ext/Parser.java"
- }
- }
- }
-
-case 2:
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
- if ( ++p != pe ) {
- _goto_targ = 1;
- continue _goto;
- }
-case 4:
-case 5:
- }
- break; }
- }
-
-// line 687 "src/json/ext/Parser.rl"
-
- if (cs < JSON_object_first_final) {
- return null;
- }
-
- IRubyObject returnedResult = result;
-
- // attempt to de-serialize object
- if (parser.createId != null) {
- IRubyObject vKlassName = result.op_aref(context, parser.createId);
- if (!vKlassName.isNil()) {
- // might throw ArgumentError, we let it propagate
- IRubyObject klass = parser.info.jsonModule.
- callMethod(context, "deep_const_get", vKlassName);
- if (klass.respondsTo("json_creatable?") &&
- klass.callMethod(context, "json_creatable?").isTrue()) {
-
- returnedResult = klass.callMethod(context, "json_create", result);
- }
- }
- }
- return new ParserResult(returnedResult, p + 1);
- }
-
-
-// line 1976 "src/json/ext/Parser.java"
-private static byte[] init__JSON_actions_0()
-{
- return new byte [] {
- 0, 1, 0, 1, 1
- };
-}
-
-private static final byte _JSON_actions[] = init__JSON_actions_0();
-
-
-private static byte[] init__JSON_key_offsets_0()
-{
- return new byte [] {
- 0, 0, 7, 9, 10, 12, 13, 15, 16, 18, 19
- };
-}
-
-private static final byte _JSON_key_offsets[] = init__JSON_key_offsets_0();
-
-
-private static char[] init__JSON_trans_keys_0()
-{
- return new char [] {
- 13, 32, 47, 91, 123, 9, 10, 42, 47, 42, 42, 47,
- 10, 42, 47, 42, 42, 47, 10, 13, 32, 47, 9, 10,
- 0
- };
-}
-
-private static final char _JSON_trans_keys[] = init__JSON_trans_keys_0();
-
-
-private static byte[] init__JSON_single_lengths_0()
-{
- return new byte [] {
- 0, 5, 2, 1, 2, 1, 2, 1, 2, 1, 3
- };
-}
-
-private static final byte _JSON_single_lengths[] = init__JSON_single_lengths_0();
-
-
-private static byte[] init__JSON_range_lengths_0()
-{
- return new byte [] {
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
- };
-}
-
-private static final byte _JSON_range_lengths[] = init__JSON_range_lengths_0();
-
-
-private static byte[] init__JSON_index_offsets_0()
-{
- return new byte [] {
- 0, 0, 7, 10, 12, 15, 17, 20, 22, 25, 27
- };
-}
-
-private static final byte _JSON_index_offsets[] = init__JSON_index_offsets_0();
-
-
-private static byte[] init__JSON_indicies_0()
-{
- return new byte [] {
- 0, 0, 2, 3, 4, 0, 1, 5, 6, 1, 7, 5,
- 7, 0, 5, 0, 6, 8, 9, 1, 10, 8, 10, 11,
- 8, 11, 9, 11, 11, 12, 11, 1, 0
- };
-}
-
-private static final byte _JSON_indicies[] = init__JSON_indicies_0();
-
-
-private static byte[] init__JSON_trans_targs_0()
-{
- return new byte [] {
- 1, 0, 2, 10, 10, 3, 5, 4, 7, 9, 8, 10,
- 6
- };
-}
-
-private static final byte _JSON_trans_targs[] = init__JSON_trans_targs_0();
-
-
-private static byte[] init__JSON_trans_actions_0()
-{
- return new byte [] {
- 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0,
- 0
- };
-}
-
-private static final byte _JSON_trans_actions[] = init__JSON_trans_actions_0();
-
-
-static final int JSON_start = 1;
-static final int JSON_first_final = 10;
-static final int JSON_error = 0;
-
-static final int JSON_en_main = 1;
-
-
-// line 745 "src/json/ext/Parser.rl"
-
-
- public IRubyObject parse() {
- int cs = EVIL;
- int p, pe;
- IRubyObject result = null;
-
-
-// line 2089 "src/json/ext/Parser.java"
- {
- cs = JSON_start;
- }
-
-// line 753 "src/json/ext/Parser.rl"
- p = byteList.begin();
- pe = p + byteList.length();
-
-// line 2098 "src/json/ext/Parser.java"
- {
- int _klen;
- int _trans = 0;
- int _acts;
- int _nacts;
- int _keys;
- int _goto_targ = 0;
-
- _goto: while (true) {
- switch ( _goto_targ ) {
- case 0:
- if ( p == pe ) {
- _goto_targ = 4;
- continue _goto;
- }
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
-case 1:
- _match: do {
- _keys = _JSON_key_offsets[cs];
- _trans = _JSON_index_offsets[cs];
- _klen = _JSON_single_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + _klen - 1;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + ((_upper-_lower) >> 1);
- if ( data[p] < _JSON_trans_keys[_mid] )
- _upper = _mid - 1;
- else if ( data[p] > _JSON_trans_keys[_mid] )
- _lower = _mid + 1;
- else {
- _trans += (_mid - _keys);
- break _match;
- }
- }
- _keys += _klen;
- _trans += _klen;
- }
-
- _klen = _JSON_range_lengths[cs];
- if ( _klen > 0 ) {
- int _lower = _keys;
- int _mid;
- int _upper = _keys + (_klen<<1) - 2;
- while (true) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + (((_upper-_lower) >> 1) & ~1);
- if ( data[p] < _JSON_trans_keys[_mid] )
- _upper = _mid - 2;
- else if ( data[p] > _JSON_trans_keys[_mid+1] )
- _lower = _mid + 2;
- else {
- _trans += ((_mid - _keys)>>1);
- break _match;
- }
- }
- _trans += _klen;
- }
- } while (false);
-
- _trans = _JSON_indicies[_trans];
- cs = _JSON_trans_targs[_trans];
-
- if ( _JSON_trans_actions[_trans] != 0 ) {
- _acts = _JSON_trans_actions[_trans];
- _nacts = (int) _JSON_actions[_acts++];
- while ( _nacts-- > 0 )
- {
- switch ( _JSON_actions[_acts++] )
- {
- case 0:
-// line 717 "src/json/ext/Parser.rl"
- {
- currentNesting = 1;
- ParserResult res = parseObject(p, pe);
- if (res == null) {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- } else {
- result = res.result;
- {p = (( res.p))-1;}
- }
- }
- break;
- case 1:
-// line 729 "src/json/ext/Parser.rl"
- {
- currentNesting = 1;
- ParserResult res = parseArray(p, pe);
- if (res == null) {
- p--;
- { p += 1; _goto_targ = 5; if (true) continue _goto;}
- } else {
- result = res.result;
- {p = (( res.p))-1;}
- }
- }
- break;
-// line 2206 "src/json/ext/Parser.java"
- }
- }
- }
-
-case 2:
- if ( cs == 0 ) {
- _goto_targ = 5;
- continue _goto;
- }
- if ( ++p != pe ) {
- _goto_targ = 1;
- continue _goto;
- }
-case 4:
-case 5:
- }
- break; }
- }
-
-// line 756 "src/json/ext/Parser.rl"
-
- if (cs >= JSON_first_final && p == pe) {
- return result;
- } else {
- throw unexpectedToken(p, pe);
- }
- }
-
- /**
- * Returns a subsequence of the source ByteList, based on source
- * array byte offsets (i.e., the ByteList's own begin offset is not
- * automatically added).
- * @param start
- * @param end
- */
- private ByteList absSubSequence(int absStart, int absEnd) {
- int offset = byteList.begin();
- return (ByteList)byteList.subSequence(absStart - offset,
- absEnd - offset);
- }
-
- /**
- * Retrieves a constant directly descended from the <code>JSON</code> module.
- * @param name The constant name
- */
- private IRubyObject getConstant(String name) {
- return parser.info.jsonModule.getConstant(name);
- }
-
- private RaiseException newException(String className, String message) {
- return Utils.newException(context, className, message);
- }
-
- private RaiseException newException(String className, RubyString message) {
- return Utils.newException(context, className, message);
- }
-
- private RaiseException newException(String className,
- String messageBegin, ByteList messageEnd) {
- return newException(className,
- getRuntime().newString(messageBegin).cat(messageEnd));
- }
- }
-}