json-maglev- 1.5.4 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +11 -1
- data/Rakefile +14 -12
- data/VERSION +1 -1
- data/ext/json/ext/generator/extconf.rb +0 -7
- data/ext/json/ext/generator/generator.c +55 -10
- data/ext/json/ext/generator/generator.h +7 -5
- data/ext/json/ext/parser/extconf.rb +0 -3
- data/ext/json/ext/parser/parser.c +418 -207
- data/ext/json/ext/parser/parser.h +11 -10
- data/ext/json/ext/parser/parser.rl +178 -104
- data/install.rb +1 -8
- data/java/src/json/ext/Generator.java +3 -3
- data/java/src/json/ext/GeneratorMethods.java +2 -2
- data/java/src/json/ext/GeneratorService.java +1 -1
- data/java/src/json/ext/GeneratorState.java +41 -13
- data/java/src/json/ext/OptionsReader.java +1 -1
- data/java/src/json/ext/Parser.java +382 -107
- data/java/src/json/ext/Parser.rl +97 -28
- data/java/src/json/ext/ParserService.java +1 -1
- data/java/src/json/ext/Utils.java +1 -1
- data/json.gemspec +5 -6
- data/json_pure.gemspec +5 -9
- data/lib/json.rb +4 -4
- data/lib/json/add/complex.rb +22 -0
- data/lib/json/add/core.rb +9 -241
- data/lib/json/add/date.rb +34 -0
- data/lib/json/add/date_time.rb +50 -0
- data/lib/json/add/exception.rb +31 -0
- data/lib/json/add/range.rb +29 -0
- data/lib/json/add/rational.rb +22 -0
- data/lib/json/add/regexp.rb +30 -0
- data/lib/json/add/struct.rb +30 -0
- data/lib/json/add/symbol.rb +25 -0
- data/lib/json/add/time.rb +35 -0
- data/lib/json/common.rb +47 -35
- data/lib/json/ext.rb +2 -15
- data/lib/json/pure/generator.rb +17 -2
- data/lib/json/pure/parser.rb +89 -55
- data/lib/json/version.rb +1 -1
- data/tests/test_json.rb +36 -0
- data/tests/test_json_addition.rb +8 -1
- data/tests/test_json_generate.rb +34 -1
- data/tools/server.rb +1 -0
- metadata +20 -24
- data/bin/edit_json.rb +0 -9
- data/bin/prettify_json.rb +0 -48
- data/lib/json/Array.xpm +0 -21
- data/lib/json/FalseClass.xpm +0 -21
- data/lib/json/Hash.xpm +0 -21
- data/lib/json/Key.xpm +0 -73
- data/lib/json/NilClass.xpm +0 -21
- data/lib/json/Numeric.xpm +0 -28
- data/lib/json/String.xpm +0 -96
- data/lib/json/TrueClass.xpm +0 -21
- data/lib/json/add/rails.rb +0 -8
- data/lib/json/editor.rb +0 -1369
- data/lib/json/json.xpm +0 -1499
data/CHANGES
CHANGED
@@ -1,6 +1,16 @@
|
|
1
|
-
2011-
|
1
|
+
2011-09-18 (1.6.1)
|
2
|
+
* Using -target 1.5 to force Java bits to compile with 1.5.
|
3
|
+
2011-09-12 (1.6.0)
|
4
|
+
* Extract utilities (prettifier and GUI-editor) in its own gem json-utils.
|
5
|
+
* Split json/add/core into different files for classes to be serialised.
|
6
|
+
2011-08-31 (1.5.4)
|
2
7
|
* Fix memory leak when used from multiple JRuby. (Patch by
|
3
8
|
jfirebaugh@github).
|
9
|
+
* Apply patch by Eric Wong <nocode@yhbt.net> that fixes garbage collection problem
|
10
|
+
reported in https://github.com/flori/json/issues/46.
|
11
|
+
* Add :quirks_mode option to parser and generator.
|
12
|
+
* Add support for Rational and Complex number additions via json/add/complex
|
13
|
+
and json/add/rational requires.
|
4
14
|
2011-06-20 (1.5.3)
|
5
15
|
* Alias State#configure method as State#merge to increase duck type synonymy with Hash.
|
6
16
|
* Add as_json methods in json/add/core, so rails can create its json objects
|
data/Rakefile
CHANGED
@@ -4,7 +4,12 @@ rescue LoadError
|
|
4
4
|
end
|
5
5
|
|
6
6
|
require 'rbconfig'
|
7
|
-
|
7
|
+
begin
|
8
|
+
include RbConfig
|
9
|
+
rescue NameError
|
10
|
+
include Config
|
11
|
+
end
|
12
|
+
|
8
13
|
|
9
14
|
require 'rake/clean'
|
10
15
|
CLOBBER.include Dir['benchmarks/data/*.{dat,log}'], 'doc', 'Gemfile.lock'
|
@@ -91,10 +96,6 @@ if defined?(Gem) and defined?(Gem::PackageTask)
|
|
91
96
|
s.add_development_dependency 'bullshit'
|
92
97
|
s.add_development_dependency 'sdoc'
|
93
98
|
s.add_development_dependency 'rake', '~>0.9.2'
|
94
|
-
s.add_dependency 'spruz', '~>0.2.8'
|
95
|
-
|
96
|
-
s.bindir = "bin"
|
97
|
-
s.executables = [ "edit_json.rb", "prettify_json.rb" ]
|
98
99
|
|
99
100
|
s.extra_rdoc_files << 'README.rdoc'
|
100
101
|
s.rdoc_options <<
|
@@ -136,9 +137,6 @@ if defined?(Gem) and defined?(Gem::PackageTask)
|
|
136
137
|
s.add_development_dependency 'bullshit'
|
137
138
|
s.add_development_dependency 'sdoc'
|
138
139
|
|
139
|
-
s.bindir = "bin"
|
140
|
-
s.executables = [ "edit_json.rb", "prettify_json.rb" ]
|
141
|
-
|
142
140
|
s.extra_rdoc_files << 'README.rdoc'
|
143
141
|
s.rdoc_options <<
|
144
142
|
'--title' << 'JSON implemention for Ruby' << '--main' << 'README.rdoc'
|
@@ -228,13 +226,13 @@ if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
|
|
228
226
|
rm_rf JAVA_PARSER_SRC
|
229
227
|
end
|
230
228
|
|
231
|
-
JRUBY_JAR = File.join(
|
229
|
+
JRUBY_JAR = File.join(CONFIG["libdir"], "jruby.jar")
|
232
230
|
if File.exist?(JRUBY_JAR)
|
233
231
|
JAVA_SOURCES.each do |src|
|
234
232
|
classpath = (Dir['java/lib/*.jar'] << 'java/src' << JRUBY_JAR) * ':'
|
235
233
|
obj = src.sub(/\.java\Z/, '.class')
|
236
234
|
file obj => src do
|
237
|
-
sh 'javac', '-classpath', classpath, '-source', '1.5', src
|
235
|
+
sh 'javac', '-classpath', classpath, '-source', '1.5', '-target', '1.5', src
|
238
236
|
end
|
239
237
|
JAVA_CLASSES << obj
|
240
238
|
end
|
@@ -298,7 +296,9 @@ if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
|
|
298
296
|
task :create_jar => [ :create_parser_jar, :create_generator_jar ]
|
299
297
|
|
300
298
|
desc "Build all gems and archives for a new release of the jruby extension."
|
301
|
-
task :
|
299
|
+
task :build => [ :clean, :version, :jruby_gem ]
|
300
|
+
|
301
|
+
task :release => :build
|
302
302
|
else
|
303
303
|
desc "Compiling extension"
|
304
304
|
task :compile => [ EXT_PARSER_DL, EXT_GENERATOR_DL ]
|
@@ -400,7 +400,9 @@ else
|
|
400
400
|
task :ragel_dot => [ :ragel_dot_png, :ragel_dot_ps ]
|
401
401
|
|
402
402
|
desc "Build all gems and archives for a new release of json and json_pure."
|
403
|
-
task :
|
403
|
+
task :build => [ :clean, :gemspec, :package ]
|
404
|
+
|
405
|
+
task :release => :build
|
404
406
|
end
|
405
407
|
|
406
408
|
desc "Compile in the the source directory"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.6.1
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'mkmf'
|
2
|
-
require 'rbconfig'
|
3
2
|
|
4
3
|
unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O3')
|
5
4
|
$CFLAGS << ' -O3'
|
@@ -11,10 +10,4 @@ if CONFIG['CC'] =~ /gcc/
|
|
11
10
|
#end
|
12
11
|
end
|
13
12
|
|
14
|
-
if RUBY_VERSION < "1.9"
|
15
|
-
have_header("re.h")
|
16
|
-
else
|
17
|
-
have_header("ruby/re.h")
|
18
|
-
have_header("ruby/encoding.h")
|
19
|
-
end
|
20
13
|
create_makefile 'json/ext/generator'
|
@@ -13,8 +13,8 @@ static VALUE mJSON, mExt, mGenerator, cState, mGeneratorMethods, mObject,
|
|
13
13
|
|
14
14
|
static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before,
|
15
15
|
i_object_nl, i_array_nl, i_max_nesting, i_allow_nan, i_ascii_only,
|
16
|
-
i_pack, i_unpack, i_create_id, i_extend, i_key_p,
|
17
|
-
i_respond_to_p, i_match, i_keys, i_depth, i_dup;
|
16
|
+
i_quirks_mode, i_pack, i_unpack, i_create_id, i_extend, i_key_p,
|
17
|
+
i_aref, i_send, i_respond_to_p, i_match, i_keys, i_depth, i_dup;
|
18
18
|
|
19
19
|
/*
|
20
20
|
* Copyright 2001-2004 Unicode, Inc.
|
@@ -349,6 +349,16 @@ static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned long len)
|
|
349
349
|
}
|
350
350
|
}
|
351
351
|
|
352
|
+
static void fbuffer_append_str(FBuffer *fb, VALUE str)
|
353
|
+
{
|
354
|
+
const char *newstr = StringValuePtr(str);
|
355
|
+
unsigned long len = RSTRING_LEN(str);
|
356
|
+
|
357
|
+
RB_GC_GUARD(str);
|
358
|
+
|
359
|
+
fbuffer_append(fb, newstr, len);
|
360
|
+
}
|
361
|
+
|
352
362
|
static void fbuffer_append_char(FBuffer *fb, char newchr)
|
353
363
|
{
|
354
364
|
fbuffer_inc_capa(fb, 1);
|
@@ -688,6 +698,8 @@ static VALUE cState_configure(VALUE self, VALUE opts)
|
|
688
698
|
state->allow_nan = RTEST(tmp);
|
689
699
|
tmp = rb_hash_aref(opts, ID2SYM(i_ascii_only));
|
690
700
|
state->ascii_only = RTEST(tmp);
|
701
|
+
tmp = rb_hash_aref(opts, ID2SYM(i_quirks_mode));
|
702
|
+
state->quirks_mode = RTEST(tmp);
|
691
703
|
return self;
|
692
704
|
}
|
693
705
|
|
@@ -708,6 +720,7 @@ static VALUE cState_to_h(VALUE self)
|
|
708
720
|
rb_hash_aset(result, ID2SYM(i_array_nl), rb_str_new(state->array_nl, state->array_nl_len));
|
709
721
|
rb_hash_aset(result, ID2SYM(i_allow_nan), state->allow_nan ? Qtrue : Qfalse);
|
710
722
|
rb_hash_aset(result, ID2SYM(i_ascii_only), state->ascii_only ? Qtrue : Qfalse);
|
723
|
+
rb_hash_aset(result, ID2SYM(i_quirks_mode), state->quirks_mode ? Qtrue : Qfalse);
|
711
724
|
rb_hash_aset(result, ID2SYM(i_max_nesting), LONG2FIX(state->max_nesting));
|
712
725
|
rb_hash_aset(result, ID2SYM(i_depth), LONG2FIX(state->depth));
|
713
726
|
return result;
|
@@ -852,7 +865,7 @@ static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_S
|
|
852
865
|
static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
|
853
866
|
{
|
854
867
|
VALUE tmp = rb_funcall(obj, i_to_s, 0);
|
855
|
-
|
868
|
+
fbuffer_append_str(buffer, tmp);
|
856
869
|
}
|
857
870
|
|
858
871
|
static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
|
@@ -869,7 +882,7 @@ static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_St
|
|
869
882
|
rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
|
870
883
|
}
|
871
884
|
}
|
872
|
-
|
885
|
+
fbuffer_append_str(buffer, tmp);
|
873
886
|
}
|
874
887
|
|
875
888
|
static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
|
@@ -897,7 +910,7 @@ static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *s
|
|
897
910
|
} else if (rb_respond_to(obj, i_to_json)) {
|
898
911
|
tmp = rb_funcall(obj, i_to_json, 1, Vstate);
|
899
912
|
Check_Type(tmp, T_STRING);
|
900
|
-
|
913
|
+
fbuffer_append_str(buffer, tmp);
|
901
914
|
} else {
|
902
915
|
tmp = rb_funcall(obj, i_to_s, 0);
|
903
916
|
Check_Type(tmp, T_STRING);
|
@@ -961,11 +974,14 @@ static VALUE cState_generate(VALUE self, VALUE obj)
|
|
961
974
|
{
|
962
975
|
VALUE result = cState_partial_generate(self, obj);
|
963
976
|
VALUE re, args[2];
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
977
|
+
GET_STATE(self);
|
978
|
+
if (!state->quirks_mode) {
|
979
|
+
args[0] = rb_str_new2("\\A\\s*(?:\\[.*\\]|\\{.*\\})\\s*\\Z");
|
980
|
+
args[1] = CRegexp_MULTILINE;
|
981
|
+
re = rb_class_new_instance(2, args, rb_cRegexp);
|
982
|
+
if (NIL_P(rb_funcall(re, i_match, 1, result))) {
|
983
|
+
rb_raise(eGeneratorError, "only generation of JSON objects or arrays allowed");
|
984
|
+
}
|
969
985
|
}
|
970
986
|
return result;
|
971
987
|
}
|
@@ -985,6 +1001,8 @@ static VALUE cState_generate(VALUE self, VALUE obj)
|
|
985
1001
|
* * *allow_nan*: true if NaN, Infinity, and -Infinity should be
|
986
1002
|
* generated, otherwise an exception is thrown, if these values are
|
987
1003
|
* encountered. This options defaults to false.
|
1004
|
+
* * *quirks_mode*: Enables quirks_mode for parser, that is for example
|
1005
|
+
* generating single JSON values instead of documents is possible.
|
988
1006
|
*/
|
989
1007
|
static VALUE cState_initialize(int argc, VALUE *argv, VALUE self)
|
990
1008
|
{
|
@@ -1287,6 +1305,29 @@ static VALUE cState_ascii_only_p(VALUE self)
|
|
1287
1305
|
return state->ascii_only ? Qtrue : Qfalse;
|
1288
1306
|
}
|
1289
1307
|
|
1308
|
+
/*
|
1309
|
+
* call-seq: quirks_mode?
|
1310
|
+
*
|
1311
|
+
* Returns true, if quirks mode is enabled. Otherwise returns false.
|
1312
|
+
*/
|
1313
|
+
static VALUE cState_quirks_mode_p(VALUE self)
|
1314
|
+
{
|
1315
|
+
GET_STATE(self);
|
1316
|
+
return state->quirks_mode ? Qtrue : Qfalse;
|
1317
|
+
}
|
1318
|
+
|
1319
|
+
/*
|
1320
|
+
* call-seq: quirks_mode=(enable)
|
1321
|
+
*
|
1322
|
+
* If set to true, enables the quirks_mode mode.
|
1323
|
+
*/
|
1324
|
+
static VALUE cState_quirks_mode_set(VALUE self, VALUE enable)
|
1325
|
+
{
|
1326
|
+
GET_STATE(self);
|
1327
|
+
state->quirks_mode = RTEST(enable);
|
1328
|
+
return Qnil;
|
1329
|
+
}
|
1330
|
+
|
1290
1331
|
/*
|
1291
1332
|
* call-seq: depth
|
1292
1333
|
*
|
@@ -1345,6 +1386,9 @@ void Init_generator()
|
|
1345
1386
|
rb_define_method(cState, "check_circular?", cState_check_circular_p, 0);
|
1346
1387
|
rb_define_method(cState, "allow_nan?", cState_allow_nan_p, 0);
|
1347
1388
|
rb_define_method(cState, "ascii_only?", cState_ascii_only_p, 0);
|
1389
|
+
rb_define_method(cState, "quirks_mode?", cState_quirks_mode_p, 0);
|
1390
|
+
rb_define_method(cState, "quirks_mode", cState_quirks_mode_p, 0);
|
1391
|
+
rb_define_method(cState, "quirks_mode=", cState_quirks_mode_set, 1);
|
1348
1392
|
rb_define_method(cState, "depth", cState_depth, 0);
|
1349
1393
|
rb_define_method(cState, "depth=", cState_depth_set, 1);
|
1350
1394
|
rb_define_method(cState, "configure", cState_configure, 1);
|
@@ -1392,6 +1436,7 @@ void Init_generator()
|
|
1392
1436
|
i_max_nesting = rb_intern("max_nesting");
|
1393
1437
|
i_allow_nan = rb_intern("allow_nan");
|
1394
1438
|
i_ascii_only = rb_intern("ascii_only");
|
1439
|
+
i_quirks_mode = rb_intern("quirks_mode");
|
1395
1440
|
i_depth = rb_intern("depth");
|
1396
1441
|
i_pack = rb_intern("pack");
|
1397
1442
|
i_unpack = rb_intern("unpack");
|
@@ -7,11 +7,9 @@
|
|
7
7
|
|
8
8
|
#include "ruby.h"
|
9
9
|
|
10
|
-
#
|
10
|
+
#ifdef HAVE_RUBY_RE_H
|
11
11
|
#include "ruby/re.h"
|
12
|
-
#
|
13
|
-
|
14
|
-
#if HAVE_RE_H
|
12
|
+
#else
|
15
13
|
#include "re.h"
|
16
14
|
#endif
|
17
15
|
|
@@ -45,7 +43,10 @@
|
|
45
43
|
#define RSTRING_LEN(string) RSTRING(string)->len
|
46
44
|
#endif
|
47
45
|
|
48
|
-
|
46
|
+
/* We don't need to guard objects for rbx, so let's do nothing at all. */
|
47
|
+
#ifndef RB_GC_GUARD
|
48
|
+
#define RB_GC_GUARD(object)
|
49
|
+
#endif
|
49
50
|
|
50
51
|
/* fbuffer implementation */
|
51
52
|
|
@@ -123,6 +124,7 @@ typedef struct JSON_Generator_StateStruct {
|
|
123
124
|
long max_nesting;
|
124
125
|
char allow_nan;
|
125
126
|
char ascii_only;
|
127
|
+
char quirks_mode;
|
126
128
|
long depth;
|
127
129
|
} JSON_Generator_State;
|
128
130
|
|
@@ -78,15 +78,16 @@ static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
|
|
78
78
|
static VALUE CNaN, CInfinity, CMinusInfinity;
|
79
79
|
|
80
80
|
static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
|
81
|
-
i_chr, i_max_nesting, i_allow_nan, i_symbolize_names,
|
82
|
-
i_array_class, i_key_p, i_deep_const_get, i_match,
|
81
|
+
i_chr, i_max_nesting, i_allow_nan, i_symbolize_names, i_quirks_mode,
|
82
|
+
i_object_class, i_array_class, i_key_p, i_deep_const_get, i_match,
|
83
|
+
i_match_string, i_aset, i_leftshift;
|
83
84
|
|
84
85
|
|
85
|
-
#line
|
86
|
+
#line 109 "parser.rl"
|
86
87
|
|
87
88
|
|
88
89
|
|
89
|
-
#line
|
90
|
+
#line 91 "parser.c"
|
90
91
|
static const int JSON_object_start = 1;
|
91
92
|
static const int JSON_object_first_final = 27;
|
92
93
|
static const int JSON_object_error = 0;
|
@@ -94,10 +95,10 @@ static const int JSON_object_error = 0;
|
|
94
95
|
static const int JSON_object_en_main = 1;
|
95
96
|
|
96
97
|
|
97
|
-
#line
|
98
|
+
#line 150 "parser.rl"
|
98
99
|
|
99
100
|
|
100
|
-
static
|
101
|
+
static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
101
102
|
{
|
102
103
|
int cs = EVIL;
|
103
104
|
VALUE last_name = Qnil;
|
@@ -110,14 +111,14 @@ static const char *JSON_parse_object(JSON_Parser *json, const char *p, const cha
|
|
110
111
|
*result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class);
|
111
112
|
|
112
113
|
|
113
|
-
#line
|
114
|
+
#line 115 "parser.c"
|
114
115
|
{
|
115
116
|
cs = JSON_object_start;
|
116
117
|
}
|
117
118
|
|
118
|
-
#line
|
119
|
+
#line 165 "parser.rl"
|
119
120
|
|
120
|
-
#line
|
121
|
+
#line 122 "parser.c"
|
121
122
|
{
|
122
123
|
if ( p == pe )
|
123
124
|
goto _test_eof;
|
@@ -145,9 +146,9 @@ case 2:
|
|
145
146
|
goto st2;
|
146
147
|
goto st0;
|
147
148
|
tr2:
|
148
|
-
#line
|
149
|
+
#line 132 "parser.rl"
|
149
150
|
{
|
150
|
-
|
151
|
+
char *np;
|
151
152
|
json->parsing_name = 1;
|
152
153
|
np = JSON_parse_string(json, p, pe, &last_name);
|
153
154
|
json->parsing_name = 0;
|
@@ -158,7 +159,7 @@ st3:
|
|
158
159
|
if ( ++p == pe )
|
159
160
|
goto _test_eof3;
|
160
161
|
case 3:
|
161
|
-
#line
|
162
|
+
#line 163 "parser.c"
|
162
163
|
switch( (*p) ) {
|
163
164
|
case 13: goto st3;
|
164
165
|
case 32: goto st3;
|
@@ -225,10 +226,10 @@ case 8:
|
|
225
226
|
goto st8;
|
226
227
|
goto st0;
|
227
228
|
tr11:
|
228
|
-
#line
|
229
|
+
#line 117 "parser.rl"
|
229
230
|
{
|
230
231
|
VALUE v = Qnil;
|
231
|
-
|
232
|
+
char *np = JSON_parse_value(json, p, pe, &v);
|
232
233
|
if (np == NULL) {
|
233
234
|
p--; {p++; cs = 9; goto _out;}
|
234
235
|
} else {
|
@@ -245,7 +246,7 @@ st9:
|
|
245
246
|
if ( ++p == pe )
|
246
247
|
goto _test_eof9;
|
247
248
|
case 9:
|
248
|
-
#line
|
249
|
+
#line 250 "parser.c"
|
249
250
|
switch( (*p) ) {
|
250
251
|
case 13: goto st9;
|
251
252
|
case 32: goto st9;
|
@@ -334,14 +335,14 @@ case 18:
|
|
334
335
|
goto st9;
|
335
336
|
goto st18;
|
336
337
|
tr4:
|
337
|
-
#line
|
338
|
+
#line 140 "parser.rl"
|
338
339
|
{ p--; {p++; cs = 27; goto _out;} }
|
339
340
|
goto st27;
|
340
341
|
st27:
|
341
342
|
if ( ++p == pe )
|
342
343
|
goto _test_eof27;
|
343
344
|
case 27:
|
344
|
-
#line
|
345
|
+
#line 346 "parser.c"
|
345
346
|
goto st0;
|
346
347
|
st19:
|
347
348
|
if ( ++p == pe )
|
@@ -439,7 +440,7 @@ case 26:
|
|
439
440
|
_out: {}
|
440
441
|
}
|
441
442
|
|
442
|
-
#line
|
443
|
+
#line 166 "parser.rl"
|
443
444
|
|
444
445
|
if (cs >= JSON_object_first_final) {
|
445
446
|
if (json->create_additions) {
|
@@ -458,7 +459,8 @@ case 26:
|
|
458
459
|
}
|
459
460
|
|
460
461
|
|
461
|
-
|
462
|
+
|
463
|
+
#line 464 "parser.c"
|
462
464
|
static const int JSON_value_start = 1;
|
463
465
|
static const int JSON_value_first_final = 21;
|
464
466
|
static const int JSON_value_error = 0;
|
@@ -466,22 +468,22 @@ static const int JSON_value_error = 0;
|
|
466
468
|
static const int JSON_value_en_main = 1;
|
467
469
|
|
468
470
|
|
469
|
-
#line
|
471
|
+
#line 265 "parser.rl"
|
470
472
|
|
471
473
|
|
472
|
-
static
|
474
|
+
static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
473
475
|
{
|
474
476
|
int cs = EVIL;
|
475
477
|
|
476
478
|
|
477
|
-
#line
|
479
|
+
#line 480 "parser.c"
|
478
480
|
{
|
479
481
|
cs = JSON_value_start;
|
480
482
|
}
|
481
483
|
|
482
|
-
#line
|
484
|
+
#line 272 "parser.rl"
|
483
485
|
|
484
|
-
#line
|
486
|
+
#line 487 "parser.c"
|
485
487
|
{
|
486
488
|
if ( p == pe )
|
487
489
|
goto _test_eof;
|
@@ -506,17 +508,17 @@ st0:
|
|
506
508
|
cs = 0;
|
507
509
|
goto _out;
|
508
510
|
tr0:
|
509
|
-
#line
|
511
|
+
#line 213 "parser.rl"
|
510
512
|
{
|
511
|
-
|
513
|
+
char *np = JSON_parse_string(json, p, pe, result);
|
512
514
|
if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
|
513
515
|
}
|
514
516
|
goto st21;
|
515
517
|
tr2:
|
516
|
-
#line
|
518
|
+
#line 218 "parser.rl"
|
517
519
|
{
|
518
|
-
|
519
|
-
if(pe > p + 9 && !strncmp(MinusInfinity, p, 9)) {
|
520
|
+
char *np;
|
521
|
+
if(pe > p + 9 - json->quirks_mode && !strncmp(MinusInfinity, p, 9)) {
|
520
522
|
if (json->allow_nan) {
|
521
523
|
*result = CMinusInfinity;
|
522
524
|
{p = (( p + 10))-1;}
|
@@ -533,9 +535,9 @@ tr2:
|
|
533
535
|
}
|
534
536
|
goto st21;
|
535
537
|
tr5:
|
536
|
-
#line
|
538
|
+
#line 236 "parser.rl"
|
537
539
|
{
|
538
|
-
|
540
|
+
char *np;
|
539
541
|
json->current_nesting++;
|
540
542
|
np = JSON_parse_array(json, p, pe, result);
|
541
543
|
json->current_nesting--;
|
@@ -543,9 +545,9 @@ tr5:
|
|
543
545
|
}
|
544
546
|
goto st21;
|
545
547
|
tr9:
|
546
|
-
#line
|
548
|
+
#line 244 "parser.rl"
|
547
549
|
{
|
548
|
-
|
550
|
+
char *np;
|
549
551
|
json->current_nesting++;
|
550
552
|
np = JSON_parse_object(json, p, pe, result);
|
551
553
|
json->current_nesting--;
|
@@ -553,7 +555,7 @@ tr9:
|
|
553
555
|
}
|
554
556
|
goto st21;
|
555
557
|
tr16:
|
556
|
-
#line
|
558
|
+
#line 206 "parser.rl"
|
557
559
|
{
|
558
560
|
if (json->allow_nan) {
|
559
561
|
*result = CInfinity;
|
@@ -563,7 +565,7 @@ tr16:
|
|
563
565
|
}
|
564
566
|
goto st21;
|
565
567
|
tr18:
|
566
|
-
#line
|
568
|
+
#line 199 "parser.rl"
|
567
569
|
{
|
568
570
|
if (json->allow_nan) {
|
569
571
|
*result = CNaN;
|
@@ -573,19 +575,19 @@ tr18:
|
|
573
575
|
}
|
574
576
|
goto st21;
|
575
577
|
tr22:
|
576
|
-
#line
|
578
|
+
#line 193 "parser.rl"
|
577
579
|
{
|
578
580
|
*result = Qfalse;
|
579
581
|
}
|
580
582
|
goto st21;
|
581
583
|
tr25:
|
582
|
-
#line
|
584
|
+
#line 190 "parser.rl"
|
583
585
|
{
|
584
586
|
*result = Qnil;
|
585
587
|
}
|
586
588
|
goto st21;
|
587
589
|
tr28:
|
588
|
-
#line
|
590
|
+
#line 196 "parser.rl"
|
589
591
|
{
|
590
592
|
*result = Qtrue;
|
591
593
|
}
|
@@ -594,9 +596,9 @@ st21:
|
|
594
596
|
if ( ++p == pe )
|
595
597
|
goto _test_eof21;
|
596
598
|
case 21:
|
597
|
-
#line
|
599
|
+
#line 252 "parser.rl"
|
598
600
|
{ p--; {p++; cs = 21; goto _out;} }
|
599
|
-
#line
|
601
|
+
#line 602 "parser.c"
|
600
602
|
goto st0;
|
601
603
|
st2:
|
602
604
|
if ( ++p == pe )
|
@@ -757,7 +759,7 @@ case 20:
|
|
757
759
|
_out: {}
|
758
760
|
}
|
759
761
|
|
760
|
-
#line
|
762
|
+
#line 273 "parser.rl"
|
761
763
|
|
762
764
|
if (cs >= JSON_value_first_final) {
|
763
765
|
return p;
|
@@ -767,31 +769,31 @@ case 20:
|
|
767
769
|
}
|
768
770
|
|
769
771
|
|
770
|
-
#line
|
772
|
+
#line 773 "parser.c"
|
771
773
|
static const int JSON_integer_start = 1;
|
772
|
-
static const int JSON_integer_first_final =
|
774
|
+
static const int JSON_integer_first_final = 3;
|
773
775
|
static const int JSON_integer_error = 0;
|
774
776
|
|
775
777
|
static const int JSON_integer_en_main = 1;
|
776
778
|
|
777
779
|
|
778
|
-
#line
|
780
|
+
#line 289 "parser.rl"
|
779
781
|
|
780
782
|
|
781
|
-
static
|
783
|
+
static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
782
784
|
{
|
783
785
|
int cs = EVIL;
|
784
786
|
|
785
787
|
|
786
|
-
#line
|
788
|
+
#line 789 "parser.c"
|
787
789
|
{
|
788
790
|
cs = JSON_integer_start;
|
789
791
|
}
|
790
792
|
|
791
|
-
#line
|
793
|
+
#line 296 "parser.rl"
|
792
794
|
json->memo = p;
|
793
795
|
|
794
|
-
#line
|
796
|
+
#line 797 "parser.c"
|
795
797
|
{
|
796
798
|
if ( p == pe )
|
797
799
|
goto _test_eof;
|
@@ -803,7 +805,7 @@ case 1:
|
|
803
805
|
case 48: goto st3;
|
804
806
|
}
|
805
807
|
if ( 49 <= (*p) && (*p) <= 57 )
|
806
|
-
goto
|
808
|
+
goto st5;
|
807
809
|
goto st0;
|
808
810
|
st0:
|
809
811
|
cs = 0;
|
@@ -815,7 +817,7 @@ case 2:
|
|
815
817
|
if ( (*p) == 48 )
|
816
818
|
goto st3;
|
817
819
|
if ( 49 <= (*p) && (*p) <= 57 )
|
818
|
-
goto
|
820
|
+
goto st5;
|
819
821
|
goto st0;
|
820
822
|
st3:
|
821
823
|
if ( ++p == pe )
|
@@ -825,33 +827,33 @@ case 3:
|
|
825
827
|
goto st0;
|
826
828
|
goto tr4;
|
827
829
|
tr4:
|
828
|
-
#line
|
829
|
-
{ p--; {p++; cs =
|
830
|
-
goto
|
831
|
-
st5:
|
832
|
-
if ( ++p == pe )
|
833
|
-
goto _test_eof5;
|
834
|
-
case 5:
|
835
|
-
#line 836 "parser.c"
|
836
|
-
goto st0;
|
830
|
+
#line 286 "parser.rl"
|
831
|
+
{ p--; {p++; cs = 4; goto _out;} }
|
832
|
+
goto st4;
|
837
833
|
st4:
|
838
834
|
if ( ++p == pe )
|
839
835
|
goto _test_eof4;
|
840
836
|
case 4:
|
837
|
+
#line 838 "parser.c"
|
838
|
+
goto st0;
|
839
|
+
st5:
|
840
|
+
if ( ++p == pe )
|
841
|
+
goto _test_eof5;
|
842
|
+
case 5:
|
841
843
|
if ( 48 <= (*p) && (*p) <= 57 )
|
842
|
-
goto
|
844
|
+
goto st5;
|
843
845
|
goto tr4;
|
844
846
|
}
|
845
847
|
_test_eof2: cs = 2; goto _test_eof;
|
846
848
|
_test_eof3: cs = 3; goto _test_eof;
|
847
|
-
_test_eof5: cs = 5; goto _test_eof;
|
848
849
|
_test_eof4: cs = 4; goto _test_eof;
|
850
|
+
_test_eof5: cs = 5; goto _test_eof;
|
849
851
|
|
850
852
|
_test_eof: {}
|
851
853
|
_out: {}
|
852
854
|
}
|
853
855
|
|
854
|
-
#line
|
856
|
+
#line 298 "parser.rl"
|
855
857
|
|
856
858
|
if (cs >= JSON_integer_first_final) {
|
857
859
|
long len = p - json->memo;
|
@@ -863,31 +865,31 @@ case 4:
|
|
863
865
|
}
|
864
866
|
|
865
867
|
|
866
|
-
#line
|
868
|
+
#line 869 "parser.c"
|
867
869
|
static const int JSON_float_start = 1;
|
868
|
-
static const int JSON_float_first_final =
|
870
|
+
static const int JSON_float_first_final = 8;
|
869
871
|
static const int JSON_float_error = 0;
|
870
872
|
|
871
873
|
static const int JSON_float_en_main = 1;
|
872
874
|
|
873
875
|
|
874
|
-
#line
|
876
|
+
#line 320 "parser.rl"
|
875
877
|
|
876
878
|
|
877
|
-
static
|
879
|
+
static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
878
880
|
{
|
879
881
|
int cs = EVIL;
|
880
882
|
|
881
883
|
|
882
|
-
#line
|
884
|
+
#line 885 "parser.c"
|
883
885
|
{
|
884
886
|
cs = JSON_float_start;
|
885
887
|
}
|
886
888
|
|
887
|
-
#line
|
889
|
+
#line 327 "parser.rl"
|
888
890
|
json->memo = p;
|
889
891
|
|
890
|
-
#line
|
892
|
+
#line 893 "parser.c"
|
891
893
|
{
|
892
894
|
if ( p == pe )
|
893
895
|
goto _test_eof;
|
@@ -899,7 +901,7 @@ case 1:
|
|
899
901
|
case 48: goto st3;
|
900
902
|
}
|
901
903
|
if ( 49 <= (*p) && (*p) <= 57 )
|
902
|
-
goto
|
904
|
+
goto st7;
|
903
905
|
goto st0;
|
904
906
|
st0:
|
905
907
|
cs = 0;
|
@@ -911,7 +913,7 @@ case 2:
|
|
911
913
|
if ( (*p) == 48 )
|
912
914
|
goto st3;
|
913
915
|
if ( 49 <= (*p) && (*p) <= 57 )
|
914
|
-
goto
|
916
|
+
goto st7;
|
915
917
|
goto st0;
|
916
918
|
st3:
|
917
919
|
if ( ++p == pe )
|
@@ -919,8 +921,8 @@ st3:
|
|
919
921
|
case 3:
|
920
922
|
switch( (*p) ) {
|
921
923
|
case 46: goto st4;
|
922
|
-
case 69: goto
|
923
|
-
case 101: goto
|
924
|
+
case 69: goto st5;
|
925
|
+
case 101: goto st5;
|
924
926
|
}
|
925
927
|
goto st0;
|
926
928
|
st4:
|
@@ -928,92 +930,92 @@ st4:
|
|
928
930
|
goto _test_eof4;
|
929
931
|
case 4:
|
930
932
|
if ( 48 <= (*p) && (*p) <= 57 )
|
931
|
-
goto
|
933
|
+
goto st8;
|
932
934
|
goto st0;
|
933
|
-
|
935
|
+
st8:
|
934
936
|
if ( ++p == pe )
|
935
|
-
goto
|
936
|
-
case
|
937
|
+
goto _test_eof8;
|
938
|
+
case 8:
|
937
939
|
switch( (*p) ) {
|
938
|
-
case 69: goto
|
939
|
-
case 101: goto
|
940
|
+
case 69: goto st5;
|
941
|
+
case 101: goto st5;
|
940
942
|
}
|
941
943
|
if ( (*p) > 46 ) {
|
942
944
|
if ( 48 <= (*p) && (*p) <= 57 )
|
943
|
-
goto
|
945
|
+
goto st8;
|
944
946
|
} else if ( (*p) >= 45 )
|
945
947
|
goto st0;
|
946
|
-
goto
|
947
|
-
|
948
|
-
#line
|
949
|
-
{ p--; {p++; cs =
|
950
|
-
goto
|
951
|
-
|
948
|
+
goto tr9;
|
949
|
+
tr9:
|
950
|
+
#line 314 "parser.rl"
|
951
|
+
{ p--; {p++; cs = 9; goto _out;} }
|
952
|
+
goto st9;
|
953
|
+
st9:
|
952
954
|
if ( ++p == pe )
|
953
|
-
goto
|
954
|
-
case
|
955
|
-
#line
|
955
|
+
goto _test_eof9;
|
956
|
+
case 9:
|
957
|
+
#line 958 "parser.c"
|
956
958
|
goto st0;
|
957
|
-
|
959
|
+
st5:
|
958
960
|
if ( ++p == pe )
|
959
|
-
goto
|
960
|
-
case
|
961
|
+
goto _test_eof5;
|
962
|
+
case 5:
|
961
963
|
switch( (*p) ) {
|
962
|
-
case 43: goto
|
963
|
-
case 45: goto
|
964
|
+
case 43: goto st6;
|
965
|
+
case 45: goto st6;
|
964
966
|
}
|
965
967
|
if ( 48 <= (*p) && (*p) <= 57 )
|
966
|
-
goto
|
968
|
+
goto st10;
|
967
969
|
goto st0;
|
968
|
-
|
970
|
+
st6:
|
969
971
|
if ( ++p == pe )
|
970
|
-
goto
|
971
|
-
case
|
972
|
+
goto _test_eof6;
|
973
|
+
case 6:
|
972
974
|
if ( 48 <= (*p) && (*p) <= 57 )
|
973
|
-
goto
|
975
|
+
goto st10;
|
974
976
|
goto st0;
|
975
|
-
|
977
|
+
st10:
|
976
978
|
if ( ++p == pe )
|
977
|
-
goto
|
978
|
-
case
|
979
|
+
goto _test_eof10;
|
980
|
+
case 10:
|
979
981
|
switch( (*p) ) {
|
980
982
|
case 69: goto st0;
|
981
983
|
case 101: goto st0;
|
982
984
|
}
|
983
985
|
if ( (*p) > 46 ) {
|
984
986
|
if ( 48 <= (*p) && (*p) <= 57 )
|
985
|
-
goto
|
987
|
+
goto st10;
|
986
988
|
} else if ( (*p) >= 45 )
|
987
989
|
goto st0;
|
988
|
-
goto
|
989
|
-
|
990
|
+
goto tr9;
|
991
|
+
st7:
|
990
992
|
if ( ++p == pe )
|
991
|
-
goto
|
992
|
-
case
|
993
|
+
goto _test_eof7;
|
994
|
+
case 7:
|
993
995
|
switch( (*p) ) {
|
994
996
|
case 46: goto st4;
|
995
|
-
case 69: goto
|
996
|
-
case 101: goto
|
997
|
+
case 69: goto st5;
|
998
|
+
case 101: goto st5;
|
997
999
|
}
|
998
1000
|
if ( 48 <= (*p) && (*p) <= 57 )
|
999
|
-
goto
|
1001
|
+
goto st7;
|
1000
1002
|
goto st0;
|
1001
1003
|
}
|
1002
1004
|
_test_eof2: cs = 2; goto _test_eof;
|
1003
1005
|
_test_eof3: cs = 3; goto _test_eof;
|
1004
1006
|
_test_eof4: cs = 4; goto _test_eof;
|
1007
|
+
_test_eof8: cs = 8; goto _test_eof;
|
1008
|
+
_test_eof9: cs = 9; goto _test_eof;
|
1005
1009
|
_test_eof5: cs = 5; goto _test_eof;
|
1006
|
-
_test_eof10: cs = 10; goto _test_eof;
|
1007
1010
|
_test_eof6: cs = 6; goto _test_eof;
|
1011
|
+
_test_eof10: cs = 10; goto _test_eof;
|
1008
1012
|
_test_eof7: cs = 7; goto _test_eof;
|
1009
|
-
_test_eof8: cs = 8; goto _test_eof;
|
1010
|
-
_test_eof9: cs = 9; goto _test_eof;
|
1011
1013
|
|
1012
1014
|
_test_eof: {}
|
1013
1015
|
_out: {}
|
1014
1016
|
}
|
1015
1017
|
|
1016
|
-
#line
|
1018
|
+
#line 329 "parser.rl"
|
1017
1019
|
|
1018
1020
|
if (cs >= JSON_float_first_final) {
|
1019
1021
|
long len = p - json->memo;
|
@@ -1026,7 +1028,7 @@ case 9:
|
|
1026
1028
|
|
1027
1029
|
|
1028
1030
|
|
1029
|
-
#line
|
1031
|
+
#line 1032 "parser.c"
|
1030
1032
|
static const int JSON_array_start = 1;
|
1031
1033
|
static const int JSON_array_first_final = 17;
|
1032
1034
|
static const int JSON_array_error = 0;
|
@@ -1034,10 +1036,10 @@ static const int JSON_array_error = 0;
|
|
1034
1036
|
static const int JSON_array_en_main = 1;
|
1035
1037
|
|
1036
1038
|
|
1037
|
-
#line
|
1039
|
+
#line 369 "parser.rl"
|
1038
1040
|
|
1039
1041
|
|
1040
|
-
static
|
1042
|
+
static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
1041
1043
|
{
|
1042
1044
|
int cs = EVIL;
|
1043
1045
|
VALUE array_class = json->array_class;
|
@@ -1048,14 +1050,14 @@ static const char *JSON_parse_array(JSON_Parser *json, const char *p, const char
|
|
1048
1050
|
*result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class);
|
1049
1051
|
|
1050
1052
|
|
1051
|
-
#line
|
1053
|
+
#line 1054 "parser.c"
|
1052
1054
|
{
|
1053
1055
|
cs = JSON_array_start;
|
1054
1056
|
}
|
1055
1057
|
|
1056
|
-
#line
|
1058
|
+
#line 382 "parser.rl"
|
1057
1059
|
|
1058
|
-
#line
|
1060
|
+
#line 1061 "parser.c"
|
1059
1061
|
{
|
1060
1062
|
if ( p == pe )
|
1061
1063
|
goto _test_eof;
|
@@ -1094,10 +1096,10 @@ case 2:
|
|
1094
1096
|
goto st2;
|
1095
1097
|
goto st0;
|
1096
1098
|
tr2:
|
1097
|
-
#line
|
1099
|
+
#line 346 "parser.rl"
|
1098
1100
|
{
|
1099
1101
|
VALUE v = Qnil;
|
1100
|
-
|
1102
|
+
char *np = JSON_parse_value(json, p, pe, &v);
|
1101
1103
|
if (np == NULL) {
|
1102
1104
|
p--; {p++; cs = 3; goto _out;}
|
1103
1105
|
} else {
|
@@ -1114,7 +1116,7 @@ st3:
|
|
1114
1116
|
if ( ++p == pe )
|
1115
1117
|
goto _test_eof3;
|
1116
1118
|
case 3:
|
1117
|
-
#line
|
1119
|
+
#line 1120 "parser.c"
|
1118
1120
|
switch( (*p) ) {
|
1119
1121
|
case 13: goto st3;
|
1120
1122
|
case 32: goto st3;
|
@@ -1214,14 +1216,14 @@ case 12:
|
|
1214
1216
|
goto st3;
|
1215
1217
|
goto st12;
|
1216
1218
|
tr4:
|
1217
|
-
#line
|
1219
|
+
#line 361 "parser.rl"
|
1218
1220
|
{ p--; {p++; cs = 17; goto _out;} }
|
1219
1221
|
goto st17;
|
1220
1222
|
st17:
|
1221
1223
|
if ( ++p == pe )
|
1222
1224
|
goto _test_eof17;
|
1223
1225
|
case 17:
|
1224
|
-
#line
|
1226
|
+
#line 1227 "parser.c"
|
1225
1227
|
goto st0;
|
1226
1228
|
st13:
|
1227
1229
|
if ( ++p == pe )
|
@@ -1277,7 +1279,7 @@ case 16:
|
|
1277
1279
|
_out: {}
|
1278
1280
|
}
|
1279
1281
|
|
1280
|
-
#line
|
1282
|
+
#line 383 "parser.rl"
|
1281
1283
|
|
1282
1284
|
if(cs >= JSON_array_first_final) {
|
1283
1285
|
return p + 1;
|
@@ -1287,9 +1289,9 @@ case 16:
|
|
1287
1289
|
}
|
1288
1290
|
}
|
1289
1291
|
|
1290
|
-
static VALUE json_string_unescape(VALUE result,
|
1292
|
+
static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
|
1291
1293
|
{
|
1292
|
-
|
1294
|
+
char *p = string, *pe = string, *unescape;
|
1293
1295
|
int unescape_len;
|
1294
1296
|
|
1295
1297
|
while (pe < stringEnd) {
|
@@ -1358,7 +1360,7 @@ static VALUE json_string_unescape(VALUE result, const char *string, const char *
|
|
1358
1360
|
}
|
1359
1361
|
|
1360
1362
|
|
1361
|
-
#line
|
1363
|
+
#line 1364 "parser.c"
|
1362
1364
|
static const int JSON_string_start = 1;
|
1363
1365
|
static const int JSON_string_first_final = 8;
|
1364
1366
|
static const int JSON_string_error = 0;
|
@@ -1366,7 +1368,7 @@ static const int JSON_string_error = 0;
|
|
1366
1368
|
static const int JSON_string_en_main = 1;
|
1367
1369
|
|
1368
1370
|
|
1369
|
-
#line
|
1371
|
+
#line 482 "parser.rl"
|
1370
1372
|
|
1371
1373
|
|
1372
1374
|
static int
|
@@ -1381,20 +1383,22 @@ match_i(VALUE regexp, VALUE klass, VALUE memo)
|
|
1381
1383
|
return ST_CONTINUE;
|
1382
1384
|
}
|
1383
1385
|
|
1384
|
-
static
|
1386
|
+
static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
1385
1387
|
{
|
1386
1388
|
int cs = EVIL;
|
1389
|
+
VALUE match_string;
|
1390
|
+
|
1387
1391
|
*result = rb_str_buf_new(0);
|
1388
1392
|
|
1389
|
-
#line
|
1393
|
+
#line 1394 "parser.c"
|
1390
1394
|
{
|
1391
1395
|
cs = JSON_string_start;
|
1392
1396
|
}
|
1393
1397
|
|
1394
|
-
#line
|
1398
|
+
#line 503 "parser.rl"
|
1395
1399
|
json->memo = p;
|
1396
1400
|
|
1397
|
-
#line
|
1401
|
+
#line 1402 "parser.c"
|
1398
1402
|
{
|
1399
1403
|
if ( p == pe )
|
1400
1404
|
goto _test_eof;
|
@@ -1419,7 +1423,7 @@ case 2:
|
|
1419
1423
|
goto st0;
|
1420
1424
|
goto st2;
|
1421
1425
|
tr2:
|
1422
|
-
#line
|
1426
|
+
#line 468 "parser.rl"
|
1423
1427
|
{
|
1424
1428
|
*result = json_string_unescape(*result, json->memo + 1, p);
|
1425
1429
|
if (NIL_P(*result)) {
|
@@ -1430,14 +1434,14 @@ tr2:
|
|
1430
1434
|
{p = (( p + 1))-1;}
|
1431
1435
|
}
|
1432
1436
|
}
|
1433
|
-
#line
|
1437
|
+
#line 479 "parser.rl"
|
1434
1438
|
{ p--; {p++; cs = 8; goto _out;} }
|
1435
1439
|
goto st8;
|
1436
1440
|
st8:
|
1437
1441
|
if ( ++p == pe )
|
1438
1442
|
goto _test_eof8;
|
1439
1443
|
case 8:
|
1440
|
-
#line
|
1444
|
+
#line 1445 "parser.c"
|
1441
1445
|
goto st0;
|
1442
1446
|
st3:
|
1443
1447
|
if ( ++p == pe )
|
@@ -1513,11 +1517,9 @@ case 7:
|
|
1513
1517
|
_out: {}
|
1514
1518
|
}
|
1515
1519
|
|
1516
|
-
#line
|
1520
|
+
#line 505 "parser.rl"
|
1517
1521
|
|
1518
|
-
if (json->create_additions) {
|
1519
|
-
VALUE match_string = json->match_string;
|
1520
|
-
if (RTEST(match_string)) {
|
1522
|
+
if (json->create_additions && RTEST(match_string = json->match_string)) {
|
1521
1523
|
VALUE klass;
|
1522
1524
|
VALUE memo = rb_ary_new2(2);
|
1523
1525
|
rb_ary_push(memo, *result);
|
@@ -1526,7 +1528,6 @@ case 7:
|
|
1526
1528
|
if (RTEST(klass)) {
|
1527
1529
|
*result = rb_funcall(klass, i_json_create, 1, *result);
|
1528
1530
|
}
|
1529
|
-
}
|
1530
1531
|
}
|
1531
1532
|
|
1532
1533
|
if (json->symbolize_names && json->parsing_name) {
|
@@ -1539,19 +1540,6 @@ case 7:
|
|
1539
1540
|
}
|
1540
1541
|
}
|
1541
1542
|
|
1542
|
-
|
1543
|
-
|
1544
|
-
#line 1545 "parser.c"
|
1545
|
-
static const int JSON_start = 1;
|
1546
|
-
static const int JSON_first_final = 10;
|
1547
|
-
static const int JSON_error = 0;
|
1548
|
-
|
1549
|
-
static const int JSON_en_main = 1;
|
1550
|
-
|
1551
|
-
|
1552
|
-
#line 551 "parser.rl"
|
1553
|
-
|
1554
|
-
|
1555
1543
|
/*
|
1556
1544
|
* Document-class: JSON::Ext::Parser
|
1557
1545
|
*
|
@@ -1566,7 +1554,7 @@ static const int JSON_en_main = 1;
|
|
1566
1554
|
|
1567
1555
|
static VALUE convert_encoding(VALUE source)
|
1568
1556
|
{
|
1569
|
-
|
1557
|
+
char *ptr = RSTRING_PTR(source);
|
1570
1558
|
long len = RSTRING_LEN(source);
|
1571
1559
|
if (len < 2) {
|
1572
1560
|
rb_raise(eParserError, "A JSON text must at least contain two octets!");
|
@@ -1605,12 +1593,15 @@ static VALUE convert_encoding(VALUE source)
|
|
1605
1593
|
return source;
|
1606
1594
|
}
|
1607
1595
|
|
1608
|
-
|
1609
|
-
|
1610
|
-
|
1611
|
-
|
1612
|
-
|
1613
|
-
|
1596
|
+
#if defined MAGLEV
|
1597
|
+
// Maglev doesn't support the mark function, keep a reference in the object
|
1598
|
+
#define QUOTE(x) #x
|
1599
|
+
#define PARSER_SET_REFERENCE(json, field, val) \
|
1600
|
+
(json)->field = (val); \
|
1601
|
+
rb_iv_set(json->dwrapped_parser, QUOTE(@field), (json)->field);
|
1602
|
+
#else
|
1603
|
+
#define PARSER_SET_REFERENCE(json, field, val) (json)->field = (val);
|
1604
|
+
#endif
|
1614
1605
|
|
1615
1606
|
/*
|
1616
1607
|
* call-seq: new(source, opts => {})
|
@@ -1637,27 +1628,19 @@ static inline void parser_iv_set(JSON_Parser *json, const char* iv_name, VALUE v
|
|
1637
1628
|
* defaults to true.
|
1638
1629
|
* * *object_class*: Defaults to Hash
|
1639
1630
|
* * *array_class*: Defaults to Array
|
1631
|
+
* * *quirks_mode*: Enables quirks_mode for parser, that is for example
|
1632
|
+
* parsing single JSON values instead of documents is possible.
|
1633
|
+
*
|
1640
1634
|
*/
|
1641
|
-
|
1642
|
-
static int init_count = 0;
|
1643
1635
|
static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
|
1644
1636
|
{
|
1645
|
-
const char *ptr;
|
1646
|
-
long len;
|
1647
1637
|
VALUE source, opts;
|
1648
|
-
|
1649
1638
|
GET_PARSER_INIT;
|
1650
|
-
init_count += 1;
|
1651
1639
|
|
1652
|
-
|
1653
|
-
if (json->Vsource) {
|
1640
|
+
if (RTEST(json->Vsource)) {
|
1654
1641
|
rb_raise(rb_eTypeError, "already initialized instance");
|
1655
1642
|
}
|
1656
|
-
#endif
|
1657
1643
|
rb_scan_args(argc, argv, "11", &source, &opts);
|
1658
|
-
source = convert_encoding(StringValue(source));
|
1659
|
-
ptr = RSTRING_PTR(source);
|
1660
|
-
len = RSTRING_LEN(source);
|
1661
1644
|
if (!NIL_P(opts)) {
|
1662
1645
|
opts = rb_convert_type(opts, T_HASH, "Hash", "to_hash");
|
1663
1646
|
if (NIL_P(opts)) {
|
@@ -1687,6 +1670,13 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
|
|
1687
1670
|
} else {
|
1688
1671
|
json->symbolize_names = 0;
|
1689
1672
|
}
|
1673
|
+
tmp = ID2SYM(i_quirks_mode);
|
1674
|
+
if (option_given_p(opts, tmp)) {
|
1675
|
+
VALUE quirks_mode = rb_hash_aref(opts, tmp);
|
1676
|
+
json->quirks_mode = RTEST(quirks_mode) ? 1 : 0;
|
1677
|
+
} else {
|
1678
|
+
json->quirks_mode = 0;
|
1679
|
+
}
|
1690
1680
|
tmp = ID2SYM(i_create_additions);
|
1691
1681
|
if (option_given_p(opts, tmp)) {
|
1692
1682
|
json->create_additions = RTEST(rb_hash_aref(opts, tmp));
|
@@ -1695,52 +1685,63 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
|
|
1695
1685
|
}
|
1696
1686
|
tmp = ID2SYM(i_create_id);
|
1697
1687
|
if (option_given_p(opts, tmp)) {
|
1698
|
-
json
|
1688
|
+
PARSER_SET_REFERENCE(json, create_id, rb_hash_aref(opts, tmp));
|
1699
1689
|
} else {
|
1700
|
-
json
|
1690
|
+
PARSER_SET_REFERENCE(json, create_id, rb_funcall(mJSON, i_create_id, 0));
|
1701
1691
|
}
|
1702
|
-
parser_iv_set(json, "@create_id", json->create_id);
|
1703
1692
|
tmp = ID2SYM(i_object_class);
|
1704
1693
|
if (option_given_p(opts, tmp)) {
|
1705
|
-
json
|
1706
|
-
|
1694
|
+
PARSER_SET_REFERENCE(json, object_class, rb_hash_aref(opts, tmp));
|
1695
|
+
} else {
|
1696
|
+
PARSER_SET_REFERENCE(json, object_class, Qnil);
|
1707
1697
|
}
|
1708
1698
|
tmp = ID2SYM(i_array_class);
|
1709
1699
|
if (option_given_p(opts, tmp)) {
|
1710
|
-
json
|
1711
|
-
|
1700
|
+
PARSER_SET_REFERENCE(json, array_class, rb_hash_aref(opts, tmp));
|
1701
|
+
} else {
|
1702
|
+
PARSER_SET_REFERENCE(json, array_class, Qnil);
|
1712
1703
|
}
|
1713
1704
|
tmp = ID2SYM(i_match_string);
|
1714
1705
|
if (option_given_p(opts, tmp)) {
|
1715
1706
|
VALUE match_string = rb_hash_aref(opts, tmp);
|
1716
|
-
json
|
1717
|
-
|
1707
|
+
PARSER_SET_REFERENCE(json, match_string, RTEST(match_string) ? match_string : Qnil);
|
1708
|
+
} else {
|
1709
|
+
PARSER_SET_REFERENCE(json, match_string, Qnil);
|
1718
1710
|
}
|
1719
1711
|
}
|
1720
1712
|
} else {
|
1721
1713
|
json->max_nesting = 19;
|
1722
1714
|
json->allow_nan = 0;
|
1723
1715
|
json->create_additions = 1;
|
1724
|
-
json
|
1725
|
-
|
1716
|
+
PARSER_SET_REFERENCE(json, create_id, rb_funcall(mJSON, i_create_id, 0));
|
1717
|
+
json->object_class = Qnil;
|
1718
|
+
json->array_class = Qnil;
|
1719
|
+
}
|
1720
|
+
if (!json->quirks_mode) {
|
1721
|
+
source = convert_encoding(StringValue(source));
|
1726
1722
|
}
|
1727
1723
|
json->current_nesting = 0;
|
1728
|
-
json->len =
|
1729
|
-
json->source =
|
1730
|
-
json
|
1731
|
-
parser_iv_set(json, "@vsource", json->Vsource);
|
1724
|
+
json->len = RSTRING_LEN(source);
|
1725
|
+
json->source = RSTRING_PTR(source);;
|
1726
|
+
PARSER_SET_REFERENCE(json, Vsource, source);
|
1732
1727
|
return self;
|
1733
1728
|
}
|
1734
1729
|
|
1735
|
-
|
1736
|
-
|
1737
|
-
|
1738
|
-
|
1739
|
-
|
1740
|
-
|
1741
|
-
static
|
1730
|
+
|
1731
|
+
#line 1729 "parser.c"
|
1732
|
+
static const int JSON_start = 1;
|
1733
|
+
static const int JSON_first_final = 10;
|
1734
|
+
static const int JSON_error = 0;
|
1735
|
+
|
1736
|
+
static const int JSON_en_main = 1;
|
1737
|
+
|
1738
|
+
|
1739
|
+
#line 736 "parser.rl"
|
1740
|
+
|
1741
|
+
|
1742
|
+
static VALUE cParser_parse_strict(VALUE self)
|
1742
1743
|
{
|
1743
|
-
|
1744
|
+
char *p, *pe;
|
1744
1745
|
int cs = EVIL;
|
1745
1746
|
VALUE result = Qnil;
|
1746
1747
|
GET_PARSER;
|
@@ -1751,7 +1752,7 @@ static VALUE cParser_parse(VALUE self)
|
|
1751
1752
|
cs = JSON_start;
|
1752
1753
|
}
|
1753
1754
|
|
1754
|
-
#line
|
1755
|
+
#line 746 "parser.rl"
|
1755
1756
|
p = json->source;
|
1756
1757
|
pe = p + json->len;
|
1757
1758
|
|
@@ -1811,18 +1812,18 @@ case 5:
|
|
1811
1812
|
goto st1;
|
1812
1813
|
goto st5;
|
1813
1814
|
tr3:
|
1814
|
-
#line
|
1815
|
+
#line 725 "parser.rl"
|
1815
1816
|
{
|
1816
|
-
|
1817
|
+
char *np;
|
1817
1818
|
json->current_nesting = 1;
|
1818
1819
|
np = JSON_parse_array(json, p, pe, &result);
|
1819
1820
|
if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
|
1820
1821
|
}
|
1821
1822
|
goto st10;
|
1822
1823
|
tr4:
|
1823
|
-
#line
|
1824
|
+
#line 718 "parser.rl"
|
1824
1825
|
{
|
1825
|
-
|
1826
|
+
char *np;
|
1826
1827
|
json->current_nesting = 1;
|
1827
1828
|
np = JSON_parse_object(json, p, pe, &result);
|
1828
1829
|
if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
|
@@ -1889,7 +1890,7 @@ case 9:
|
|
1889
1890
|
_out: {}
|
1890
1891
|
}
|
1891
1892
|
|
1892
|
-
#line
|
1893
|
+
#line 749 "parser.rl"
|
1893
1894
|
|
1894
1895
|
if (cs >= JSON_first_final && p == pe) {
|
1895
1896
|
return result;
|
@@ -1899,6 +1900,197 @@ case 9:
|
|
1899
1900
|
}
|
1900
1901
|
}
|
1901
1902
|
|
1903
|
+
|
1904
|
+
|
1905
|
+
#line 1903 "parser.c"
|
1906
|
+
static const int JSON_quirks_mode_start = 1;
|
1907
|
+
static const int JSON_quirks_mode_first_final = 10;
|
1908
|
+
static const int JSON_quirks_mode_error = 0;
|
1909
|
+
|
1910
|
+
static const int JSON_quirks_mode_en_main = 1;
|
1911
|
+
|
1912
|
+
|
1913
|
+
#line 774 "parser.rl"
|
1914
|
+
|
1915
|
+
|
1916
|
+
static VALUE cParser_parse_quirks_mode(VALUE self)
|
1917
|
+
{
|
1918
|
+
char *p, *pe;
|
1919
|
+
int cs = EVIL;
|
1920
|
+
VALUE result = Qnil;
|
1921
|
+
GET_PARSER;
|
1922
|
+
|
1923
|
+
|
1924
|
+
#line 1922 "parser.c"
|
1925
|
+
{
|
1926
|
+
cs = JSON_quirks_mode_start;
|
1927
|
+
}
|
1928
|
+
|
1929
|
+
#line 784 "parser.rl"
|
1930
|
+
p = json->source;
|
1931
|
+
pe = p + json->len;
|
1932
|
+
|
1933
|
+
#line 1931 "parser.c"
|
1934
|
+
{
|
1935
|
+
if ( p == pe )
|
1936
|
+
goto _test_eof;
|
1937
|
+
switch ( cs )
|
1938
|
+
{
|
1939
|
+
st1:
|
1940
|
+
if ( ++p == pe )
|
1941
|
+
goto _test_eof1;
|
1942
|
+
case 1:
|
1943
|
+
switch( (*p) ) {
|
1944
|
+
case 13: goto st1;
|
1945
|
+
case 32: goto st1;
|
1946
|
+
case 34: goto tr2;
|
1947
|
+
case 45: goto tr2;
|
1948
|
+
case 47: goto st6;
|
1949
|
+
case 73: goto tr2;
|
1950
|
+
case 78: goto tr2;
|
1951
|
+
case 91: goto tr2;
|
1952
|
+
case 102: goto tr2;
|
1953
|
+
case 110: goto tr2;
|
1954
|
+
case 116: goto tr2;
|
1955
|
+
case 123: goto tr2;
|
1956
|
+
}
|
1957
|
+
if ( (*p) > 10 ) {
|
1958
|
+
if ( 48 <= (*p) && (*p) <= 57 )
|
1959
|
+
goto tr2;
|
1960
|
+
} else if ( (*p) >= 9 )
|
1961
|
+
goto st1;
|
1962
|
+
goto st0;
|
1963
|
+
st0:
|
1964
|
+
cs = 0;
|
1965
|
+
goto _out;
|
1966
|
+
tr2:
|
1967
|
+
#line 766 "parser.rl"
|
1968
|
+
{
|
1969
|
+
char *np = JSON_parse_value(json, p, pe, &result);
|
1970
|
+
if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
|
1971
|
+
}
|
1972
|
+
goto st10;
|
1973
|
+
st10:
|
1974
|
+
if ( ++p == pe )
|
1975
|
+
goto _test_eof10;
|
1976
|
+
case 10:
|
1977
|
+
#line 1975 "parser.c"
|
1978
|
+
switch( (*p) ) {
|
1979
|
+
case 13: goto st10;
|
1980
|
+
case 32: goto st10;
|
1981
|
+
case 47: goto st2;
|
1982
|
+
}
|
1983
|
+
if ( 9 <= (*p) && (*p) <= 10 )
|
1984
|
+
goto st10;
|
1985
|
+
goto st0;
|
1986
|
+
st2:
|
1987
|
+
if ( ++p == pe )
|
1988
|
+
goto _test_eof2;
|
1989
|
+
case 2:
|
1990
|
+
switch( (*p) ) {
|
1991
|
+
case 42: goto st3;
|
1992
|
+
case 47: goto st5;
|
1993
|
+
}
|
1994
|
+
goto st0;
|
1995
|
+
st3:
|
1996
|
+
if ( ++p == pe )
|
1997
|
+
goto _test_eof3;
|
1998
|
+
case 3:
|
1999
|
+
if ( (*p) == 42 )
|
2000
|
+
goto st4;
|
2001
|
+
goto st3;
|
2002
|
+
st4:
|
2003
|
+
if ( ++p == pe )
|
2004
|
+
goto _test_eof4;
|
2005
|
+
case 4:
|
2006
|
+
switch( (*p) ) {
|
2007
|
+
case 42: goto st4;
|
2008
|
+
case 47: goto st10;
|
2009
|
+
}
|
2010
|
+
goto st3;
|
2011
|
+
st5:
|
2012
|
+
if ( ++p == pe )
|
2013
|
+
goto _test_eof5;
|
2014
|
+
case 5:
|
2015
|
+
if ( (*p) == 10 )
|
2016
|
+
goto st10;
|
2017
|
+
goto st5;
|
2018
|
+
st6:
|
2019
|
+
if ( ++p == pe )
|
2020
|
+
goto _test_eof6;
|
2021
|
+
case 6:
|
2022
|
+
switch( (*p) ) {
|
2023
|
+
case 42: goto st7;
|
2024
|
+
case 47: goto st9;
|
2025
|
+
}
|
2026
|
+
goto st0;
|
2027
|
+
st7:
|
2028
|
+
if ( ++p == pe )
|
2029
|
+
goto _test_eof7;
|
2030
|
+
case 7:
|
2031
|
+
if ( (*p) == 42 )
|
2032
|
+
goto st8;
|
2033
|
+
goto st7;
|
2034
|
+
st8:
|
2035
|
+
if ( ++p == pe )
|
2036
|
+
goto _test_eof8;
|
2037
|
+
case 8:
|
2038
|
+
switch( (*p) ) {
|
2039
|
+
case 42: goto st8;
|
2040
|
+
case 47: goto st1;
|
2041
|
+
}
|
2042
|
+
goto st7;
|
2043
|
+
st9:
|
2044
|
+
if ( ++p == pe )
|
2045
|
+
goto _test_eof9;
|
2046
|
+
case 9:
|
2047
|
+
if ( (*p) == 10 )
|
2048
|
+
goto st1;
|
2049
|
+
goto st9;
|
2050
|
+
}
|
2051
|
+
_test_eof1: cs = 1; goto _test_eof;
|
2052
|
+
_test_eof10: cs = 10; goto _test_eof;
|
2053
|
+
_test_eof2: cs = 2; goto _test_eof;
|
2054
|
+
_test_eof3: cs = 3; goto _test_eof;
|
2055
|
+
_test_eof4: cs = 4; goto _test_eof;
|
2056
|
+
_test_eof5: cs = 5; goto _test_eof;
|
2057
|
+
_test_eof6: cs = 6; goto _test_eof;
|
2058
|
+
_test_eof7: cs = 7; goto _test_eof;
|
2059
|
+
_test_eof8: cs = 8; goto _test_eof;
|
2060
|
+
_test_eof9: cs = 9; goto _test_eof;
|
2061
|
+
|
2062
|
+
_test_eof: {}
|
2063
|
+
_out: {}
|
2064
|
+
}
|
2065
|
+
|
2066
|
+
#line 787 "parser.rl"
|
2067
|
+
|
2068
|
+
if (cs >= JSON_quirks_mode_first_final && p == pe) {
|
2069
|
+
return result;
|
2070
|
+
} else {
|
2071
|
+
rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
|
2072
|
+
return Qnil;
|
2073
|
+
}
|
2074
|
+
}
|
2075
|
+
|
2076
|
+
/*
|
2077
|
+
* call-seq: parse()
|
2078
|
+
*
|
2079
|
+
* Parses the current JSON text _source_ and returns the complete data
|
2080
|
+
* structure as a result.
|
2081
|
+
*/
|
2082
|
+
static VALUE cParser_parse(VALUE self)
|
2083
|
+
{
|
2084
|
+
GET_PARSER;
|
2085
|
+
|
2086
|
+
if (json->quirks_mode) {
|
2087
|
+
return cParser_parse_quirks_mode(self);
|
2088
|
+
} else {
|
2089
|
+
return cParser_parse_strict(self);
|
2090
|
+
}
|
2091
|
+
}
|
2092
|
+
|
2093
|
+
|
1902
2094
|
static JSON_Parser *JSON_allocate()
|
1903
2095
|
{
|
1904
2096
|
JSON_Parser *json = ALLOC(JSON_Parser);
|
@@ -1913,7 +2105,14 @@ static JSON_Parser *JSON_allocate()
|
|
1913
2105
|
return json;
|
1914
2106
|
}
|
1915
2107
|
|
1916
|
-
|
2108
|
+
static void JSON_mark(JSON_Parser *json)
|
2109
|
+
{
|
2110
|
+
rb_gc_mark_maybe(json->Vsource);
|
2111
|
+
rb_gc_mark_maybe(json->create_id);
|
2112
|
+
rb_gc_mark_maybe(json->object_class);
|
2113
|
+
rb_gc_mark_maybe(json->array_class);
|
2114
|
+
rb_gc_mark_maybe(json->match_string);
|
2115
|
+
}
|
1917
2116
|
|
1918
2117
|
static void JSON_free(JSON_Parser *json)
|
1919
2118
|
{
|
@@ -1923,9 +2122,7 @@ static void JSON_free(JSON_Parser *json)
|
|
1923
2122
|
static VALUE cJSON_parser_s_allocate(VALUE klass)
|
1924
2123
|
{
|
1925
2124
|
JSON_Parser *json = JSON_allocate();
|
1926
|
-
|
1927
|
-
json->dwrapped_parser = data_obj;
|
1928
|
-
return data_obj;
|
2125
|
+
return json->dwrapped_parser = Data_Wrap_Struct(klass, JSON_mark, JSON_free, json);
|
1929
2126
|
}
|
1930
2127
|
|
1931
2128
|
/*
|
@@ -1940,6 +2137,18 @@ static VALUE cParser_source(VALUE self)
|
|
1940
2137
|
return rb_str_dup(json->Vsource);
|
1941
2138
|
}
|
1942
2139
|
|
2140
|
+
/*
|
2141
|
+
* call-seq: quirks_mode?()
|
2142
|
+
*
|
2143
|
+
* Returns a true, if this parser is in quirks_mode, false otherwise.
|
2144
|
+
*/
|
2145
|
+
static VALUE cParser_quirks_mode_p(VALUE self)
|
2146
|
+
{
|
2147
|
+
GET_PARSER;
|
2148
|
+
return json->quirks_mode ? Qtrue : Qfalse;
|
2149
|
+
}
|
2150
|
+
|
2151
|
+
|
1943
2152
|
void Init_parser()
|
1944
2153
|
{
|
1945
2154
|
rb_require("json/common");
|
@@ -1952,6 +2161,7 @@ void Init_parser()
|
|
1952
2161
|
rb_define_method(cParser, "initialize", cParser_initialize, -1);
|
1953
2162
|
rb_define_method(cParser, "parse", cParser_parse, 0);
|
1954
2163
|
rb_define_method(cParser, "source", cParser_source, 0);
|
2164
|
+
rb_define_method(cParser, "quirks_mode?", cParser_quirks_mode_p, 0);
|
1955
2165
|
|
1956
2166
|
CNaN = rb_const_get(mJSON, rb_intern("NaN"));
|
1957
2167
|
CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
|
@@ -1965,6 +2175,7 @@ void Init_parser()
|
|
1965
2175
|
i_max_nesting = rb_intern("max_nesting");
|
1966
2176
|
i_allow_nan = rb_intern("allow_nan");
|
1967
2177
|
i_symbolize_names = rb_intern("symbolize_names");
|
2178
|
+
i_quirks_mode = rb_intern("quirks_mode");
|
1968
2179
|
i_object_class = rb_intern("object_class");
|
1969
2180
|
i_array_class = rb_intern("array_class");
|
1970
2181
|
i_match = rb_intern("match");
|