json 1.5.3 → 1.5.4
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of json might be problematic. Click here for more details.
- data/CHANGES +8 -0
- data/Gemfile +3 -5
- data/Rakefile +34 -5
- data/VERSION +1 -1
- data/bin/prettify_json.rb +12 -39
- data/ext/json/ext/generator/generator.c +62 -22
- data/ext/json/ext/generator/generator.h +5 -2
- data/ext/json/ext/parser/parser.c +496 -285
- data/ext/json/ext/parser/parser.h +5 -1
- data/ext/json/ext/parser/parser.rl +155 -81
- data/java/src/json/ext/Generator.java +5 -5
- data/java/src/json/ext/GeneratorMethods.java +8 -7
- data/java/src/json/ext/GeneratorService.java +5 -4
- data/java/src/json/ext/GeneratorState.java +44 -16
- data/java/src/json/ext/OptionsReader.java +3 -3
- data/java/src/json/ext/Parser.java +399 -117
- data/java/src/json/ext/Parser.rl +118 -38
- data/java/src/json/ext/ParserService.java +4 -3
- data/java/src/json/ext/RuntimeInfo.java +23 -21
- data/java/src/json/ext/Utils.java +2 -2
- data/json.gemspec +17 -17
- data/json_pure.gemspec +22 -16
- data/lib/json.rb +7 -7
- data/lib/json/add/complex.rb +22 -0
- data/lib/json/add/core.rb +9 -9
- data/lib/json/add/rational.rb +22 -0
- data/lib/json/common.rb +50 -38
- data/lib/json/editor.rb +16 -16
- data/lib/json/ext.rb +2 -15
- data/lib/json/pure/generator.rb +18 -3
- data/lib/json/pure/parser.rb +92 -58
- data/lib/json/version.rb +1 -1
- data/tests/test_json.rb +52 -1
- data/tests/test_json_addition.rb +9 -2
- data/tests/test_json_generate.rb +34 -1
- data/tools/fuzz.rb +1 -1
- metadata +50 -52
- data/lib/json/add/rails.rb +0 -8
@@ -1,11 +1,12 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
|
-
*
|
3
|
+
*
|
4
4
|
* Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
|
5
5
|
* for details.
|
6
6
|
*/
|
7
7
|
package json.ext;
|
8
8
|
|
9
|
+
import java.lang.ref.WeakReference;
|
9
10
|
import org.jruby.Ruby;
|
10
11
|
import org.jruby.RubyArray;
|
11
12
|
import org.jruby.RubyBoolean;
|
@@ -24,7 +25,7 @@ import org.jruby.util.ByteList;
|
|
24
25
|
/**
|
25
26
|
* A class that populates the
|
26
27
|
* <code>Json::Ext::Generator::GeneratorMethods</code> module.
|
27
|
-
*
|
28
|
+
*
|
28
29
|
* @author mernen
|
29
30
|
*/
|
30
31
|
class GeneratorMethods {
|
@@ -45,9 +46,9 @@ class GeneratorMethods {
|
|
45
46
|
defineMethods(module, "String", RbString.class);
|
46
47
|
defineMethods(module, "TrueClass", RbTrue.class);
|
47
48
|
|
48
|
-
info.stringExtendModule = module.defineModuleUnder("String")
|
49
|
-
.defineModuleUnder("Extend");
|
50
|
-
info.stringExtendModule.defineAnnotatedMethods(StringExtend.class);
|
49
|
+
info.stringExtendModule = new WeakReference<RubyModule>(module.defineModuleUnder("String")
|
50
|
+
.defineModuleUnder("Extend"));
|
51
|
+
info.stringExtendModule.get().defineAnnotatedMethods(StringExtend.class);
|
51
52
|
}
|
52
53
|
|
53
54
|
/**
|
@@ -140,7 +141,7 @@ class GeneratorMethods {
|
|
140
141
|
RubyHash result = RubyHash.newHash(runtime);
|
141
142
|
|
142
143
|
IRubyObject createId = RuntimeInfo.forRuntime(runtime)
|
143
|
-
.jsonModule.callMethod(context, "create_id");
|
144
|
+
.jsonModule.get().callMethod(context, "create_id");
|
144
145
|
result.op_aset(context, createId, self.getMetaClass().to_s());
|
145
146
|
|
146
147
|
ByteList bl = self.getByteList();
|
@@ -158,7 +159,7 @@ class GeneratorMethods {
|
|
158
159
|
public static IRubyObject included(ThreadContext context,
|
159
160
|
IRubyObject vSelf, IRubyObject module) {
|
160
161
|
RuntimeInfo info = RuntimeInfo.forRuntime(context.getRuntime());
|
161
|
-
return module.callMethod(context, "extend", info.stringExtendModule);
|
162
|
+
return module.callMethod(context, "extend", info.stringExtendModule.get());
|
162
163
|
}
|
163
164
|
}
|
164
165
|
|
@@ -1,12 +1,13 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
|
-
*
|
3
|
+
*
|
4
4
|
* Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
|
5
5
|
* for details.
|
6
6
|
*/
|
7
7
|
package json.ext;
|
8
8
|
|
9
9
|
import java.io.IOException;
|
10
|
+
import java.lang.ref.WeakReference;
|
10
11
|
|
11
12
|
import org.jruby.Ruby;
|
12
13
|
import org.jruby.RubyClass;
|
@@ -23,15 +24,15 @@ public class GeneratorService implements BasicLibraryService {
|
|
23
24
|
runtime.getLoadService().require("json/common");
|
24
25
|
RuntimeInfo info = RuntimeInfo.initRuntime(runtime);
|
25
26
|
|
26
|
-
info.jsonModule = runtime.defineModule("JSON");
|
27
|
-
RubyModule jsonExtModule = info.jsonModule.defineModuleUnder("Ext");
|
27
|
+
info.jsonModule = new WeakReference<RubyModule>(runtime.defineModule("JSON"));
|
28
|
+
RubyModule jsonExtModule = info.jsonModule.get().defineModuleUnder("Ext");
|
28
29
|
RubyModule generatorModule = jsonExtModule.defineModuleUnder("Generator");
|
29
30
|
|
30
31
|
RubyClass stateClass =
|
31
32
|
generatorModule.defineClassUnder("State", runtime.getObject(),
|
32
33
|
GeneratorState.ALLOCATOR);
|
33
34
|
stateClass.defineAnnotatedMethods(GeneratorState.class);
|
34
|
-
info.generatorStateClass = stateClass;
|
35
|
+
info.generatorStateClass = new WeakReference<RubyClass>(stateClass);
|
35
36
|
|
36
37
|
RubyModule generatorMethods =
|
37
38
|
generatorModule.defineModuleUnder("GeneratorMethods");
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
|
-
*
|
3
|
+
*
|
4
4
|
* Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
|
5
5
|
* for details.
|
6
6
|
*/
|
@@ -24,10 +24,10 @@ import org.jruby.util.ByteList;
|
|
24
24
|
|
25
25
|
/**
|
26
26
|
* The <code>JSON::Ext::Generator::State</code> class.
|
27
|
-
*
|
27
|
+
*
|
28
28
|
* <p>This class is used to create State instances, that are use to hold data
|
29
29
|
* while generating a JSON text from a a Ruby data structure.
|
30
|
-
*
|
30
|
+
*
|
31
31
|
* @author mernen
|
32
32
|
*/
|
33
33
|
public class GeneratorState extends RubyObject {
|
@@ -72,10 +72,17 @@ public class GeneratorState extends RubyObject {
|
|
72
72
|
private boolean allowNaN = DEFAULT_ALLOW_NAN;
|
73
73
|
static final boolean DEFAULT_ALLOW_NAN = false;
|
74
74
|
/**
|
75
|
-
*
|
75
|
+
* If set to <code>true</code> all JSON documents generated do not contain
|
76
|
+
* any other characters than ASCII characters.
|
76
77
|
*/
|
77
78
|
private boolean asciiOnly = DEFAULT_ASCII_ONLY;
|
78
79
|
static final boolean DEFAULT_ASCII_ONLY = false;
|
80
|
+
/**
|
81
|
+
* If set to <code>true</code> all JSON values generated might not be
|
82
|
+
* RFC-conform JSON documents.
|
83
|
+
*/
|
84
|
+
private boolean quirksMode = DEFAULT_QUIRKS_MODE;
|
85
|
+
static final boolean DEFAULT_QUIRKS_MODE = false;
|
79
86
|
|
80
87
|
/**
|
81
88
|
* The current depth (inside a #to_json call)
|
@@ -94,7 +101,7 @@ public class GeneratorState extends RubyObject {
|
|
94
101
|
|
95
102
|
/**
|
96
103
|
* <code>State.from_state(opts)</code>
|
97
|
-
*
|
104
|
+
*
|
98
105
|
* <p>Creates a State object from <code>opts</code>, which ought to be
|
99
106
|
* {@link RubyHash Hash} to create a new <code>State</code> instance
|
100
107
|
* configured by <codes>opts</code>, something else to create an
|
@@ -118,7 +125,7 @@ public class GeneratorState extends RubyObject {
|
|
118
125
|
|
119
126
|
static GeneratorState fromState(ThreadContext context, RuntimeInfo info,
|
120
127
|
IRubyObject opts) {
|
121
|
-
RubyClass klass = info.generatorStateClass;
|
128
|
+
RubyClass klass = info.generatorStateClass.get();
|
122
129
|
if (opts != null) {
|
123
130
|
// if the given parameter is a Generator::State, return itself
|
124
131
|
if (klass.isInstance(opts)) return (GeneratorState)opts;
|
@@ -136,11 +143,11 @@ public class GeneratorState extends RubyObject {
|
|
136
143
|
|
137
144
|
/**
|
138
145
|
* <code>State#initialize(opts = {})</code>
|
139
|
-
*
|
146
|
+
*
|
140
147
|
* Instantiates a new <code>State</code> object, configured by <code>opts</code>.
|
141
|
-
*
|
148
|
+
*
|
142
149
|
* <code>opts</code> can have the following keys:
|
143
|
-
*
|
150
|
+
*
|
144
151
|
* <dl>
|
145
152
|
* <dt><code>:indent</code>
|
146
153
|
* <dd>a {@link RubyString String} used to indent levels (default: <code>""</code>)
|
@@ -151,7 +158,7 @@ public class GeneratorState extends RubyObject {
|
|
151
158
|
* <dd>a String that is put before a <code>":"</code> pair delimiter
|
152
159
|
* (default: <code>""</code>)
|
153
160
|
* <dt><code>:object_nl</code>
|
154
|
-
* <dd>a String that is put at the end of a JSON object (default: <code>""</code>)
|
161
|
+
* <dd>a String that is put at the end of a JSON object (default: <code>""</code>)
|
155
162
|
* <dt><code>:array_nl</code>
|
156
163
|
* <dd>a String that is put at the end of a JSON array (default: <code>""</code>)
|
157
164
|
* <dt><code>:allow_nan</code>
|
@@ -181,17 +188,20 @@ public class GeneratorState extends RubyObject {
|
|
181
188
|
this.maxNesting = orig.maxNesting;
|
182
189
|
this.allowNaN = orig.allowNaN;
|
183
190
|
this.asciiOnly = orig.asciiOnly;
|
191
|
+
this.quirksMode = orig.quirksMode;
|
184
192
|
this.depth = orig.depth;
|
185
193
|
return this;
|
186
194
|
}
|
187
195
|
|
188
196
|
/**
|
189
|
-
*
|
197
|
+
* Generates a valid JSON document from object <code>obj</code> and returns
|
198
|
+
* the result. If no valid JSON document can be created this method raises
|
199
|
+
* a GeneratorError exception.
|
190
200
|
*/
|
191
201
|
@JRubyMethod
|
192
202
|
public IRubyObject generate(ThreadContext context, IRubyObject obj) {
|
193
203
|
RubyString result = Generator.generateJson(context, obj, this);
|
194
|
-
if (!objectOrArrayLiteral(result)) {
|
204
|
+
if (!quirksMode && !objectOrArrayLiteral(result)) {
|
195
205
|
throw Utils.newException(context, Utils.M_GENERATOR_ERROR,
|
196
206
|
"only generation of JSON objects or arrays allowed");
|
197
207
|
}
|
@@ -364,6 +374,22 @@ public class GeneratorState extends RubyObject {
|
|
364
374
|
return context.getRuntime().newBoolean(asciiOnly);
|
365
375
|
}
|
366
376
|
|
377
|
+
@JRubyMethod(name="quirks_mode")
|
378
|
+
public RubyBoolean quirks_mode_get(ThreadContext context) {
|
379
|
+
return context.getRuntime().newBoolean(quirksMode);
|
380
|
+
}
|
381
|
+
|
382
|
+
@JRubyMethod(name="quirks_mode=")
|
383
|
+
public IRubyObject quirks_mode_set(IRubyObject quirks_mode) {
|
384
|
+
quirksMode = quirks_mode.isTrue();
|
385
|
+
return quirks_mode.getRuntime().newBoolean(quirksMode);
|
386
|
+
}
|
387
|
+
|
388
|
+
@JRubyMethod(name="quirks_mode?")
|
389
|
+
public RubyBoolean quirks_mode_p(ThreadContext context) {
|
390
|
+
return context.getRuntime().newBoolean(quirksMode);
|
391
|
+
}
|
392
|
+
|
367
393
|
public int getDepth() {
|
368
394
|
return depth;
|
369
395
|
}
|
@@ -382,15 +408,15 @@ public class GeneratorState extends RubyObject {
|
|
382
408
|
private ByteList prepareByteList(ThreadContext context, IRubyObject value) {
|
383
409
|
RubyString str = value.convertToString();
|
384
410
|
RuntimeInfo info = RuntimeInfo.forRuntime(context.getRuntime());
|
385
|
-
if (info.encodingsSupported() && str.encoding(context) != info.utf8) {
|
386
|
-
str = (RubyString)str.encode(context, info.utf8);
|
411
|
+
if (info.encodingsSupported() && str.encoding(context) != info.utf8.get()) {
|
412
|
+
str = (RubyString)str.encode(context, info.utf8.get());
|
387
413
|
}
|
388
414
|
return str.getByteList().dup();
|
389
415
|
}
|
390
416
|
|
391
417
|
/**
|
392
418
|
* <code>State#configure(opts)</code>
|
393
|
-
*
|
419
|
+
*
|
394
420
|
* <p>Configures this State instance with the {@link RubyHash Hash}
|
395
421
|
* <code>opts</code>, and returns itself.
|
396
422
|
* @param vOpts The options hash
|
@@ -418,6 +444,7 @@ public class GeneratorState extends RubyObject {
|
|
418
444
|
maxNesting = opts.getInt("max_nesting", DEFAULT_MAX_NESTING);
|
419
445
|
allowNaN = opts.getBool("allow_nan", DEFAULT_ALLOW_NAN);
|
420
446
|
asciiOnly = opts.getBool("ascii_only", DEFAULT_ASCII_ONLY);
|
447
|
+
quirksMode = opts.getBool("quirks_mode", DEFAULT_QUIRKS_MODE);
|
421
448
|
|
422
449
|
depth = opts.getInt("depth", 0);
|
423
450
|
|
@@ -426,7 +453,7 @@ public class GeneratorState extends RubyObject {
|
|
426
453
|
|
427
454
|
/**
|
428
455
|
* <code>State#to_h()</code>
|
429
|
-
*
|
456
|
+
*
|
430
457
|
* <p>Returns the configuration instance variables as a hash, that can be
|
431
458
|
* passed to the configure method.
|
432
459
|
* @return
|
@@ -443,6 +470,7 @@ public class GeneratorState extends RubyObject {
|
|
443
470
|
result.op_aset(context, runtime.newSymbol("array_nl"), array_nl_get(context));
|
444
471
|
result.op_aset(context, runtime.newSymbol("allow_nan"), allow_nan_p(context));
|
445
472
|
result.op_aset(context, runtime.newSymbol("ascii_only"), ascii_only_p(context));
|
473
|
+
result.op_aset(context, runtime.newSymbol("quirks_mode"), quirks_mode_p(context));
|
446
474
|
result.op_aset(context, runtime.newSymbol("max_nesting"), max_nesting_get(context));
|
447
475
|
result.op_aset(context, runtime.newSymbol("depth"), depth_get(context));
|
448
476
|
return result;
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
3
|
-
*
|
3
|
+
*
|
4
4
|
* Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
|
5
5
|
* for details.
|
6
6
|
*/
|
@@ -84,8 +84,8 @@ final class OptionsReader {
|
|
84
84
|
|
85
85
|
RubyString str = value.convertToString();
|
86
86
|
RuntimeInfo info = getRuntimeInfo();
|
87
|
-
if (info.encodingsSupported() && str.encoding(context) != info.utf8) {
|
88
|
-
str = (RubyString)str.encode(context, info.utf8);
|
87
|
+
if (info.encodingsSupported() && str.encoding(context) != info.utf8.get()) {
|
88
|
+
str = (RubyString)str.encode(context, info.utf8.get());
|
89
89
|
}
|
90
90
|
return str;
|
91
91
|
}
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// line 1 "Parser.rl"
|
3
3
|
/*
|
4
4
|
* This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
|
5
|
-
*
|
5
|
+
*
|
6
6
|
* Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
|
7
7
|
* for details.
|
8
8
|
*/
|
@@ -31,16 +31,16 @@ import org.jruby.util.ByteList;
|
|
31
31
|
|
32
32
|
/**
|
33
33
|
* The <code>JSON::Ext::Parser</code> class.
|
34
|
-
*
|
34
|
+
*
|
35
35
|
* <p>This is the JSON parser implemented as a Java class. To use it as the
|
36
36
|
* standard parser, set
|
37
37
|
* <pre>JSON.parser = JSON::Ext::Parser</pre>
|
38
38
|
* This is performed for you when you <code>include "json/ext"</code>.
|
39
|
-
*
|
39
|
+
*
|
40
40
|
* <p>This class does not perform the actual parsing, just acts as an interface
|
41
41
|
* to Ruby code. When the {@link #parse()} method is invoked, a
|
42
42
|
* Parser.ParserSession object is instantiated, which handles the process.
|
43
|
-
*
|
43
|
+
*
|
44
44
|
* @author mernen
|
45
45
|
*/
|
46
46
|
public class Parser extends RubyObject {
|
@@ -51,6 +51,7 @@ public class Parser extends RubyObject {
|
|
51
51
|
private int maxNesting;
|
52
52
|
private boolean allowNaN;
|
53
53
|
private boolean symbolizeNames;
|
54
|
+
private boolean quirksMode;
|
54
55
|
private RubyClass objectClass;
|
55
56
|
private RubyClass arrayClass;
|
56
57
|
private RubyHash match_string;
|
@@ -71,7 +72,7 @@ public class Parser extends RubyObject {
|
|
71
72
|
|
72
73
|
/**
|
73
74
|
* Multiple-value return for internal parser methods.
|
74
|
-
*
|
75
|
+
*
|
75
76
|
* <p>All the <code>parse<var>Stuff</var></code> methods return instances of
|
76
77
|
* <code>ParserResult</code> when successful, or <code>null</code> when
|
77
78
|
* there's a problem with the input data.
|
@@ -100,18 +101,18 @@ public class Parser extends RubyObject {
|
|
100
101
|
|
101
102
|
/**
|
102
103
|
* <code>Parser.new(source, opts = {})</code>
|
103
|
-
*
|
104
|
+
*
|
104
105
|
* <p>Creates a new <code>JSON::Ext::Parser</code> instance for the string
|
105
106
|
* <code>source</code>.
|
106
107
|
* It will be configured by the <code>opts</code> Hash.
|
107
108
|
* <code>opts</code> can have the following keys:
|
108
|
-
*
|
109
|
+
*
|
109
110
|
* <dl>
|
110
111
|
* <dt><code>:max_nesting</code>
|
111
112
|
* <dd>The maximum depth of nesting allowed in the parsed data
|
112
113
|
* structures. Disable depth checking with <code>:max_nesting => false|nil|0</code>,
|
113
114
|
* it defaults to 19.
|
114
|
-
*
|
115
|
+
*
|
115
116
|
* <dt><code>:allow_nan</code>
|
116
117
|
* <dd>If set to <code>true</code>, allow <code>NaN</code>,
|
117
118
|
* <code>Infinity</code> and <code>-Infinity</code> in defiance of RFC 4627
|
@@ -120,15 +121,19 @@ public class Parser extends RubyObject {
|
|
120
121
|
* <dt><code>:symbolize_names</code>
|
121
122
|
* <dd>If set to <code>true</code>, returns symbols for the names (keys) in
|
122
123
|
* a JSON object. Otherwise strings are returned, which is also the default.
|
124
|
+
*
|
125
|
+
* <dt><code>:quirks_mode?</code>
|
126
|
+
* <dd>If set to <code>true</code>, if the parse is in quirks_mode, false
|
127
|
+
* otherwise.
|
123
128
|
*
|
124
129
|
* <dt><code>:create_additions</code>
|
125
130
|
* <dd>If set to <code>false</code>, the Parser doesn't create additions
|
126
131
|
* even if a matchin class and <code>create_id</code> was found. This option
|
127
132
|
* defaults to <code>true</code>.
|
128
|
-
*
|
133
|
+
*
|
129
134
|
* <dt><code>:object_class</code>
|
130
135
|
* <dd>Defaults to Hash.
|
131
|
-
*
|
136
|
+
*
|
132
137
|
* <dt><code>:array_class</code>
|
133
138
|
* <dd>Defaults to Array.
|
134
139
|
* </dl>
|
@@ -144,20 +149,25 @@ public class Parser extends RubyObject {
|
|
144
149
|
|
145
150
|
@JRubyMethod(required = 1, optional = 1, visibility = Visibility.PRIVATE)
|
146
151
|
public IRubyObject initialize(ThreadContext context, IRubyObject[] args) {
|
147
|
-
Ruby runtime
|
148
|
-
|
152
|
+
Ruby runtime = context.getRuntime();
|
153
|
+
if (this.vSource != null) {
|
154
|
+
throw runtime.newTypeError("already initialized instance");
|
155
|
+
}
|
149
156
|
|
150
157
|
OptionsReader opts = new OptionsReader(context, args.length > 1 ? args[1] : null);
|
151
158
|
this.maxNesting = opts.getInt("max_nesting", DEFAULT_MAX_NESTING);
|
152
159
|
this.allowNaN = opts.getBool("allow_nan", false);
|
153
160
|
this.symbolizeNames = opts.getBool("symbolize_names", false);
|
161
|
+
this.quirksMode = opts.getBool("quirks_mode", false);
|
154
162
|
this.createId = opts.getString("create_id", getCreateId(context));
|
155
163
|
this.createAdditions = opts.getBool("create_additions", true);
|
156
164
|
this.objectClass = opts.getClass("object_class", runtime.getHash());
|
157
165
|
this.arrayClass = opts.getClass("array_class", runtime.getArray());
|
158
166
|
this.match_string = opts.getHash("match_string");
|
159
167
|
|
160
|
-
this.vSource =
|
168
|
+
this.vSource = args[0].convertToString();
|
169
|
+
if (!quirksMode) this.vSource = convertEncoding(context, vSource);
|
170
|
+
|
161
171
|
return this;
|
162
172
|
}
|
163
173
|
|
@@ -176,8 +186,8 @@ public class Parser extends RubyObject {
|
|
176
186
|
|
177
187
|
if (info.encodingsSupported()) {
|
178
188
|
RubyEncoding encoding = (RubyEncoding)source.encoding(context);
|
179
|
-
if (encoding != info.ascii8bit) {
|
180
|
-
return (RubyString)source.encode(context, info.utf8);
|
189
|
+
if (encoding != info.ascii8bit.get()) {
|
190
|
+
return (RubyString)source.encode(context, info.utf8.get());
|
181
191
|
}
|
182
192
|
|
183
193
|
String sniffedEncoding = sniffByteList(bl);
|
@@ -188,7 +198,7 @@ public class Parser extends RubyObject {
|
|
188
198
|
String sniffedEncoding = sniffByteList(bl);
|
189
199
|
if (sniffedEncoding == null) return source; // assume UTF-8
|
190
200
|
Ruby runtime = context.getRuntime();
|
191
|
-
return (RubyString)info.jsonModule.
|
201
|
+
return (RubyString)info.jsonModule.get().
|
192
202
|
callMethod(context, "iconv",
|
193
203
|
new IRubyObject[] {
|
194
204
|
runtime.newString("utf-8"),
|
@@ -218,7 +228,7 @@ public class Parser extends RubyObject {
|
|
218
228
|
private RubyString reinterpretEncoding(ThreadContext context,
|
219
229
|
RubyString str, String sniffedEncoding) {
|
220
230
|
RubyEncoding actualEncoding = info.getEncoding(context, sniffedEncoding);
|
221
|
-
RubyEncoding targetEncoding = info.utf8;
|
231
|
+
RubyEncoding targetEncoding = info.utf8.get();
|
222
232
|
RubyString dup = (RubyString)str.dup();
|
223
233
|
dup.force_encoding(context, actualEncoding);
|
224
234
|
return (RubyString)dup.encode_bang(context, targetEncoding);
|
@@ -226,7 +236,7 @@ public class Parser extends RubyObject {
|
|
226
236
|
|
227
237
|
/**
|
228
238
|
* <code>Parser#parse()</code>
|
229
|
-
*
|
239
|
+
*
|
230
240
|
* <p>Parses the current JSON text <code>source</code> and returns the
|
231
241
|
* complete data structure as a result.
|
232
242
|
*/
|
@@ -237,13 +247,32 @@ public class Parser extends RubyObject {
|
|
237
247
|
|
238
248
|
/**
|
239
249
|
* <code>Parser#source()</code>
|
240
|
-
*
|
250
|
+
*
|
241
251
|
* <p>Returns a copy of the current <code>source</code> string, that was
|
242
252
|
* used to construct this Parser.
|
243
253
|
*/
|
244
254
|
@JRubyMethod(name = "source")
|
245
255
|
public IRubyObject source_get() {
|
246
|
-
return
|
256
|
+
return checkAndGetSource().dup();
|
257
|
+
}
|
258
|
+
|
259
|
+
/**
|
260
|
+
* <code>Parser#quirks_mode?()</code>
|
261
|
+
*
|
262
|
+
* <p>If set to <code>true</code>, if the parse is in quirks_mode, false
|
263
|
+
* otherwise.
|
264
|
+
*/
|
265
|
+
@JRubyMethod(name = "quirks_mode?")
|
266
|
+
public IRubyObject quirks_mode_p(ThreadContext context) {
|
267
|
+
return context.getRuntime().newBoolean(quirksMode);
|
268
|
+
}
|
269
|
+
|
270
|
+
public RubyString checkAndGetSource() {
|
271
|
+
if (vSource != null) {
|
272
|
+
return vSource;
|
273
|
+
} else {
|
274
|
+
throw getRuntime().newTypeError("uninitialized instance");
|
275
|
+
}
|
247
276
|
}
|
248
277
|
|
249
278
|
/**
|
@@ -251,13 +280,13 @@ public class Parser extends RubyObject {
|
|
251
280
|
* set to <code>nil</code> or <code>false</code>, and a String if not.
|
252
281
|
*/
|
253
282
|
private RubyString getCreateId(ThreadContext context) {
|
254
|
-
IRubyObject v = info.jsonModule.callMethod(context, "create_id");
|
283
|
+
IRubyObject v = info.jsonModule.get().callMethod(context, "create_id");
|
255
284
|
return v.isTrue() ? v.convertToString() : null;
|
256
285
|
}
|
257
286
|
|
258
287
|
/**
|
259
288
|
* A string parsing session.
|
260
|
-
*
|
289
|
+
*
|
261
290
|
* <p>Once a ParserSession is instantiated, the source string should not
|
262
291
|
* change until the parsing is complete. The ParserSession object assumes
|
263
292
|
* the source {@link RubyString} is still associated to its original
|
@@ -281,7 +310,7 @@ public class Parser extends RubyObject {
|
|
281
310
|
private ParserSession(Parser parser, ThreadContext context) {
|
282
311
|
this.parser = parser;
|
283
312
|
this.context = context;
|
284
|
-
this.byteList = parser.
|
313
|
+
this.byteList = parser.checkAndGetSource().getByteList();
|
285
314
|
this.data = byteList.unsafeBytes();
|
286
315
|
this.decoder = new StringDecoder(context);
|
287
316
|
}
|
@@ -298,11 +327,11 @@ public class Parser extends RubyObject {
|
|
298
327
|
}
|
299
328
|
|
300
329
|
|
301
|
-
// line
|
330
|
+
// line 353 "Parser.rl"
|
302
331
|
|
303
332
|
|
304
333
|
|
305
|
-
// line
|
334
|
+
// line 335 "Parser.java"
|
306
335
|
private static byte[] init__JSON_value_actions_0()
|
307
336
|
{
|
308
337
|
return new byte [] {
|
@@ -416,7 +445,7 @@ static final int JSON_value_error = 0;
|
|
416
445
|
static final int JSON_value_en_main = 1;
|
417
446
|
|
418
447
|
|
419
|
-
// line
|
448
|
+
// line 459 "Parser.rl"
|
420
449
|
|
421
450
|
|
422
451
|
ParserResult parseValue(int p, int pe) {
|
@@ -424,14 +453,14 @@ static final int JSON_value_en_main = 1;
|
|
424
453
|
IRubyObject result = null;
|
425
454
|
|
426
455
|
|
427
|
-
// line
|
456
|
+
// line 457 "Parser.java"
|
428
457
|
{
|
429
458
|
cs = JSON_value_start;
|
430
459
|
}
|
431
460
|
|
432
|
-
// line
|
461
|
+
// line 466 "Parser.rl"
|
433
462
|
|
434
|
-
// line
|
463
|
+
// line 464 "Parser.java"
|
435
464
|
{
|
436
465
|
int _klen;
|
437
466
|
int _trans = 0;
|
@@ -457,13 +486,13 @@ case 1:
|
|
457
486
|
while ( _nacts-- > 0 ) {
|
458
487
|
switch ( _JSON_value_actions[_acts++] ) {
|
459
488
|
case 9:
|
460
|
-
// line
|
489
|
+
// line 444 "Parser.rl"
|
461
490
|
{
|
462
491
|
p--;
|
463
492
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
464
493
|
}
|
465
494
|
break;
|
466
|
-
// line
|
495
|
+
// line 496 "Parser.java"
|
467
496
|
}
|
468
497
|
}
|
469
498
|
|
@@ -526,25 +555,25 @@ case 1:
|
|
526
555
|
switch ( _JSON_value_actions[_acts++] )
|
527
556
|
{
|
528
557
|
case 0:
|
529
|
-
// line
|
558
|
+
// line 361 "Parser.rl"
|
530
559
|
{
|
531
560
|
result = getRuntime().getNil();
|
532
561
|
}
|
533
562
|
break;
|
534
563
|
case 1:
|
535
|
-
// line
|
564
|
+
// line 364 "Parser.rl"
|
536
565
|
{
|
537
566
|
result = getRuntime().getFalse();
|
538
567
|
}
|
539
568
|
break;
|
540
569
|
case 2:
|
541
|
-
// line
|
570
|
+
// line 367 "Parser.rl"
|
542
571
|
{
|
543
572
|
result = getRuntime().getTrue();
|
544
573
|
}
|
545
574
|
break;
|
546
575
|
case 3:
|
547
|
-
// line
|
576
|
+
// line 370 "Parser.rl"
|
548
577
|
{
|
549
578
|
if (parser.allowNaN) {
|
550
579
|
result = getConstant(CONST_NAN);
|
@@ -554,7 +583,7 @@ case 1:
|
|
554
583
|
}
|
555
584
|
break;
|
556
585
|
case 4:
|
557
|
-
// line
|
586
|
+
// line 377 "Parser.rl"
|
558
587
|
{
|
559
588
|
if (parser.allowNaN) {
|
560
589
|
result = getConstant(CONST_INFINITY);
|
@@ -564,9 +593,9 @@ case 1:
|
|
564
593
|
}
|
565
594
|
break;
|
566
595
|
case 5:
|
567
|
-
// line
|
596
|
+
// line 384 "Parser.rl"
|
568
597
|
{
|
569
|
-
if (pe > p + 9 &&
|
598
|
+
if (pe > p + 9 - (parser.quirksMode ? 1 : 0) &&
|
570
599
|
absSubSequence(p, p + 9).toString().equals(JSON_MINUS_INFINITY)) {
|
571
600
|
|
572
601
|
if (parser.allowNaN) {
|
@@ -593,7 +622,7 @@ case 1:
|
|
593
622
|
}
|
594
623
|
break;
|
595
624
|
case 6:
|
596
|
-
// line
|
625
|
+
// line 410 "Parser.rl"
|
597
626
|
{
|
598
627
|
ParserResult res = parseString(p, pe);
|
599
628
|
if (res == null) {
|
@@ -606,7 +635,7 @@ case 1:
|
|
606
635
|
}
|
607
636
|
break;
|
608
637
|
case 7:
|
609
|
-
// line
|
638
|
+
// line 420 "Parser.rl"
|
610
639
|
{
|
611
640
|
currentNesting++;
|
612
641
|
ParserResult res = parseArray(p, pe);
|
@@ -621,7 +650,7 @@ case 1:
|
|
621
650
|
}
|
622
651
|
break;
|
623
652
|
case 8:
|
624
|
-
// line
|
653
|
+
// line 432 "Parser.rl"
|
625
654
|
{
|
626
655
|
currentNesting++;
|
627
656
|
ParserResult res = parseObject(p, pe);
|
@@ -635,7 +664,7 @@ case 1:
|
|
635
664
|
}
|
636
665
|
}
|
637
666
|
break;
|
638
|
-
// line
|
667
|
+
// line 668 "Parser.java"
|
639
668
|
}
|
640
669
|
}
|
641
670
|
}
|
@@ -655,7 +684,7 @@ case 5:
|
|
655
684
|
break; }
|
656
685
|
}
|
657
686
|
|
658
|
-
// line
|
687
|
+
// line 467 "Parser.rl"
|
659
688
|
|
660
689
|
if (cs >= JSON_value_first_final && result != null) {
|
661
690
|
return new ParserResult(result, p);
|
@@ -665,7 +694,7 @@ case 5:
|
|
665
694
|
}
|
666
695
|
|
667
696
|
|
668
|
-
// line
|
697
|
+
// line 698 "Parser.java"
|
669
698
|
private static byte[] init__JSON_integer_actions_0()
|
670
699
|
{
|
671
700
|
return new byte [] {
|
@@ -679,7 +708,7 @@ private static final byte _JSON_integer_actions[] = init__JSON_integer_actions_0
|
|
679
708
|
private static byte[] init__JSON_integer_key_offsets_0()
|
680
709
|
{
|
681
710
|
return new byte [] {
|
682
|
-
0, 0, 4, 7, 9,
|
711
|
+
0, 0, 4, 7, 9, 9
|
683
712
|
};
|
684
713
|
}
|
685
714
|
|
@@ -709,7 +738,7 @@ private static final byte _JSON_integer_single_lengths[] = init__JSON_integer_si
|
|
709
738
|
private static byte[] init__JSON_integer_range_lengths_0()
|
710
739
|
{
|
711
740
|
return new byte [] {
|
712
|
-
0, 1, 1, 1,
|
741
|
+
0, 1, 1, 1, 0, 1
|
713
742
|
};
|
714
743
|
}
|
715
744
|
|
@@ -719,7 +748,7 @@ private static final byte _JSON_integer_range_lengths[] = init__JSON_integer_ran
|
|
719
748
|
private static byte[] init__JSON_integer_index_offsets_0()
|
720
749
|
{
|
721
750
|
return new byte [] {
|
722
|
-
0, 0, 4, 7, 9,
|
751
|
+
0, 0, 4, 7, 9, 10
|
723
752
|
};
|
724
753
|
}
|
725
754
|
|
@@ -729,7 +758,7 @@ private static final byte _JSON_integer_index_offsets[] = init__JSON_integer_ind
|
|
729
758
|
private static byte[] init__JSON_integer_indicies_0()
|
730
759
|
{
|
731
760
|
return new byte [] {
|
732
|
-
0, 2, 3, 1, 2, 3, 1, 1, 4, 3, 4,
|
761
|
+
0, 2, 3, 1, 2, 3, 1, 1, 4, 1, 3, 4,
|
733
762
|
0
|
734
763
|
};
|
735
764
|
}
|
@@ -740,7 +769,7 @@ private static final byte _JSON_integer_indicies[] = init__JSON_integer_indicies
|
|
740
769
|
private static byte[] init__JSON_integer_trans_targs_0()
|
741
770
|
{
|
742
771
|
return new byte [] {
|
743
|
-
2, 0, 3,
|
772
|
+
2, 0, 3, 5, 4
|
744
773
|
};
|
745
774
|
}
|
746
775
|
|
@@ -758,28 +787,28 @@ private static final byte _JSON_integer_trans_actions[] = init__JSON_integer_tra
|
|
758
787
|
|
759
788
|
|
760
789
|
static final int JSON_integer_start = 1;
|
761
|
-
static final int JSON_integer_first_final =
|
790
|
+
static final int JSON_integer_first_final = 3;
|
762
791
|
static final int JSON_integer_error = 0;
|
763
792
|
|
764
793
|
static final int JSON_integer_en_main = 1;
|
765
794
|
|
766
795
|
|
767
|
-
// line
|
796
|
+
// line 486 "Parser.rl"
|
768
797
|
|
769
798
|
|
770
799
|
ParserResult parseInteger(int p, int pe) {
|
771
800
|
int cs = EVIL;
|
772
801
|
|
773
802
|
|
774
|
-
// line
|
803
|
+
// line 804 "Parser.java"
|
775
804
|
{
|
776
805
|
cs = JSON_integer_start;
|
777
806
|
}
|
778
807
|
|
779
|
-
// line
|
808
|
+
// line 492 "Parser.rl"
|
780
809
|
int memo = p;
|
781
810
|
|
782
|
-
// line
|
811
|
+
// line 812 "Parser.java"
|
783
812
|
{
|
784
813
|
int _klen;
|
785
814
|
int _trans = 0;
|
@@ -860,13 +889,13 @@ case 1:
|
|
860
889
|
switch ( _JSON_integer_actions[_acts++] )
|
861
890
|
{
|
862
891
|
case 0:
|
863
|
-
// line
|
892
|
+
// line 480 "Parser.rl"
|
864
893
|
{
|
865
894
|
p--;
|
866
895
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
867
896
|
}
|
868
897
|
break;
|
869
|
-
// line
|
898
|
+
// line 899 "Parser.java"
|
870
899
|
}
|
871
900
|
}
|
872
901
|
}
|
@@ -886,7 +915,7 @@ case 5:
|
|
886
915
|
break; }
|
887
916
|
}
|
888
917
|
|
889
|
-
// line
|
918
|
+
// line 494 "Parser.rl"
|
890
919
|
|
891
920
|
if (cs < JSON_integer_first_final) {
|
892
921
|
return null;
|
@@ -901,7 +930,7 @@ case 5:
|
|
901
930
|
}
|
902
931
|
|
903
932
|
|
904
|
-
// line
|
933
|
+
// line 934 "Parser.java"
|
905
934
|
private static byte[] init__JSON_float_actions_0()
|
906
935
|
{
|
907
936
|
return new byte [] {
|
@@ -915,7 +944,7 @@ private static final byte _JSON_float_actions[] = init__JSON_float_actions_0();
|
|
915
944
|
private static byte[] init__JSON_float_key_offsets_0()
|
916
945
|
{
|
917
946
|
return new byte [] {
|
918
|
-
0, 0, 4, 7, 10, 12,
|
947
|
+
0, 0, 4, 7, 10, 12, 16, 18, 23, 29, 29
|
919
948
|
};
|
920
949
|
}
|
921
950
|
|
@@ -926,8 +955,8 @@ private static char[] init__JSON_float_trans_keys_0()
|
|
926
955
|
{
|
927
956
|
return new char [] {
|
928
957
|
45, 48, 49, 57, 48, 49, 57, 46, 69, 101, 48, 57,
|
929
|
-
|
930
|
-
|
958
|
+
43, 45, 48, 57, 48, 57, 46, 69, 101, 48, 57, 69,
|
959
|
+
101, 45, 46, 48, 57, 69, 101, 45, 46, 48, 57, 0
|
931
960
|
};
|
932
961
|
}
|
933
962
|
|
@@ -937,7 +966,7 @@ private static final char _JSON_float_trans_keys[] = init__JSON_float_trans_keys
|
|
937
966
|
private static byte[] init__JSON_float_single_lengths_0()
|
938
967
|
{
|
939
968
|
return new byte [] {
|
940
|
-
0, 2, 1, 3, 0, 2,
|
969
|
+
0, 2, 1, 3, 0, 2, 0, 3, 2, 0, 2
|
941
970
|
};
|
942
971
|
}
|
943
972
|
|
@@ -947,7 +976,7 @@ private static final byte _JSON_float_single_lengths[] = init__JSON_float_single
|
|
947
976
|
private static byte[] init__JSON_float_range_lengths_0()
|
948
977
|
{
|
949
978
|
return new byte [] {
|
950
|
-
0, 1, 1, 0, 1,
|
979
|
+
0, 1, 1, 0, 1, 1, 1, 1, 2, 0, 2
|
951
980
|
};
|
952
981
|
}
|
953
982
|
|
@@ -957,7 +986,7 @@ private static final byte _JSON_float_range_lengths[] = init__JSON_float_range_l
|
|
957
986
|
private static byte[] init__JSON_float_index_offsets_0()
|
958
987
|
{
|
959
988
|
return new byte [] {
|
960
|
-
0, 0, 4, 7, 11, 13,
|
989
|
+
0, 0, 4, 7, 11, 13, 17, 19, 24, 29, 30
|
961
990
|
};
|
962
991
|
}
|
963
992
|
|
@@ -968,8 +997,8 @@ private static byte[] init__JSON_float_indicies_0()
|
|
968
997
|
{
|
969
998
|
return new byte [] {
|
970
999
|
0, 2, 3, 1, 2, 3, 1, 4, 5, 5, 1, 6,
|
971
|
-
1,
|
972
|
-
|
1000
|
+
1, 7, 7, 8, 1, 8, 1, 4, 5, 5, 3, 1,
|
1001
|
+
5, 5, 1, 6, 9, 1, 1, 1, 1, 8, 9, 0
|
973
1002
|
};
|
974
1003
|
}
|
975
1004
|
|
@@ -979,7 +1008,7 @@ private static final byte _JSON_float_indicies[] = init__JSON_float_indicies_0()
|
|
979
1008
|
private static byte[] init__JSON_float_trans_targs_0()
|
980
1009
|
{
|
981
1010
|
return new byte [] {
|
982
|
-
2, 0, 3,
|
1011
|
+
2, 0, 3, 7, 4, 5, 8, 6, 10, 9
|
983
1012
|
};
|
984
1013
|
}
|
985
1014
|
|
@@ -989,7 +1018,7 @@ private static final byte _JSON_float_trans_targs[] = init__JSON_float_trans_tar
|
|
989
1018
|
private static byte[] init__JSON_float_trans_actions_0()
|
990
1019
|
{
|
991
1020
|
return new byte [] {
|
992
|
-
0, 0, 0, 0, 0, 0, 0,
|
1021
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 1
|
993
1022
|
};
|
994
1023
|
}
|
995
1024
|
|
@@ -997,28 +1026,28 @@ private static final byte _JSON_float_trans_actions[] = init__JSON_float_trans_a
|
|
997
1026
|
|
998
1027
|
|
999
1028
|
static final int JSON_float_start = 1;
|
1000
|
-
static final int JSON_float_first_final =
|
1029
|
+
static final int JSON_float_first_final = 8;
|
1001
1030
|
static final int JSON_float_error = 0;
|
1002
1031
|
|
1003
1032
|
static final int JSON_float_en_main = 1;
|
1004
1033
|
|
1005
1034
|
|
1006
|
-
// line
|
1035
|
+
// line 522 "Parser.rl"
|
1007
1036
|
|
1008
1037
|
|
1009
1038
|
ParserResult parseFloat(int p, int pe) {
|
1010
1039
|
int cs = EVIL;
|
1011
1040
|
|
1012
1041
|
|
1013
|
-
// line
|
1042
|
+
// line 1043 "Parser.java"
|
1014
1043
|
{
|
1015
1044
|
cs = JSON_float_start;
|
1016
1045
|
}
|
1017
1046
|
|
1018
|
-
// line
|
1047
|
+
// line 528 "Parser.rl"
|
1019
1048
|
int memo = p;
|
1020
1049
|
|
1021
|
-
// line
|
1050
|
+
// line 1051 "Parser.java"
|
1022
1051
|
{
|
1023
1052
|
int _klen;
|
1024
1053
|
int _trans = 0;
|
@@ -1099,13 +1128,13 @@ case 1:
|
|
1099
1128
|
switch ( _JSON_float_actions[_acts++] )
|
1100
1129
|
{
|
1101
1130
|
case 0:
|
1102
|
-
// line
|
1131
|
+
// line 513 "Parser.rl"
|
1103
1132
|
{
|
1104
1133
|
p--;
|
1105
1134
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1106
1135
|
}
|
1107
1136
|
break;
|
1108
|
-
// line
|
1137
|
+
// line 1138 "Parser.java"
|
1109
1138
|
}
|
1110
1139
|
}
|
1111
1140
|
}
|
@@ -1125,7 +1154,7 @@ case 5:
|
|
1125
1154
|
break; }
|
1126
1155
|
}
|
1127
1156
|
|
1128
|
-
// line
|
1157
|
+
// line 530 "Parser.rl"
|
1129
1158
|
|
1130
1159
|
if (cs < JSON_float_first_final) {
|
1131
1160
|
return null;
|
@@ -1140,7 +1169,7 @@ case 5:
|
|
1140
1169
|
}
|
1141
1170
|
|
1142
1171
|
|
1143
|
-
// line
|
1172
|
+
// line 1173 "Parser.java"
|
1144
1173
|
private static byte[] init__JSON_string_actions_0()
|
1145
1174
|
{
|
1146
1175
|
return new byte [] {
|
@@ -1242,7 +1271,7 @@ static final int JSON_string_error = 0;
|
|
1242
1271
|
static final int JSON_string_en_main = 1;
|
1243
1272
|
|
1244
1273
|
|
1245
|
-
// line
|
1274
|
+
// line 574 "Parser.rl"
|
1246
1275
|
|
1247
1276
|
|
1248
1277
|
ParserResult parseString(int p, int pe) {
|
@@ -1250,15 +1279,15 @@ static final int JSON_string_en_main = 1;
|
|
1250
1279
|
IRubyObject result = null;
|
1251
1280
|
|
1252
1281
|
|
1253
|
-
// line
|
1282
|
+
// line 1283 "Parser.java"
|
1254
1283
|
{
|
1255
1284
|
cs = JSON_string_start;
|
1256
1285
|
}
|
1257
1286
|
|
1258
|
-
// line
|
1287
|
+
// line 581 "Parser.rl"
|
1259
1288
|
int memo = p;
|
1260
1289
|
|
1261
|
-
// line
|
1290
|
+
// line 1291 "Parser.java"
|
1262
1291
|
{
|
1263
1292
|
int _klen;
|
1264
1293
|
int _trans = 0;
|
@@ -1339,7 +1368,7 @@ case 1:
|
|
1339
1368
|
switch ( _JSON_string_actions[_acts++] )
|
1340
1369
|
{
|
1341
1370
|
case 0:
|
1342
|
-
// line
|
1371
|
+
// line 549 "Parser.rl"
|
1343
1372
|
{
|
1344
1373
|
int offset = byteList.begin();
|
1345
1374
|
ByteList decoded = decoder.decode(byteList, memo + 1 - offset,
|
@@ -1354,13 +1383,13 @@ case 1:
|
|
1354
1383
|
}
|
1355
1384
|
break;
|
1356
1385
|
case 1:
|
1357
|
-
// line
|
1386
|
+
// line 562 "Parser.rl"
|
1358
1387
|
{
|
1359
1388
|
p--;
|
1360
1389
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1361
1390
|
}
|
1362
1391
|
break;
|
1363
|
-
// line
|
1392
|
+
// line 1393 "Parser.java"
|
1364
1393
|
}
|
1365
1394
|
}
|
1366
1395
|
}
|
@@ -1380,7 +1409,7 @@ case 5:
|
|
1380
1409
|
break; }
|
1381
1410
|
}
|
1382
1411
|
|
1383
|
-
// line
|
1412
|
+
// line 583 "Parser.rl"
|
1384
1413
|
|
1385
1414
|
if (parser.createAdditions) {
|
1386
1415
|
RubyHash match_string = parser.match_string;
|
@@ -1397,7 +1426,7 @@ case 5:
|
|
1397
1426
|
}
|
1398
1427
|
});
|
1399
1428
|
} catch (JumpException e) { }
|
1400
|
-
if (memoArray[1] != null) {
|
1429
|
+
if (memoArray[1] != null) {
|
1401
1430
|
RubyClass klass = (RubyClass) memoArray[1];
|
1402
1431
|
if (klass.respondsTo("json_creatable?") &&
|
1403
1432
|
klass.callMethod(context, "json_creatable?").isTrue()) {
|
@@ -1415,7 +1444,7 @@ case 5:
|
|
1415
1444
|
}
|
1416
1445
|
|
1417
1446
|
|
1418
|
-
// line
|
1447
|
+
// line 1448 "Parser.java"
|
1419
1448
|
private static byte[] init__JSON_array_actions_0()
|
1420
1449
|
{
|
1421
1450
|
return new byte [] {
|
@@ -1528,7 +1557,7 @@ static final int JSON_array_error = 0;
|
|
1528
1557
|
static final int JSON_array_en_main = 1;
|
1529
1558
|
|
1530
1559
|
|
1531
|
-
// line
|
1560
|
+
// line 653 "Parser.rl"
|
1532
1561
|
|
1533
1562
|
|
1534
1563
|
ParserResult parseArray(int p, int pe) {
|
@@ -1546,14 +1575,14 @@ static final int JSON_array_en_main = 1;
|
|
1546
1575
|
IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
|
1547
1576
|
|
1548
1577
|
|
1549
|
-
// line
|
1578
|
+
// line 1579 "Parser.java"
|
1550
1579
|
{
|
1551
1580
|
cs = JSON_array_start;
|
1552
1581
|
}
|
1553
1582
|
|
1554
|
-
// line
|
1583
|
+
// line 670 "Parser.rl"
|
1555
1584
|
|
1556
|
-
// line
|
1585
|
+
// line 1586 "Parser.java"
|
1557
1586
|
{
|
1558
1587
|
int _klen;
|
1559
1588
|
int _trans = 0;
|
@@ -1634,7 +1663,7 @@ case 1:
|
|
1634
1663
|
switch ( _JSON_array_actions[_acts++] )
|
1635
1664
|
{
|
1636
1665
|
case 0:
|
1637
|
-
// line
|
1666
|
+
// line 622 "Parser.rl"
|
1638
1667
|
{
|
1639
1668
|
ParserResult res = parseValue(p, pe);
|
1640
1669
|
if (res == null) {
|
@@ -1651,13 +1680,13 @@ case 1:
|
|
1651
1680
|
}
|
1652
1681
|
break;
|
1653
1682
|
case 1:
|
1654
|
-
// line
|
1683
|
+
// line 637 "Parser.rl"
|
1655
1684
|
{
|
1656
1685
|
p--;
|
1657
1686
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1658
1687
|
}
|
1659
1688
|
break;
|
1660
|
-
// line
|
1689
|
+
// line 1690 "Parser.java"
|
1661
1690
|
}
|
1662
1691
|
}
|
1663
1692
|
}
|
@@ -1677,7 +1706,7 @@ case 5:
|
|
1677
1706
|
break; }
|
1678
1707
|
}
|
1679
1708
|
|
1680
|
-
// line
|
1709
|
+
// line 671 "Parser.rl"
|
1681
1710
|
|
1682
1711
|
if (cs >= JSON_array_first_final) {
|
1683
1712
|
return new ParserResult(result, p + 1);
|
@@ -1687,7 +1716,7 @@ case 5:
|
|
1687
1716
|
}
|
1688
1717
|
|
1689
1718
|
|
1690
|
-
// line
|
1719
|
+
// line 1720 "Parser.java"
|
1691
1720
|
private static byte[] init__JSON_object_actions_0()
|
1692
1721
|
{
|
1693
1722
|
return new byte [] {
|
@@ -1810,7 +1839,7 @@ static final int JSON_object_error = 0;
|
|
1810
1839
|
static final int JSON_object_en_main = 1;
|
1811
1840
|
|
1812
1841
|
|
1813
|
-
// line
|
1842
|
+
// line 730 "Parser.rl"
|
1814
1843
|
|
1815
1844
|
|
1816
1845
|
ParserResult parseObject(int p, int pe) {
|
@@ -1829,14 +1858,14 @@ static final int JSON_object_en_main = 1;
|
|
1829
1858
|
IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
|
1830
1859
|
|
1831
1860
|
|
1832
|
-
// line
|
1861
|
+
// line 1862 "Parser.java"
|
1833
1862
|
{
|
1834
1863
|
cs = JSON_object_start;
|
1835
1864
|
}
|
1836
1865
|
|
1837
|
-
// line
|
1866
|
+
// line 748 "Parser.rl"
|
1838
1867
|
|
1839
|
-
// line
|
1868
|
+
// line 1869 "Parser.java"
|
1840
1869
|
{
|
1841
1870
|
int _klen;
|
1842
1871
|
int _trans = 0;
|
@@ -1917,7 +1946,7 @@ case 1:
|
|
1917
1946
|
switch ( _JSON_object_actions[_acts++] )
|
1918
1947
|
{
|
1919
1948
|
case 0:
|
1920
|
-
// line
|
1949
|
+
// line 685 "Parser.rl"
|
1921
1950
|
{
|
1922
1951
|
ParserResult res = parseValue(p, pe);
|
1923
1952
|
if (res == null) {
|
@@ -1934,7 +1963,7 @@ case 1:
|
|
1934
1963
|
}
|
1935
1964
|
break;
|
1936
1965
|
case 1:
|
1937
|
-
// line
|
1966
|
+
// line 700 "Parser.rl"
|
1938
1967
|
{
|
1939
1968
|
ParserResult res = parseString(p, pe);
|
1940
1969
|
if (res == null) {
|
@@ -1954,13 +1983,13 @@ case 1:
|
|
1954
1983
|
}
|
1955
1984
|
break;
|
1956
1985
|
case 2:
|
1957
|
-
// line
|
1986
|
+
// line 718 "Parser.rl"
|
1958
1987
|
{
|
1959
1988
|
p--;
|
1960
1989
|
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
1961
1990
|
}
|
1962
1991
|
break;
|
1963
|
-
// line
|
1992
|
+
// line 1993 "Parser.java"
|
1964
1993
|
}
|
1965
1994
|
}
|
1966
1995
|
}
|
@@ -1980,7 +2009,7 @@ case 5:
|
|
1980
2009
|
break; }
|
1981
2010
|
}
|
1982
2011
|
|
1983
|
-
// line
|
2012
|
+
// line 749 "Parser.rl"
|
1984
2013
|
|
1985
2014
|
if (cs < JSON_object_first_final) {
|
1986
2015
|
return null;
|
@@ -1993,7 +2022,7 @@ case 5:
|
|
1993
2022
|
IRubyObject vKlassName = result.op_aref(context, parser.createId);
|
1994
2023
|
if (!vKlassName.isNil()) {
|
1995
2024
|
// might throw ArgumentError, we let it propagate
|
1996
|
-
IRubyObject klass = parser.info.jsonModule.
|
2025
|
+
IRubyObject klass = parser.info.jsonModule.get().
|
1997
2026
|
callMethod(context, "deep_const_get", vKlassName);
|
1998
2027
|
if (klass.respondsTo("json_creatable?") &&
|
1999
2028
|
klass.callMethod(context, "json_creatable?").isTrue()) {
|
@@ -2006,7 +2035,7 @@ case 5:
|
|
2006
2035
|
}
|
2007
2036
|
|
2008
2037
|
|
2009
|
-
// line
|
2038
|
+
// line 2039 "Parser.java"
|
2010
2039
|
private static byte[] init__JSON_actions_0()
|
2011
2040
|
{
|
2012
2041
|
return new byte [] {
|
@@ -2110,25 +2139,25 @@ static final int JSON_error = 0;
|
|
2110
2139
|
static final int JSON_en_main = 1;
|
2111
2140
|
|
2112
2141
|
|
2113
|
-
// line
|
2142
|
+
// line 807 "Parser.rl"
|
2114
2143
|
|
2115
2144
|
|
2116
|
-
public IRubyObject
|
2145
|
+
public IRubyObject parseStrict() {
|
2117
2146
|
int cs = EVIL;
|
2118
2147
|
int p, pe;
|
2119
2148
|
IRubyObject result = null;
|
2120
2149
|
|
2121
2150
|
|
2122
|
-
// line
|
2151
|
+
// line 2152 "Parser.java"
|
2123
2152
|
{
|
2124
2153
|
cs = JSON_start;
|
2125
2154
|
}
|
2126
2155
|
|
2127
|
-
// line
|
2156
|
+
// line 815 "Parser.rl"
|
2128
2157
|
p = byteList.begin();
|
2129
2158
|
pe = p + byteList.length();
|
2130
2159
|
|
2131
|
-
// line
|
2160
|
+
// line 2161 "Parser.java"
|
2132
2161
|
{
|
2133
2162
|
int _klen;
|
2134
2163
|
int _trans = 0;
|
@@ -2209,7 +2238,7 @@ case 1:
|
|
2209
2238
|
switch ( _JSON_actions[_acts++] )
|
2210
2239
|
{
|
2211
2240
|
case 0:
|
2212
|
-
// line
|
2241
|
+
// line 779 "Parser.rl"
|
2213
2242
|
{
|
2214
2243
|
currentNesting = 1;
|
2215
2244
|
ParserResult res = parseObject(p, pe);
|
@@ -2223,7 +2252,7 @@ case 1:
|
|
2223
2252
|
}
|
2224
2253
|
break;
|
2225
2254
|
case 1:
|
2226
|
-
// line
|
2255
|
+
// line 791 "Parser.rl"
|
2227
2256
|
{
|
2228
2257
|
currentNesting = 1;
|
2229
2258
|
ParserResult res = parseArray(p, pe);
|
@@ -2236,7 +2265,7 @@ case 1:
|
|
2236
2265
|
}
|
2237
2266
|
}
|
2238
2267
|
break;
|
2239
|
-
// line
|
2268
|
+
// line 2269 "Parser.java"
|
2240
2269
|
}
|
2241
2270
|
}
|
2242
2271
|
}
|
@@ -2256,7 +2285,7 @@ case 5:
|
|
2256
2285
|
break; }
|
2257
2286
|
}
|
2258
2287
|
|
2259
|
-
// line
|
2288
|
+
// line 818 "Parser.rl"
|
2260
2289
|
|
2261
2290
|
if (cs >= JSON_first_final && p == pe) {
|
2262
2291
|
return result;
|
@@ -2265,6 +2294,259 @@ case 5:
|
|
2265
2294
|
}
|
2266
2295
|
}
|
2267
2296
|
|
2297
|
+
|
2298
|
+
// line 2299 "Parser.java"
|
2299
|
+
private static byte[] init__JSON_quirks_mode_actions_0()
|
2300
|
+
{
|
2301
|
+
return new byte [] {
|
2302
|
+
0, 1, 0
|
2303
|
+
};
|
2304
|
+
}
|
2305
|
+
|
2306
|
+
private static final byte _JSON_quirks_mode_actions[] = init__JSON_quirks_mode_actions_0();
|
2307
|
+
|
2308
|
+
|
2309
|
+
private static byte[] init__JSON_quirks_mode_key_offsets_0()
|
2310
|
+
{
|
2311
|
+
return new byte [] {
|
2312
|
+
0, 0, 16, 18, 19, 21, 22, 24, 25, 27, 28
|
2313
|
+
};
|
2314
|
+
}
|
2315
|
+
|
2316
|
+
private static final byte _JSON_quirks_mode_key_offsets[] = init__JSON_quirks_mode_key_offsets_0();
|
2317
|
+
|
2318
|
+
|
2319
|
+
private static char[] init__JSON_quirks_mode_trans_keys_0()
|
2320
|
+
{
|
2321
|
+
return new char [] {
|
2322
|
+
13, 32, 34, 45, 47, 73, 78, 91, 102, 110, 116, 123,
|
2323
|
+
9, 10, 48, 57, 42, 47, 42, 42, 47, 10, 42, 47,
|
2324
|
+
42, 42, 47, 10, 13, 32, 47, 9, 10, 0
|
2325
|
+
};
|
2326
|
+
}
|
2327
|
+
|
2328
|
+
private static final char _JSON_quirks_mode_trans_keys[] = init__JSON_quirks_mode_trans_keys_0();
|
2329
|
+
|
2330
|
+
|
2331
|
+
private static byte[] init__JSON_quirks_mode_single_lengths_0()
|
2332
|
+
{
|
2333
|
+
return new byte [] {
|
2334
|
+
0, 12, 2, 1, 2, 1, 2, 1, 2, 1, 3
|
2335
|
+
};
|
2336
|
+
}
|
2337
|
+
|
2338
|
+
private static final byte _JSON_quirks_mode_single_lengths[] = init__JSON_quirks_mode_single_lengths_0();
|
2339
|
+
|
2340
|
+
|
2341
|
+
private static byte[] init__JSON_quirks_mode_range_lengths_0()
|
2342
|
+
{
|
2343
|
+
return new byte [] {
|
2344
|
+
0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1
|
2345
|
+
};
|
2346
|
+
}
|
2347
|
+
|
2348
|
+
private static final byte _JSON_quirks_mode_range_lengths[] = init__JSON_quirks_mode_range_lengths_0();
|
2349
|
+
|
2350
|
+
|
2351
|
+
private static byte[] init__JSON_quirks_mode_index_offsets_0()
|
2352
|
+
{
|
2353
|
+
return new byte [] {
|
2354
|
+
0, 0, 15, 18, 20, 23, 25, 28, 30, 33, 35
|
2355
|
+
};
|
2356
|
+
}
|
2357
|
+
|
2358
|
+
private static final byte _JSON_quirks_mode_index_offsets[] = init__JSON_quirks_mode_index_offsets_0();
|
2359
|
+
|
2360
|
+
|
2361
|
+
private static byte[] init__JSON_quirks_mode_indicies_0()
|
2362
|
+
{
|
2363
|
+
return new byte [] {
|
2364
|
+
0, 0, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2,
|
2365
|
+
0, 2, 1, 4, 5, 1, 6, 4, 6, 7, 4, 7,
|
2366
|
+
5, 8, 9, 1, 10, 8, 10, 0, 8, 0, 9, 7,
|
2367
|
+
7, 11, 7, 1, 0
|
2368
|
+
};
|
2369
|
+
}
|
2370
|
+
|
2371
|
+
private static final byte _JSON_quirks_mode_indicies[] = init__JSON_quirks_mode_indicies_0();
|
2372
|
+
|
2373
|
+
|
2374
|
+
private static byte[] init__JSON_quirks_mode_trans_targs_0()
|
2375
|
+
{
|
2376
|
+
return new byte [] {
|
2377
|
+
1, 0, 10, 6, 3, 5, 4, 10, 7, 9, 8, 2
|
2378
|
+
};
|
2379
|
+
}
|
2380
|
+
|
2381
|
+
private static final byte _JSON_quirks_mode_trans_targs[] = init__JSON_quirks_mode_trans_targs_0();
|
2382
|
+
|
2383
|
+
|
2384
|
+
private static byte[] init__JSON_quirks_mode_trans_actions_0()
|
2385
|
+
{
|
2386
|
+
return new byte [] {
|
2387
|
+
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
2388
|
+
};
|
2389
|
+
}
|
2390
|
+
|
2391
|
+
private static final byte _JSON_quirks_mode_trans_actions[] = init__JSON_quirks_mode_trans_actions_0();
|
2392
|
+
|
2393
|
+
|
2394
|
+
static final int JSON_quirks_mode_start = 1;
|
2395
|
+
static final int JSON_quirks_mode_first_final = 10;
|
2396
|
+
static final int JSON_quirks_mode_error = 0;
|
2397
|
+
|
2398
|
+
static final int JSON_quirks_mode_en_main = 1;
|
2399
|
+
|
2400
|
+
|
2401
|
+
// line 846 "Parser.rl"
|
2402
|
+
|
2403
|
+
|
2404
|
+
public IRubyObject parseQuirksMode() {
|
2405
|
+
int cs = EVIL;
|
2406
|
+
int p, pe;
|
2407
|
+
IRubyObject result = null;
|
2408
|
+
|
2409
|
+
|
2410
|
+
// line 2411 "Parser.java"
|
2411
|
+
{
|
2412
|
+
cs = JSON_quirks_mode_start;
|
2413
|
+
}
|
2414
|
+
|
2415
|
+
// line 854 "Parser.rl"
|
2416
|
+
p = byteList.begin();
|
2417
|
+
pe = p + byteList.length();
|
2418
|
+
|
2419
|
+
// line 2420 "Parser.java"
|
2420
|
+
{
|
2421
|
+
int _klen;
|
2422
|
+
int _trans = 0;
|
2423
|
+
int _acts;
|
2424
|
+
int _nacts;
|
2425
|
+
int _keys;
|
2426
|
+
int _goto_targ = 0;
|
2427
|
+
|
2428
|
+
_goto: while (true) {
|
2429
|
+
switch ( _goto_targ ) {
|
2430
|
+
case 0:
|
2431
|
+
if ( p == pe ) {
|
2432
|
+
_goto_targ = 4;
|
2433
|
+
continue _goto;
|
2434
|
+
}
|
2435
|
+
if ( cs == 0 ) {
|
2436
|
+
_goto_targ = 5;
|
2437
|
+
continue _goto;
|
2438
|
+
}
|
2439
|
+
case 1:
|
2440
|
+
_match: do {
|
2441
|
+
_keys = _JSON_quirks_mode_key_offsets[cs];
|
2442
|
+
_trans = _JSON_quirks_mode_index_offsets[cs];
|
2443
|
+
_klen = _JSON_quirks_mode_single_lengths[cs];
|
2444
|
+
if ( _klen > 0 ) {
|
2445
|
+
int _lower = _keys;
|
2446
|
+
int _mid;
|
2447
|
+
int _upper = _keys + _klen - 1;
|
2448
|
+
while (true) {
|
2449
|
+
if ( _upper < _lower )
|
2450
|
+
break;
|
2451
|
+
|
2452
|
+
_mid = _lower + ((_upper-_lower) >> 1);
|
2453
|
+
if ( data[p] < _JSON_quirks_mode_trans_keys[_mid] )
|
2454
|
+
_upper = _mid - 1;
|
2455
|
+
else if ( data[p] > _JSON_quirks_mode_trans_keys[_mid] )
|
2456
|
+
_lower = _mid + 1;
|
2457
|
+
else {
|
2458
|
+
_trans += (_mid - _keys);
|
2459
|
+
break _match;
|
2460
|
+
}
|
2461
|
+
}
|
2462
|
+
_keys += _klen;
|
2463
|
+
_trans += _klen;
|
2464
|
+
}
|
2465
|
+
|
2466
|
+
_klen = _JSON_quirks_mode_range_lengths[cs];
|
2467
|
+
if ( _klen > 0 ) {
|
2468
|
+
int _lower = _keys;
|
2469
|
+
int _mid;
|
2470
|
+
int _upper = _keys + (_klen<<1) - 2;
|
2471
|
+
while (true) {
|
2472
|
+
if ( _upper < _lower )
|
2473
|
+
break;
|
2474
|
+
|
2475
|
+
_mid = _lower + (((_upper-_lower) >> 1) & ~1);
|
2476
|
+
if ( data[p] < _JSON_quirks_mode_trans_keys[_mid] )
|
2477
|
+
_upper = _mid - 2;
|
2478
|
+
else if ( data[p] > _JSON_quirks_mode_trans_keys[_mid+1] )
|
2479
|
+
_lower = _mid + 2;
|
2480
|
+
else {
|
2481
|
+
_trans += ((_mid - _keys)>>1);
|
2482
|
+
break _match;
|
2483
|
+
}
|
2484
|
+
}
|
2485
|
+
_trans += _klen;
|
2486
|
+
}
|
2487
|
+
} while (false);
|
2488
|
+
|
2489
|
+
_trans = _JSON_quirks_mode_indicies[_trans];
|
2490
|
+
cs = _JSON_quirks_mode_trans_targs[_trans];
|
2491
|
+
|
2492
|
+
if ( _JSON_quirks_mode_trans_actions[_trans] != 0 ) {
|
2493
|
+
_acts = _JSON_quirks_mode_trans_actions[_trans];
|
2494
|
+
_nacts = (int) _JSON_quirks_mode_actions[_acts++];
|
2495
|
+
while ( _nacts-- > 0 )
|
2496
|
+
{
|
2497
|
+
switch ( _JSON_quirks_mode_actions[_acts++] )
|
2498
|
+
{
|
2499
|
+
case 0:
|
2500
|
+
// line 832 "Parser.rl"
|
2501
|
+
{
|
2502
|
+
ParserResult res = parseValue(p, pe);
|
2503
|
+
if (res == null) {
|
2504
|
+
p--;
|
2505
|
+
{ p += 1; _goto_targ = 5; if (true) continue _goto;}
|
2506
|
+
} else {
|
2507
|
+
result = res.result;
|
2508
|
+
{p = (( res.p))-1;}
|
2509
|
+
}
|
2510
|
+
}
|
2511
|
+
break;
|
2512
|
+
// line 2513 "Parser.java"
|
2513
|
+
}
|
2514
|
+
}
|
2515
|
+
}
|
2516
|
+
|
2517
|
+
case 2:
|
2518
|
+
if ( cs == 0 ) {
|
2519
|
+
_goto_targ = 5;
|
2520
|
+
continue _goto;
|
2521
|
+
}
|
2522
|
+
if ( ++p != pe ) {
|
2523
|
+
_goto_targ = 1;
|
2524
|
+
continue _goto;
|
2525
|
+
}
|
2526
|
+
case 4:
|
2527
|
+
case 5:
|
2528
|
+
}
|
2529
|
+
break; }
|
2530
|
+
}
|
2531
|
+
|
2532
|
+
// line 857 "Parser.rl"
|
2533
|
+
|
2534
|
+
if (cs >= JSON_quirks_mode_first_final && p == pe) {
|
2535
|
+
return result;
|
2536
|
+
} else {
|
2537
|
+
throw unexpectedToken(p, pe);
|
2538
|
+
}
|
2539
|
+
}
|
2540
|
+
|
2541
|
+
public IRubyObject parse() {
|
2542
|
+
if (parser.quirksMode) {
|
2543
|
+
return parseQuirksMode();
|
2544
|
+
} else {
|
2545
|
+
return parseStrict();
|
2546
|
+
}
|
2547
|
+
|
2548
|
+
}
|
2549
|
+
|
2268
2550
|
/**
|
2269
2551
|
* Returns a subsequence of the source ByteList, based on source
|
2270
2552
|
* array byte offsets (i.e., the ByteList's own begin offset is not
|
@@ -2283,7 +2565,7 @@ case 5:
|
|
2283
2565
|
* @param name The constant name
|
2284
2566
|
*/
|
2285
2567
|
private IRubyObject getConstant(String name) {
|
2286
|
-
return parser.info.jsonModule.getConstant(name);
|
2568
|
+
return parser.info.jsonModule.get().getConstant(name);
|
2287
2569
|
}
|
2288
2570
|
|
2289
2571
|
private RaiseException newException(String className, String message) {
|