json 1.5.1 → 1.5.2
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 +5 -0
- data/{README → README.rdoc} +0 -0
- data/Rakefile +41 -55
- data/VERSION +1 -1
- data/ext/json/ext/generator/generator.c +11 -10
- data/ext/json/ext/generator/generator.h +3 -3
- data/ext/json/ext/parser/parser.c +81 -71
- data/ext/json/ext/parser/parser.h +5 -5
- data/ext/json/ext/parser/parser.rl +13 -3
- data/java/src/json/ext/Generator.java +1 -5
- data/java/src/json/ext/Parser.java +34 -26
- data/java/src/json/ext/Parser.rl +10 -2
- data/json.gemspec +41 -0
- data/json_pure.gemspec +40 -0
- data/lib/json.rb +52 -0
- data/lib/json/add/core.rb +35 -4
- data/lib/json/common.rb +5 -1
- data/lib/json/pure/generator.rb +1 -1
- data/lib/json/version.rb +1 -1
- data/tests/test_json.rb +25 -6
- data/tests/test_json_generate.rb +1 -0
- metadata +164 -140
data/CHANGES
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
2011-05-11 (1.5.2)
|
2
|
+
* Apply documentation patch by Cory Monty <cory.monty@gmail.com>.
|
3
|
+
* Add gemspecs for json and json_pure.
|
4
|
+
* Fix bug in jruby pretty printing.
|
5
|
+
* Fix bug in object_class and array_class when inheriting from Hash or Array.
|
1
6
|
2011-01-24 (1.5.1)
|
2
7
|
* Made rake-compiler build a fat binary gem. This should fix issue
|
3
8
|
https://github.com/flori/json/issues#issue/54.
|
data/{README → README.rdoc}
RENAMED
File without changes
|
data/Rakefile
CHANGED
@@ -1,22 +1,16 @@
|
|
1
1
|
begin
|
2
|
-
require '
|
2
|
+
require 'rubygems/package_task'
|
3
3
|
rescue LoadError
|
4
4
|
end
|
5
5
|
|
6
|
-
begin
|
7
|
-
require 'rake/extensiontask'
|
8
|
-
rescue LoadError
|
9
|
-
warn "WARNING: rake-compiler is not installed. You will not be able to build the json gem until you install it."
|
10
|
-
end
|
11
|
-
|
12
6
|
require 'rbconfig'
|
13
7
|
include Config
|
14
8
|
|
15
9
|
require 'rake/clean'
|
16
|
-
CLOBBER.include Dir['benchmarks/data/*.{dat,log}']
|
10
|
+
CLOBBER.include Dir['benchmarks/data/*.{dat,log}'], 'doc'
|
17
11
|
CLEAN.include FileList['diagrams/*.*'], 'doc', 'coverage', 'tmp',
|
18
12
|
FileList["ext/**/{Makefile,mkmf.log}"], 'build', 'dist', FileList['**/*.rbc'],
|
19
|
-
FileList["{ext,lib}/**/*.{so,bundle,#{CONFIG['DLEXT']},o,obj,pdb,lib,manifest,exp,def,jar,class}"],
|
13
|
+
FileList["{ext,lib}/**/*.{so,bundle,#{CONFIG['DLEXT']},o,obj,pdb,lib,manifest,exp,def,jar,class,dSYM}"],
|
20
14
|
FileList['java/src/**/*.class']
|
21
15
|
|
22
16
|
MAKE = ENV['MAKE'] || %w[gmake make].find { |c| system(c, '-v') }
|
@@ -73,7 +67,7 @@ task :install_ext_really do
|
|
73
67
|
end
|
74
68
|
|
75
69
|
desc "Installing library (extension)"
|
76
|
-
task :install_ext => [ :
|
70
|
+
task :install_ext => [ :compile, :install_pure, :install_ext_really ]
|
77
71
|
|
78
72
|
desc "Installing library (extension)"
|
79
73
|
if RUBY_PLATFORM =~ /java/
|
@@ -82,7 +76,7 @@ else
|
|
82
76
|
task :install => :install_ext
|
83
77
|
end
|
84
78
|
|
85
|
-
if defined?(Gem) and defined?(
|
79
|
+
if defined?(Gem) and defined?(Gem::PackageTask)
|
86
80
|
spec_pure = Gem::Specification.new do |s|
|
87
81
|
s.name = 'json_pure'
|
88
82
|
s.version = PKG_VERSION
|
@@ -92,15 +86,16 @@ if defined?(Gem) and defined?(Rake::GemPackageTask)
|
|
92
86
|
s.files = PKG_FILES
|
93
87
|
|
94
88
|
s.require_path = 'lib'
|
89
|
+
s.add_development_dependency 'permutation'
|
90
|
+
s.add_development_dependency 'bullshit'
|
91
|
+
s.add_development_dependency 'sdoc'
|
95
92
|
|
96
93
|
s.bindir = "bin"
|
97
94
|
s.executables = [ "edit_json.rb", "prettify_json.rb" ]
|
98
|
-
s.default_executable = "edit_json.rb"
|
99
95
|
|
100
|
-
s.
|
101
|
-
s.extra_rdoc_files << 'README'
|
96
|
+
s.extra_rdoc_files << 'README.rdoc'
|
102
97
|
s.rdoc_options <<
|
103
|
-
'--title' << 'JSON implemention for ruby' << '--main' << 'README'
|
98
|
+
'--title' << 'JSON implemention for ruby' << '--main' << 'README.rdoc'
|
104
99
|
s.test_files.concat Dir['./tests/test_*.rb']
|
105
100
|
|
106
101
|
s.author = "Florian Frank"
|
@@ -109,13 +104,18 @@ if defined?(Gem) and defined?(Rake::GemPackageTask)
|
|
109
104
|
s.rubyforge_project = "json"
|
110
105
|
end
|
111
106
|
|
112
|
-
|
107
|
+
desc 'Creates a json_pure.gemspec file'
|
108
|
+
task :gemspec_pure => :version do
|
109
|
+
File.open('json_pure.gemspec', 'w') do |gemspec|
|
110
|
+
gemspec.write spec_pure.to_ruby
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
Gem::PackageTask.new(spec_pure) do |pkg|
|
113
115
|
pkg.need_tar = true
|
114
116
|
pkg.package_files = PKG_FILES
|
115
117
|
end
|
116
|
-
end
|
117
118
|
|
118
|
-
if defined?(Gem) and defined?(Rake::GemPackageTask) and defined?(Rake::ExtensionTask)
|
119
119
|
spec_ext = Gem::Specification.new do |s|
|
120
120
|
s.name = 'json'
|
121
121
|
s.version = PKG_VERSION
|
@@ -129,15 +129,16 @@ if defined?(Gem) and defined?(Rake::GemPackageTask) and defined?(Rake::Extension
|
|
129
129
|
s.require_path = EXT_ROOT_DIR
|
130
130
|
s.require_paths << 'ext'
|
131
131
|
s.require_paths << 'lib'
|
132
|
+
s.add_development_dependency 'permutation'
|
133
|
+
s.add_development_dependency 'bullshit'
|
134
|
+
s.add_development_dependency 'sdoc'
|
132
135
|
|
133
136
|
s.bindir = "bin"
|
134
137
|
s.executables = [ "edit_json.rb", "prettify_json.rb" ]
|
135
|
-
s.default_executable = "edit_json.rb"
|
136
138
|
|
137
|
-
s.
|
138
|
-
s.extra_rdoc_files << 'README'
|
139
|
+
s.extra_rdoc_files << 'README.rdoc'
|
139
140
|
s.rdoc_options <<
|
140
|
-
'--title' << 'JSON implemention for Ruby' << '--main' << 'README'
|
141
|
+
'--title' << 'JSON implemention for Ruby' << '--main' << 'README.rdoc'
|
141
142
|
s.test_files.concat Dir['./tests/test_*.rb']
|
142
143
|
|
143
144
|
s.author = "Florian Frank"
|
@@ -146,28 +147,21 @@ if defined?(Gem) and defined?(Rake::GemPackageTask) and defined?(Rake::Extension
|
|
146
147
|
s.rubyforge_project = "json"
|
147
148
|
end
|
148
149
|
|
149
|
-
|
150
|
+
desc 'Creates a json.gemspec file'
|
151
|
+
task :gemspec_ext => :version do
|
152
|
+
File.open('json.gemspec', 'w') do |gemspec|
|
153
|
+
gemspec.write spec_ext.to_ruby
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
Gem::PackageTask.new(spec_ext) do |pkg|
|
150
158
|
pkg.need_tar = true
|
151
159
|
pkg.package_files = PKG_FILES
|
152
160
|
end
|
153
161
|
|
154
|
-
Rake::ExtensionTask.new do |ext|
|
155
|
-
ext.name = 'parser'
|
156
|
-
ext.gem_spec = spec_ext
|
157
|
-
ext.cross_compile = true
|
158
|
-
ext.cross_platform = %w[i386-mswin32 i386-mingw32]
|
159
|
-
ext.ext_dir = 'ext/json/ext/parser'
|
160
|
-
ext.lib_dir = 'lib/json/ext'
|
161
|
-
end
|
162
162
|
|
163
|
-
|
164
|
-
|
165
|
-
ext.gem_spec = spec_ext
|
166
|
-
ext.cross_compile = true
|
167
|
-
ext.cross_platform = %w[i386-mswin32 i386-mingw32]
|
168
|
-
ext.ext_dir = 'ext/json/ext/generator'
|
169
|
-
ext.lib_dir = 'lib/json/ext'
|
170
|
-
end
|
163
|
+
desc 'Create all gemspec files'
|
164
|
+
task :gemspec => [ :gemspec_pure, :gemspec_ext ]
|
171
165
|
end
|
172
166
|
|
173
167
|
desc m = "Writing version information for #{PKG_VERSION}"
|
@@ -197,7 +191,6 @@ end
|
|
197
191
|
desc "Testing library (pure ruby and extension)"
|
198
192
|
task :test => [ :test_pure, :test_ext ]
|
199
193
|
|
200
|
-
|
201
194
|
if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
|
202
195
|
file JAVA_PARSER_SRC => JAVA_RAGEL_PATH do
|
203
196
|
cd JAVA_DIR do
|
@@ -232,7 +225,7 @@ if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
|
|
232
225
|
end
|
233
226
|
|
234
227
|
desc "Compiling jruby extension"
|
235
|
-
task :
|
228
|
+
task :compile => JAVA_CLASSES
|
236
229
|
|
237
230
|
desc "Package the jruby gem"
|
238
231
|
task :jruby_gem => :create_jar do
|
@@ -247,7 +240,7 @@ if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
|
|
247
240
|
myruby '-S', 'testrb', '-Ilib', *Dir['./tests/test_*.rb']
|
248
241
|
end
|
249
242
|
|
250
|
-
file JRUBY_PARSER_JAR => :
|
243
|
+
file JRUBY_PARSER_JAR => :compile do
|
251
244
|
cd 'java/src' do
|
252
245
|
parser_classes = FileList[
|
253
246
|
"json/ext/ByteListTranscoder*.class",
|
@@ -265,7 +258,7 @@ if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
|
|
265
258
|
desc "Create parser jar"
|
266
259
|
task :create_parser_jar => JRUBY_PARSER_JAR
|
267
260
|
|
268
|
-
file JRUBY_GENERATOR_JAR => :
|
261
|
+
file JRUBY_GENERATOR_JAR => :compile do
|
269
262
|
cd 'java/src' do
|
270
263
|
generator_classes = FileList[
|
271
264
|
"json/ext/ByteListTranscoder*.class",
|
@@ -290,7 +283,7 @@ if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
|
|
290
283
|
task :release => [ :clean, :version, :jruby_gem ]
|
291
284
|
else
|
292
285
|
desc "Compiling extension"
|
293
|
-
task :
|
286
|
+
task :compile => [ EXT_PARSER_DL, EXT_GENERATOR_DL ]
|
294
287
|
|
295
288
|
file EXT_PARSER_DL => EXT_PARSER_SRC do
|
296
289
|
cd EXT_PARSER_DIR do
|
@@ -309,7 +302,7 @@ else
|
|
309
302
|
end
|
310
303
|
|
311
304
|
desc "Testing library (extension)"
|
312
|
-
task :test_ext => :
|
305
|
+
task :test_ext => :compile do
|
313
306
|
ENV['JSON'] = 'ext'
|
314
307
|
ENV['RUBYOPT'] = "-Iext:lib #{ENV['RUBYOPT']}"
|
315
308
|
myruby '-S', 'testrb', *Dir['./tests/test_*.rb']
|
@@ -334,7 +327,7 @@ else
|
|
334
327
|
|
335
328
|
desc "Create RDOC documentation"
|
336
329
|
task :doc => [ :version, EXT_PARSER_SRC ] do
|
337
|
-
sh "sdoc -o doc -t '#{PKG_TITLE}' -m README README lib/json.rb #{FileList['lib/json/**/*.rb']} #{EXT_PARSER_SRC} #{EXT_GENERATOR_SRC}"
|
330
|
+
sh "sdoc -o doc -t '#{PKG_TITLE}' -m README.rdoc README.rdoc lib/json.rb #{FileList['lib/json/**/*.rb']} #{EXT_PARSER_SRC} #{EXT_GENERATOR_SRC}"
|
338
331
|
end
|
339
332
|
|
340
333
|
desc "Generate parser with ragel"
|
@@ -386,16 +379,9 @@ else
|
|
386
379
|
desc "Generate diagrams of ragel parser"
|
387
380
|
task :ragel_dot => [ :ragel_dot_png, :ragel_dot_ps ]
|
388
381
|
|
389
|
-
task :environment do
|
390
|
-
ENV['RUBY_CC_VERSION'] = '1.8.7:1.9.2'
|
391
|
-
end
|
392
|
-
|
393
382
|
desc "Build all gems and archives for a new release of json and json_pure."
|
394
|
-
task :release => [ :clean, :
|
395
|
-
sh "#$0 clean native gem"
|
396
|
-
sh "#$0 clean package"
|
397
|
-
end
|
383
|
+
task :release => [ :clean, :gemspec, :package ]
|
398
384
|
end
|
399
385
|
|
400
386
|
desc "Compile in the the source directory"
|
401
|
-
task :default => [ :
|
387
|
+
task :default => [ :clean, :gemspec, :compile ]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.5.
|
1
|
+
1.5.2
|
@@ -62,7 +62,7 @@ static const char trailingBytesForUTF8[256] = {
|
|
62
62
|
* in a UTF-8 sequence.
|
63
63
|
*/
|
64
64
|
static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL,
|
65
|
-
|
65
|
+
0x03C82080UL, 0xFA082080UL, 0x82082080UL };
|
66
66
|
|
67
67
|
/*
|
68
68
|
* Utility routine to tell whether a sequence of bytes is legal UTF-8.
|
@@ -363,23 +363,23 @@ static void fbuffer_append_char(FBuffer *fb, char newchr)
|
|
363
363
|
|
364
364
|
static void freverse(char *start, char *end)
|
365
365
|
{
|
366
|
-
|
366
|
+
char c;
|
367
367
|
|
368
|
-
|
369
|
-
|
368
|
+
while (end > start) {
|
369
|
+
c = *end, *end-- = *start, *start++ = c;
|
370
370
|
}
|
371
371
|
}
|
372
372
|
|
373
373
|
static long fltoa(long number, char *buf)
|
374
374
|
{
|
375
|
-
|
376
|
-
|
377
|
-
|
375
|
+
static char digits[] = "0123456789";
|
376
|
+
long sign = number;
|
377
|
+
char* tmp = buf;
|
378
378
|
|
379
|
-
|
379
|
+
if (sign < 0) number = -number;
|
380
380
|
do *tmp++ = digits[number % 10]; while (number /= 10);
|
381
|
-
|
382
|
-
|
381
|
+
if (sign < 0) *tmp++ = '-';
|
382
|
+
freverse(buf, tmp - 1);
|
383
383
|
return tmp - buf;
|
384
384
|
}
|
385
385
|
|
@@ -561,6 +561,7 @@ static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self)
|
|
561
561
|
/*
|
562
562
|
* call-seq: to_json(*)
|
563
563
|
*
|
564
|
+
* Returns a JSON string for nil: 'null'.
|
564
565
|
*/
|
565
566
|
static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self)
|
566
567
|
{
|
@@ -79,9 +79,9 @@ static VALUE fbuffer_to_s(FBuffer *fb);
|
|
79
79
|
|
80
80
|
#define UNI_STRICT_CONVERSION 1
|
81
81
|
|
82
|
-
typedef unsigned long
|
83
|
-
typedef unsigned short
|
84
|
-
typedef unsigned char
|
82
|
+
typedef unsigned long UTF32; /* at least 32 bits */
|
83
|
+
typedef unsigned short UTF16; /* at least 16 bits */
|
84
|
+
typedef unsigned char UTF8; /* typically 8 bits */
|
85
85
|
|
86
86
|
#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
|
87
87
|
#define UNI_MAX_BMP (UTF32)0x0000FFFF
|
@@ -79,7 +79,7 @@ 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
81
|
i_chr, i_max_nesting, i_allow_nan, i_symbolize_names, i_object_class,
|
82
|
-
i_array_class, i_key_p, i_deep_const_get, i_match, i_match_string;
|
82
|
+
i_array_class, i_key_p, i_deep_const_get, i_match, i_match_string, i_aset, i_leftshift;
|
83
83
|
|
84
84
|
|
85
85
|
#line 108 "parser.rl"
|
@@ -94,7 +94,7 @@ static const int JSON_object_error = 0;
|
|
94
94
|
static const int JSON_object_en_main = 1;
|
95
95
|
|
96
96
|
|
97
|
-
#line
|
97
|
+
#line 148 "parser.rl"
|
98
98
|
|
99
99
|
|
100
100
|
static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -115,7 +115,7 @@ static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *resu
|
|
115
115
|
cs = JSON_object_start;
|
116
116
|
}
|
117
117
|
|
118
|
-
#line
|
118
|
+
#line 163 "parser.rl"
|
119
119
|
|
120
120
|
#line 121 "parser.c"
|
121
121
|
{
|
@@ -145,7 +145,7 @@ case 2:
|
|
145
145
|
goto st2;
|
146
146
|
goto st0;
|
147
147
|
tr2:
|
148
|
-
#line
|
148
|
+
#line 131 "parser.rl"
|
149
149
|
{
|
150
150
|
char *np;
|
151
151
|
json->parsing_name = 1;
|
@@ -232,7 +232,11 @@ tr11:
|
|
232
232
|
if (np == NULL) {
|
233
233
|
p--; {p++; cs = 9; goto _out;}
|
234
234
|
} else {
|
235
|
-
|
235
|
+
if (NIL_P(json->object_class)) {
|
236
|
+
rb_hash_aset(*result, last_name, v);
|
237
|
+
} else {
|
238
|
+
rb_funcall(*result, i_aset, 2, last_name, v);
|
239
|
+
}
|
236
240
|
{p = (( np))-1;}
|
237
241
|
}
|
238
242
|
}
|
@@ -241,7 +245,7 @@ st9:
|
|
241
245
|
if ( ++p == pe )
|
242
246
|
goto _test_eof9;
|
243
247
|
case 9:
|
244
|
-
#line
|
248
|
+
#line 249 "parser.c"
|
245
249
|
switch( (*p) ) {
|
246
250
|
case 13: goto st9;
|
247
251
|
case 32: goto st9;
|
@@ -330,14 +334,14 @@ case 18:
|
|
330
334
|
goto st9;
|
331
335
|
goto st18;
|
332
336
|
tr4:
|
333
|
-
#line
|
337
|
+
#line 139 "parser.rl"
|
334
338
|
{ p--; {p++; cs = 27; goto _out;} }
|
335
339
|
goto st27;
|
336
340
|
st27:
|
337
341
|
if ( ++p == pe )
|
338
342
|
goto _test_eof27;
|
339
343
|
case 27:
|
340
|
-
#line
|
344
|
+
#line 345 "parser.c"
|
341
345
|
goto st0;
|
342
346
|
st19:
|
343
347
|
if ( ++p == pe )
|
@@ -435,7 +439,7 @@ case 26:
|
|
435
439
|
_out: {}
|
436
440
|
}
|
437
441
|
|
438
|
-
#line
|
442
|
+
#line 164 "parser.rl"
|
439
443
|
|
440
444
|
if (cs >= JSON_object_first_final) {
|
441
445
|
if (json->create_additions) {
|
@@ -454,7 +458,7 @@ case 26:
|
|
454
458
|
}
|
455
459
|
|
456
460
|
|
457
|
-
#line
|
461
|
+
#line 462 "parser.c"
|
458
462
|
static const int JSON_value_start = 1;
|
459
463
|
static const int JSON_value_first_final = 21;
|
460
464
|
static const int JSON_value_error = 0;
|
@@ -462,7 +466,7 @@ static const int JSON_value_error = 0;
|
|
462
466
|
static const int JSON_value_en_main = 1;
|
463
467
|
|
464
468
|
|
465
|
-
#line
|
469
|
+
#line 262 "parser.rl"
|
466
470
|
|
467
471
|
|
468
472
|
static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -470,14 +474,14 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
470
474
|
int cs = EVIL;
|
471
475
|
|
472
476
|
|
473
|
-
#line
|
477
|
+
#line 478 "parser.c"
|
474
478
|
{
|
475
479
|
cs = JSON_value_start;
|
476
480
|
}
|
477
481
|
|
478
|
-
#line
|
482
|
+
#line 269 "parser.rl"
|
479
483
|
|
480
|
-
#line
|
484
|
+
#line 485 "parser.c"
|
481
485
|
{
|
482
486
|
if ( p == pe )
|
483
487
|
goto _test_eof;
|
@@ -502,14 +506,14 @@ st0:
|
|
502
506
|
cs = 0;
|
503
507
|
goto _out;
|
504
508
|
tr0:
|
505
|
-
#line
|
509
|
+
#line 210 "parser.rl"
|
506
510
|
{
|
507
511
|
char *np = JSON_parse_string(json, p, pe, result);
|
508
512
|
if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
|
509
513
|
}
|
510
514
|
goto st21;
|
511
515
|
tr2:
|
512
|
-
#line
|
516
|
+
#line 215 "parser.rl"
|
513
517
|
{
|
514
518
|
char *np;
|
515
519
|
if(pe > p + 9 && !strncmp(MinusInfinity, p, 9)) {
|
@@ -529,7 +533,7 @@ tr2:
|
|
529
533
|
}
|
530
534
|
goto st21;
|
531
535
|
tr5:
|
532
|
-
#line
|
536
|
+
#line 233 "parser.rl"
|
533
537
|
{
|
534
538
|
char *np;
|
535
539
|
json->current_nesting++;
|
@@ -539,7 +543,7 @@ tr5:
|
|
539
543
|
}
|
540
544
|
goto st21;
|
541
545
|
tr9:
|
542
|
-
#line
|
546
|
+
#line 241 "parser.rl"
|
543
547
|
{
|
544
548
|
char *np;
|
545
549
|
json->current_nesting++;
|
@@ -549,7 +553,7 @@ tr9:
|
|
549
553
|
}
|
550
554
|
goto st21;
|
551
555
|
tr16:
|
552
|
-
#line
|
556
|
+
#line 203 "parser.rl"
|
553
557
|
{
|
554
558
|
if (json->allow_nan) {
|
555
559
|
*result = CInfinity;
|
@@ -559,7 +563,7 @@ tr16:
|
|
559
563
|
}
|
560
564
|
goto st21;
|
561
565
|
tr18:
|
562
|
-
#line
|
566
|
+
#line 196 "parser.rl"
|
563
567
|
{
|
564
568
|
if (json->allow_nan) {
|
565
569
|
*result = CNaN;
|
@@ -569,19 +573,19 @@ tr18:
|
|
569
573
|
}
|
570
574
|
goto st21;
|
571
575
|
tr22:
|
572
|
-
#line
|
576
|
+
#line 190 "parser.rl"
|
573
577
|
{
|
574
578
|
*result = Qfalse;
|
575
579
|
}
|
576
580
|
goto st21;
|
577
581
|
tr25:
|
578
|
-
#line
|
582
|
+
#line 187 "parser.rl"
|
579
583
|
{
|
580
584
|
*result = Qnil;
|
581
585
|
}
|
582
586
|
goto st21;
|
583
587
|
tr28:
|
584
|
-
#line
|
588
|
+
#line 193 "parser.rl"
|
585
589
|
{
|
586
590
|
*result = Qtrue;
|
587
591
|
}
|
@@ -590,9 +594,9 @@ st21:
|
|
590
594
|
if ( ++p == pe )
|
591
595
|
goto _test_eof21;
|
592
596
|
case 21:
|
593
|
-
#line
|
597
|
+
#line 249 "parser.rl"
|
594
598
|
{ p--; {p++; cs = 21; goto _out;} }
|
595
|
-
#line
|
599
|
+
#line 600 "parser.c"
|
596
600
|
goto st0;
|
597
601
|
st2:
|
598
602
|
if ( ++p == pe )
|
@@ -753,7 +757,7 @@ case 20:
|
|
753
757
|
_out: {}
|
754
758
|
}
|
755
759
|
|
756
|
-
#line
|
760
|
+
#line 270 "parser.rl"
|
757
761
|
|
758
762
|
if (cs >= JSON_value_first_final) {
|
759
763
|
return p;
|
@@ -763,7 +767,7 @@ case 20:
|
|
763
767
|
}
|
764
768
|
|
765
769
|
|
766
|
-
#line
|
770
|
+
#line 771 "parser.c"
|
767
771
|
static const int JSON_integer_start = 1;
|
768
772
|
static const int JSON_integer_first_final = 5;
|
769
773
|
static const int JSON_integer_error = 0;
|
@@ -771,7 +775,7 @@ static const int JSON_integer_error = 0;
|
|
771
775
|
static const int JSON_integer_en_main = 1;
|
772
776
|
|
773
777
|
|
774
|
-
#line
|
778
|
+
#line 286 "parser.rl"
|
775
779
|
|
776
780
|
|
777
781
|
static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -779,15 +783,15 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res
|
|
779
783
|
int cs = EVIL;
|
780
784
|
|
781
785
|
|
782
|
-
#line
|
786
|
+
#line 787 "parser.c"
|
783
787
|
{
|
784
788
|
cs = JSON_integer_start;
|
785
789
|
}
|
786
790
|
|
787
|
-
#line
|
791
|
+
#line 293 "parser.rl"
|
788
792
|
json->memo = p;
|
789
793
|
|
790
|
-
#line
|
794
|
+
#line 795 "parser.c"
|
791
795
|
{
|
792
796
|
if ( p == pe )
|
793
797
|
goto _test_eof;
|
@@ -821,14 +825,14 @@ case 3:
|
|
821
825
|
goto st0;
|
822
826
|
goto tr4;
|
823
827
|
tr4:
|
824
|
-
#line
|
828
|
+
#line 283 "parser.rl"
|
825
829
|
{ p--; {p++; cs = 5; goto _out;} }
|
826
830
|
goto st5;
|
827
831
|
st5:
|
828
832
|
if ( ++p == pe )
|
829
833
|
goto _test_eof5;
|
830
834
|
case 5:
|
831
|
-
#line
|
835
|
+
#line 836 "parser.c"
|
832
836
|
goto st0;
|
833
837
|
st4:
|
834
838
|
if ( ++p == pe )
|
@@ -847,7 +851,7 @@ case 4:
|
|
847
851
|
_out: {}
|
848
852
|
}
|
849
853
|
|
850
|
-
#line
|
854
|
+
#line 295 "parser.rl"
|
851
855
|
|
852
856
|
if (cs >= JSON_integer_first_final) {
|
853
857
|
long len = p - json->memo;
|
@@ -859,7 +863,7 @@ case 4:
|
|
859
863
|
}
|
860
864
|
|
861
865
|
|
862
|
-
#line
|
866
|
+
#line 867 "parser.c"
|
863
867
|
static const int JSON_float_start = 1;
|
864
868
|
static const int JSON_float_first_final = 10;
|
865
869
|
static const int JSON_float_error = 0;
|
@@ -867,7 +871,7 @@ static const int JSON_float_error = 0;
|
|
867
871
|
static const int JSON_float_en_main = 1;
|
868
872
|
|
869
873
|
|
870
|
-
#line
|
874
|
+
#line 317 "parser.rl"
|
871
875
|
|
872
876
|
|
873
877
|
static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -875,15 +879,15 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
875
879
|
int cs = EVIL;
|
876
880
|
|
877
881
|
|
878
|
-
#line
|
882
|
+
#line 883 "parser.c"
|
879
883
|
{
|
880
884
|
cs = JSON_float_start;
|
881
885
|
}
|
882
886
|
|
883
|
-
#line
|
887
|
+
#line 324 "parser.rl"
|
884
888
|
json->memo = p;
|
885
889
|
|
886
|
-
#line
|
890
|
+
#line 891 "parser.c"
|
887
891
|
{
|
888
892
|
if ( p == pe )
|
889
893
|
goto _test_eof;
|
@@ -941,14 +945,14 @@ case 5:
|
|
941
945
|
goto st0;
|
942
946
|
goto tr7;
|
943
947
|
tr7:
|
944
|
-
#line
|
948
|
+
#line 311 "parser.rl"
|
945
949
|
{ p--; {p++; cs = 10; goto _out;} }
|
946
950
|
goto st10;
|
947
951
|
st10:
|
948
952
|
if ( ++p == pe )
|
949
953
|
goto _test_eof10;
|
950
954
|
case 10:
|
951
|
-
#line
|
955
|
+
#line 956 "parser.c"
|
952
956
|
goto st0;
|
953
957
|
st6:
|
954
958
|
if ( ++p == pe )
|
@@ -1009,7 +1013,7 @@ case 9:
|
|
1009
1013
|
_out: {}
|
1010
1014
|
}
|
1011
1015
|
|
1012
|
-
#line
|
1016
|
+
#line 326 "parser.rl"
|
1013
1017
|
|
1014
1018
|
if (cs >= JSON_float_first_final) {
|
1015
1019
|
long len = p - json->memo;
|
@@ -1022,7 +1026,7 @@ case 9:
|
|
1022
1026
|
|
1023
1027
|
|
1024
1028
|
|
1025
|
-
#line
|
1029
|
+
#line 1030 "parser.c"
|
1026
1030
|
static const int JSON_array_start = 1;
|
1027
1031
|
static const int JSON_array_first_final = 17;
|
1028
1032
|
static const int JSON_array_error = 0;
|
@@ -1030,7 +1034,7 @@ static const int JSON_array_error = 0;
|
|
1030
1034
|
static const int JSON_array_en_main = 1;
|
1031
1035
|
|
1032
1036
|
|
1033
|
-
#line
|
1037
|
+
#line 366 "parser.rl"
|
1034
1038
|
|
1035
1039
|
|
1036
1040
|
static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -1044,14 +1048,14 @@ static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
1044
1048
|
*result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class);
|
1045
1049
|
|
1046
1050
|
|
1047
|
-
#line
|
1051
|
+
#line 1052 "parser.c"
|
1048
1052
|
{
|
1049
1053
|
cs = JSON_array_start;
|
1050
1054
|
}
|
1051
1055
|
|
1052
|
-
#line
|
1056
|
+
#line 379 "parser.rl"
|
1053
1057
|
|
1054
|
-
#line
|
1058
|
+
#line 1059 "parser.c"
|
1055
1059
|
{
|
1056
1060
|
if ( p == pe )
|
1057
1061
|
goto _test_eof;
|
@@ -1090,14 +1094,18 @@ case 2:
|
|
1090
1094
|
goto st2;
|
1091
1095
|
goto st0;
|
1092
1096
|
tr2:
|
1093
|
-
#line
|
1097
|
+
#line 343 "parser.rl"
|
1094
1098
|
{
|
1095
1099
|
VALUE v = Qnil;
|
1096
1100
|
char *np = JSON_parse_value(json, p, pe, &v);
|
1097
1101
|
if (np == NULL) {
|
1098
1102
|
p--; {p++; cs = 3; goto _out;}
|
1099
1103
|
} else {
|
1100
|
-
|
1104
|
+
if (NIL_P(json->array_class)) {
|
1105
|
+
rb_ary_push(*result, v);
|
1106
|
+
} else {
|
1107
|
+
rb_funcall(*result, i_leftshift, 1, v);
|
1108
|
+
}
|
1101
1109
|
{p = (( np))-1;}
|
1102
1110
|
}
|
1103
1111
|
}
|
@@ -1106,7 +1114,7 @@ st3:
|
|
1106
1114
|
if ( ++p == pe )
|
1107
1115
|
goto _test_eof3;
|
1108
1116
|
case 3:
|
1109
|
-
#line
|
1117
|
+
#line 1118 "parser.c"
|
1110
1118
|
switch( (*p) ) {
|
1111
1119
|
case 13: goto st3;
|
1112
1120
|
case 32: goto st3;
|
@@ -1206,14 +1214,14 @@ case 12:
|
|
1206
1214
|
goto st3;
|
1207
1215
|
goto st12;
|
1208
1216
|
tr4:
|
1209
|
-
#line
|
1217
|
+
#line 358 "parser.rl"
|
1210
1218
|
{ p--; {p++; cs = 17; goto _out;} }
|
1211
1219
|
goto st17;
|
1212
1220
|
st17:
|
1213
1221
|
if ( ++p == pe )
|
1214
1222
|
goto _test_eof17;
|
1215
1223
|
case 17:
|
1216
|
-
#line
|
1224
|
+
#line 1225 "parser.c"
|
1217
1225
|
goto st0;
|
1218
1226
|
st13:
|
1219
1227
|
if ( ++p == pe )
|
@@ -1269,7 +1277,7 @@ case 16:
|
|
1269
1277
|
_out: {}
|
1270
1278
|
}
|
1271
1279
|
|
1272
|
-
#line
|
1280
|
+
#line 380 "parser.rl"
|
1273
1281
|
|
1274
1282
|
if(cs >= JSON_array_first_final) {
|
1275
1283
|
return p + 1;
|
@@ -1350,7 +1358,7 @@ static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
|
|
1350
1358
|
}
|
1351
1359
|
|
1352
1360
|
|
1353
|
-
#line
|
1361
|
+
#line 1362 "parser.c"
|
1354
1362
|
static const int JSON_string_start = 1;
|
1355
1363
|
static const int JSON_string_first_final = 8;
|
1356
1364
|
static const int JSON_string_error = 0;
|
@@ -1358,7 +1366,7 @@ static const int JSON_string_error = 0;
|
|
1358
1366
|
static const int JSON_string_en_main = 1;
|
1359
1367
|
|
1360
1368
|
|
1361
|
-
#line
|
1369
|
+
#line 479 "parser.rl"
|
1362
1370
|
|
1363
1371
|
|
1364
1372
|
static int
|
@@ -1380,15 +1388,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
|
|
1380
1388
|
|
1381
1389
|
*result = rb_str_buf_new(0);
|
1382
1390
|
|
1383
|
-
#line
|
1391
|
+
#line 1392 "parser.c"
|
1384
1392
|
{
|
1385
1393
|
cs = JSON_string_start;
|
1386
1394
|
}
|
1387
1395
|
|
1388
|
-
#line
|
1396
|
+
#line 500 "parser.rl"
|
1389
1397
|
json->memo = p;
|
1390
1398
|
|
1391
|
-
#line
|
1399
|
+
#line 1400 "parser.c"
|
1392
1400
|
{
|
1393
1401
|
if ( p == pe )
|
1394
1402
|
goto _test_eof;
|
@@ -1413,7 +1421,7 @@ case 2:
|
|
1413
1421
|
goto st0;
|
1414
1422
|
goto st2;
|
1415
1423
|
tr2:
|
1416
|
-
#line
|
1424
|
+
#line 465 "parser.rl"
|
1417
1425
|
{
|
1418
1426
|
*result = json_string_unescape(*result, json->memo + 1, p);
|
1419
1427
|
if (NIL_P(*result)) {
|
@@ -1424,14 +1432,14 @@ tr2:
|
|
1424
1432
|
{p = (( p + 1))-1;}
|
1425
1433
|
}
|
1426
1434
|
}
|
1427
|
-
#line
|
1435
|
+
#line 476 "parser.rl"
|
1428
1436
|
{ p--; {p++; cs = 8; goto _out;} }
|
1429
1437
|
goto st8;
|
1430
1438
|
st8:
|
1431
1439
|
if ( ++p == pe )
|
1432
1440
|
goto _test_eof8;
|
1433
1441
|
case 8:
|
1434
|
-
#line
|
1442
|
+
#line 1443 "parser.c"
|
1435
1443
|
goto st0;
|
1436
1444
|
st3:
|
1437
1445
|
if ( ++p == pe )
|
@@ -1507,7 +1515,7 @@ case 7:
|
|
1507
1515
|
_out: {}
|
1508
1516
|
}
|
1509
1517
|
|
1510
|
-
#line
|
1518
|
+
#line 502 "parser.rl"
|
1511
1519
|
|
1512
1520
|
if (json->create_additions && RTEST(match_string = json->match_string)) {
|
1513
1521
|
VALUE klass;
|
@@ -1532,7 +1540,7 @@ case 7:
|
|
1532
1540
|
|
1533
1541
|
|
1534
1542
|
|
1535
|
-
#line
|
1543
|
+
#line 1544 "parser.c"
|
1536
1544
|
static const int JSON_start = 1;
|
1537
1545
|
static const int JSON_first_final = 10;
|
1538
1546
|
static const int JSON_error = 0;
|
@@ -1540,7 +1548,7 @@ static const int JSON_error = 0;
|
|
1540
1548
|
static const int JSON_en_main = 1;
|
1541
1549
|
|
1542
1550
|
|
1543
|
-
#line
|
1551
|
+
#line 550 "parser.rl"
|
1544
1552
|
|
1545
1553
|
|
1546
1554
|
/*
|
@@ -1729,16 +1737,16 @@ static VALUE cParser_parse(VALUE self)
|
|
1729
1737
|
GET_PARSER;
|
1730
1738
|
|
1731
1739
|
|
1732
|
-
#line
|
1740
|
+
#line 1741 "parser.c"
|
1733
1741
|
{
|
1734
1742
|
cs = JSON_start;
|
1735
1743
|
}
|
1736
1744
|
|
1737
|
-
#line
|
1745
|
+
#line 738 "parser.rl"
|
1738
1746
|
p = json->source;
|
1739
1747
|
pe = p + json->len;
|
1740
1748
|
|
1741
|
-
#line
|
1749
|
+
#line 1750 "parser.c"
|
1742
1750
|
{
|
1743
1751
|
if ( p == pe )
|
1744
1752
|
goto _test_eof;
|
@@ -1794,7 +1802,7 @@ case 5:
|
|
1794
1802
|
goto st1;
|
1795
1803
|
goto st5;
|
1796
1804
|
tr3:
|
1797
|
-
#line
|
1805
|
+
#line 539 "parser.rl"
|
1798
1806
|
{
|
1799
1807
|
char *np;
|
1800
1808
|
json->current_nesting = 1;
|
@@ -1803,7 +1811,7 @@ tr3:
|
|
1803
1811
|
}
|
1804
1812
|
goto st10;
|
1805
1813
|
tr4:
|
1806
|
-
#line
|
1814
|
+
#line 532 "parser.rl"
|
1807
1815
|
{
|
1808
1816
|
char *np;
|
1809
1817
|
json->current_nesting = 1;
|
@@ -1815,7 +1823,7 @@ st10:
|
|
1815
1823
|
if ( ++p == pe )
|
1816
1824
|
goto _test_eof10;
|
1817
1825
|
case 10:
|
1818
|
-
#line
|
1826
|
+
#line 1827 "parser.c"
|
1819
1827
|
switch( (*p) ) {
|
1820
1828
|
case 13: goto st10;
|
1821
1829
|
case 32: goto st10;
|
@@ -1872,7 +1880,7 @@ case 9:
|
|
1872
1880
|
_out: {}
|
1873
1881
|
}
|
1874
1882
|
|
1875
|
-
#line
|
1883
|
+
#line 741 "parser.rl"
|
1876
1884
|
|
1877
1885
|
if (cs >= JSON_first_final && p == pe) {
|
1878
1886
|
return result;
|
@@ -1952,6 +1960,8 @@ void Init_parser()
|
|
1952
1960
|
i_match_string = rb_intern("match_string");
|
1953
1961
|
i_key_p = rb_intern("key?");
|
1954
1962
|
i_deep_const_get = rb_intern("deep_const_get");
|
1963
|
+
i_aset = rb_intern("[]=");
|
1964
|
+
i_leftshift = rb_intern("<<");
|
1955
1965
|
#ifdef HAVE_RUBY_ENCODING_H
|
1956
1966
|
CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8"));
|
1957
1967
|
CEncoding_UTF_16BE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-16be"));
|