json 1.1.4 → 1.1.5
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 +4 -0
- data/Rakefile +41 -76
- data/VERSION +1 -1
- data/benchmarks/generator_benchmark.rb +3 -0
- data/benchmarks/parser_benchmark.rb +4 -0
- data/doc-templates/main.txt +1 -2
- data/ext/json/ext/parser/parser.c +101 -77
- data/ext/json/ext/parser/parser.rl +27 -3
- data/ext/json/ext/parser/unicode.c +1 -1
- data/lib/json.rb +3 -7
- data/lib/json/pure/parser.rb +6 -2
- data/lib/json/version.rb +1 -2
- data/tests/test_json.rb +16 -0
- metadata +110 -108
data/CHANGES
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
2009-05-10 (1.1.5)
|
2
|
+
* Started to build gems with rake-compiler gem.
|
3
|
+
* Applied patch object/array class patch from Brian Candler
|
4
|
+
<B.Candler@pobox.com> and fixes.
|
1
5
|
2009-04-01 (1.1.4)
|
2
6
|
* Fixed a bug in the creation of serialized generic rails objects reported by
|
3
7
|
Friedrich Graeter <graeter@hydrixos.org>.
|
data/Rakefile
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
begin
|
2
2
|
require 'rake/gempackagetask'
|
3
|
+
require 'rake/extensiontask'
|
3
4
|
rescue LoadError
|
4
5
|
end
|
5
6
|
require 'rake/clean'
|
@@ -7,10 +8,9 @@ require 'rake/clean'
|
|
7
8
|
require 'rbconfig'
|
8
9
|
include Config
|
9
10
|
|
10
|
-
ON_WINDOWS = RUBY_PLATFORM =~ /mswin32/i
|
11
11
|
PKG_NAME = 'json'
|
12
12
|
PKG_VERSION = File.read('VERSION').chomp
|
13
|
-
PKG_FILES = FileList["**/*"].exclude(/CVS|pkg|coverage|Makefile/).exclude(/\.(so|bundle|o|#{CONFIG['DLEXT']})$/)
|
13
|
+
PKG_FILES = FileList["**/*"].exclude(/CVS|pkg|tmp|coverage|Makefile/).exclude(/\.(so|bundle|o|#{CONFIG['DLEXT']})$/)
|
14
14
|
EXT_ROOT_DIR = 'ext/json/ext'
|
15
15
|
EXT_PARSER_DIR = "#{EXT_ROOT_DIR}/parser"
|
16
16
|
EXT_PARSER_DL = "#{EXT_ROOT_DIR}/parser.#{CONFIG['DLEXT']}"
|
@@ -22,10 +22,9 @@ EXT_GENERATOR_SRC = "#{EXT_GENERATOR_DIR}/generator.c"
|
|
22
22
|
RAGEL_CODEGEN = %w[rlcodegen rlgen-cd ragel].find { |c| system(c, '-v') }
|
23
23
|
RAGEL_DOTGEN = %w[rlgen-dot rlgen-cd ragel].find { |c| system(c, '-v') }
|
24
24
|
RAGEL_PATH = "#{EXT_PARSER_DIR}/parser.rl"
|
25
|
-
CLEAN.include 'doc', 'coverage',
|
26
|
-
FileList["ext
|
27
|
-
FileList["ext
|
28
|
-
|
25
|
+
CLEAN.include FileList['diagrams/*.*'], 'doc', 'coverage', 'tmp',
|
26
|
+
FileList["ext/**/{Makefile,mkmf.log}"],
|
27
|
+
FileList["{ext,lib}/**/*.{so,bundle,#{CONFIG['DLEXT']},o,obj,pdb,lib,manifest,exp,def}"]
|
29
28
|
|
30
29
|
desc "Installing library (pure)"
|
31
30
|
task :install_pure => :version do
|
@@ -44,22 +43,18 @@ task :install_ext_really do
|
|
44
43
|
end
|
45
44
|
|
46
45
|
desc "Installing library (extension)"
|
47
|
-
task :install_ext => [ :
|
46
|
+
task :install_ext => [ :compile_ext, :install_pure, :install_ext_really ]
|
48
47
|
|
48
|
+
desc "Installing library (extension)"
|
49
49
|
task :install => :install_ext
|
50
50
|
|
51
51
|
desc "Compiling extension"
|
52
|
-
task :
|
52
|
+
task :compile_ext => [ EXT_PARSER_DL, EXT_GENERATOR_DL ]
|
53
53
|
|
54
54
|
file EXT_PARSER_DL => EXT_PARSER_SRC do
|
55
55
|
cd EXT_PARSER_DIR do
|
56
56
|
ruby 'extconf.rb'
|
57
|
-
|
58
|
-
system 'nmake'
|
59
|
-
system "mt -manifest parser.#{CONFIG['DLEXT']}.manifest -outputresource:parser.#{CONFIG['DLEXT']};2"
|
60
|
-
else
|
61
|
-
system 'make'
|
62
|
-
end
|
57
|
+
system 'make'
|
63
58
|
end
|
64
59
|
cp "#{EXT_PARSER_DIR}/parser.#{CONFIG['DLEXT']}", EXT_ROOT_DIR
|
65
60
|
end
|
@@ -67,12 +62,7 @@ end
|
|
67
62
|
file EXT_GENERATOR_DL => EXT_GENERATOR_SRC do
|
68
63
|
cd EXT_GENERATOR_DIR do
|
69
64
|
ruby 'extconf.rb'
|
70
|
-
|
71
|
-
system 'nmake'
|
72
|
-
system "mt -manifest generator.#{CONFIG['DLEXT']}.manifest -outputresource:generator.#{CONFIG['DLEXT']};2"
|
73
|
-
else
|
74
|
-
system 'make'
|
75
|
-
end
|
65
|
+
system 'make'
|
76
66
|
end
|
77
67
|
cp "#{EXT_GENERATOR_DIR}/generator.#{CONFIG['DLEXT']}", EXT_ROOT_DIR
|
78
68
|
end
|
@@ -133,12 +123,15 @@ task :test_pure => :clean do
|
|
133
123
|
end
|
134
124
|
|
135
125
|
desc "Testing library (extension)"
|
136
|
-
task :test_ext => :
|
126
|
+
task :test_ext => :compile_ext do
|
137
127
|
ENV['JSON'] = 'ext'
|
138
128
|
ENV['RUBYOPT'] = "-Iext:lib #{ENV['RUBYOPT']}"
|
139
129
|
system "testrb #{Dir['tests/*.rb'] * ' '}"
|
140
130
|
end
|
141
131
|
|
132
|
+
desc "Testing library (pure ruby and extension)"
|
133
|
+
task :test => [ :test_pure, :test_ext ]
|
134
|
+
|
142
135
|
desc "Benchmarking parser"
|
143
136
|
task :benchmark_parser do
|
144
137
|
ruby 'benchmarks/parser_benchmark.rb'
|
@@ -162,7 +155,7 @@ task :doc => [ :version, EXT_PARSER_SRC ] do
|
|
162
155
|
system "rdoc -S -o doc -m main.txt doc-templates/main.txt lib/json.rb #{FileList['lib/json/**/*.rb']} #{EXT_PARSER_SRC} #{EXT_GENERATOR_SRC}"
|
163
156
|
end
|
164
157
|
|
165
|
-
if defined?
|
158
|
+
if defined?(Gem) and defined?(Rake::GemPackageTask) and defined?(Rake::ExtensionTask)
|
166
159
|
spec_pure = Gem::Specification.new do |s|
|
167
160
|
s.name = 'json_pure'
|
168
161
|
s.version = PKG_VERSION
|
@@ -174,7 +167,7 @@ if defined? Gem
|
|
174
167
|
s.require_path = 'lib'
|
175
168
|
|
176
169
|
s.bindir = "bin"
|
177
|
-
s.executables = ["edit_json.rb"]
|
170
|
+
s.executables = [ "edit_json.rb", "prettify_json.rb" ]
|
178
171
|
s.default_executable = "edit_json.rb"
|
179
172
|
|
180
173
|
s.has_rdoc = true
|
@@ -202,16 +195,14 @@ if defined? Gem
|
|
202
195
|
|
203
196
|
s.files = PKG_FILES
|
204
197
|
|
205
|
-
s.extensions
|
206
|
-
"#{EXT_PARSER_DIR}/extconf.rb" <<
|
207
|
-
"#{EXT_GENERATOR_DIR}/extconf.rb"
|
198
|
+
s.extensions = FileList['ext/**/extconf.rb']
|
208
199
|
|
209
200
|
s.require_path = EXT_ROOT_DIR
|
210
201
|
s.require_paths << 'ext'
|
211
202
|
s.require_paths << 'lib'
|
212
203
|
|
213
204
|
s.bindir = "bin"
|
214
|
-
s.executables = ["edit_json.rb"]
|
205
|
+
s.executables = [ "edit_json.rb", "prettify_json.rb" ]
|
215
206
|
s.default_executable = "edit_json.rb"
|
216
207
|
|
217
208
|
s.has_rdoc = true
|
@@ -227,52 +218,26 @@ if defined? Gem
|
|
227
218
|
end
|
228
219
|
|
229
220
|
Rake::GemPackageTask.new(spec_ext) do |pkg|
|
230
|
-
pkg.need_tar
|
231
|
-
pkg.package_files
|
221
|
+
pkg.need_tar = true
|
222
|
+
pkg.package_files = PKG_FILES
|
232
223
|
end
|
233
224
|
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
s.description = ""
|
242
|
-
|
243
|
-
s.files = PKG_FILES.to_a <<
|
244
|
-
"#{EXT_ROOT_DIR}/parser.#{CONFIG['DLEXT']}" <<
|
245
|
-
"#{EXT_ROOT_DIR}/generator.#{CONFIG['DLEXT']}"
|
246
|
-
|
247
|
-
s.require_path = EXT_ROOT_DIR
|
248
|
-
s.require_paths << 'ext'
|
249
|
-
s.require_paths << 'lib'
|
250
|
-
|
251
|
-
s.bindir = "bin"
|
252
|
-
s.executables = ["edit_json.rb", "prettify_json.rb"]
|
253
|
-
s.default_executable = "edit_json.rb"
|
254
|
-
|
255
|
-
s.has_rdoc = true
|
256
|
-
s.rdoc_options <<
|
257
|
-
'--title' << 'JSON -- A JSON implemention' <<
|
258
|
-
'--main' << 'JSON' << '--line-numbers'
|
259
|
-
s.test_files.concat Dir['tests/*.rb']
|
260
|
-
|
261
|
-
s.author = "Florian Frank"
|
262
|
-
s.email = "flori@ping.de"
|
263
|
-
s.homepage = "http://json.rubyforge.org"
|
264
|
-
s.rubyforge_project = "json"
|
265
|
-
end
|
266
|
-
|
267
|
-
gem_file = "json-#{spec_win_ext.version}-#{spec_win_ext.platform}.gem"
|
268
|
-
Gem::Builder.new(spec_win_ext).build
|
269
|
-
mv gem_file, 'pkg'
|
225
|
+
Rake::ExtensionTask.new do |ext|
|
226
|
+
ext.name = 'parser'
|
227
|
+
ext.gem_spec = spec_ext
|
228
|
+
ext.cross_compile = true
|
229
|
+
ext.cross_platform = 'i386-mswin32'
|
230
|
+
ext.ext_dir = 'ext/json/ext/parser'
|
231
|
+
ext.lib_dir = 'lib/json/ext'
|
270
232
|
end
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
233
|
+
|
234
|
+
Rake::ExtensionTask.new do |ext|
|
235
|
+
ext.name = 'generator'
|
236
|
+
ext.gem_spec = spec_ext
|
237
|
+
ext.cross_compile = true
|
238
|
+
ext.cross_platform = 'i386-mswin32'
|
239
|
+
ext.ext_dir = 'ext/json/ext/generator'
|
240
|
+
ext.lib_dir = 'lib/json/ext'
|
276
241
|
end
|
277
242
|
end
|
278
243
|
|
@@ -288,16 +253,16 @@ module JSON
|
|
288
253
|
VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
|
289
254
|
VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
|
290
255
|
VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
|
291
|
-
VARIANT_BINARY = #{!!ON_WINDOWS}
|
292
256
|
end
|
293
257
|
EOT
|
294
258
|
end
|
295
259
|
end
|
296
260
|
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
261
|
+
# TODO task :release => [ :version, :clean, :package_win ]
|
262
|
+
desc "Build all gems and archives for a new release."
|
263
|
+
task :release => [ :clean, :version, :cross, :native, :gem ] do
|
264
|
+
system "#$0 clean native gem"
|
265
|
+
system "#$0 clean package"
|
301
266
|
end
|
302
267
|
|
303
|
-
task :default => [ :version, :
|
268
|
+
task :default => [ :version, :compile_ext ]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.5
|
@@ -63,6 +63,7 @@ class GeneratorBenchmarkExt < Bullshit::RepeatCase
|
|
63
63
|
truncate_data do
|
64
64
|
alpha_level 0.05
|
65
65
|
window_size 50
|
66
|
+
slope_angle 0.1
|
66
67
|
end
|
67
68
|
|
68
69
|
autocorrelation do
|
@@ -87,6 +88,7 @@ class GeneratorBenchmarkPure < Bullshit::RepeatCase
|
|
87
88
|
truncate_data do
|
88
89
|
alpha_level 0.05
|
89
90
|
window_size 50
|
91
|
+
slope_angle 0.1
|
90
92
|
end
|
91
93
|
|
92
94
|
autocorrelation do
|
@@ -110,6 +112,7 @@ class GeneratorBenchmarkRails < Bullshit::RepeatCase
|
|
110
112
|
truncate_data do
|
111
113
|
alpha_level 0.05
|
112
114
|
window_size 50
|
115
|
+
slope_angle 0.1
|
113
116
|
end
|
114
117
|
|
115
118
|
autocorrelation do
|
@@ -43,6 +43,7 @@ class ParserBenchmarkExt < Bullshit::RepeatCase
|
|
43
43
|
truncate_data do
|
44
44
|
alpha_level 0.05
|
45
45
|
window_size 50
|
46
|
+
slope_angle 0.1
|
46
47
|
end
|
47
48
|
|
48
49
|
autocorrelation do
|
@@ -72,6 +73,7 @@ class ParserBenchmarkPure < Bullshit::RepeatCase
|
|
72
73
|
truncate_data do
|
73
74
|
alpha_level 0.05
|
74
75
|
window_size 50
|
76
|
+
slope_angle 0.1
|
75
77
|
end
|
76
78
|
|
77
79
|
autocorrelation do
|
@@ -99,6 +101,7 @@ class ParserBenchmarkYAML < Bullshit::RepeatCase
|
|
99
101
|
truncate_data do
|
100
102
|
alpha_level 0.05
|
101
103
|
window_size 50
|
104
|
+
slope_angle 0.1
|
102
105
|
end
|
103
106
|
|
104
107
|
autocorrelation do
|
@@ -134,6 +137,7 @@ class ParserBenchmarkRails < Bullshit::RepeatCase
|
|
134
137
|
truncate_data do
|
135
138
|
alpha_level 0.05
|
136
139
|
window_size 50
|
140
|
+
slope_angle 0.1
|
137
141
|
end
|
138
142
|
|
139
143
|
autocorrelation do
|
data/doc-templates/main.txt
CHANGED
@@ -76,8 +76,7 @@
|
|
76
76
|
#
|
77
77
|
# == Speed Comparisons
|
78
78
|
#
|
79
|
-
# I have created some benchmark results
|
80
|
-
# patchlevel 287) [i686-linux] (see the benchmarks/data-p4-3Ghz-ruby18
|
79
|
+
# I have created some benchmark results (see the benchmarks/data-p4-3Ghz
|
81
80
|
# subdir of the package) for the JSON-parser to estimate the speed up in the C
|
82
81
|
# extension:
|
83
82
|
#
|
@@ -29,7 +29,7 @@ static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
|
|
29
29
|
static VALUE CNaN, CInfinity, CMinusInfinity;
|
30
30
|
|
31
31
|
static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
|
32
|
-
i_chr, i_max_nesting, i_allow_nan;
|
32
|
+
i_chr, i_max_nesting, i_allow_nan, i_object_class, i_array_class;
|
33
33
|
|
34
34
|
#define MinusInfinity "-Infinity"
|
35
35
|
|
@@ -42,6 +42,8 @@ typedef struct JSON_ParserStruct {
|
|
42
42
|
int max_nesting;
|
43
43
|
int current_nesting;
|
44
44
|
int allow_nan;
|
45
|
+
VALUE object_class;
|
46
|
+
VALUE array_class;
|
45
47
|
} JSON_Parser;
|
46
48
|
|
47
49
|
static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result);
|
@@ -56,11 +58,11 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
56
58
|
Data_Get_Struct(self, JSON_Parser, json);
|
57
59
|
|
58
60
|
|
59
|
-
#line
|
61
|
+
#line 84 "parser.rl"
|
60
62
|
|
61
63
|
|
62
64
|
|
63
|
-
#line
|
65
|
+
#line 66 "parser.c"
|
64
66
|
static const int JSON_object_start = 1;
|
65
67
|
static const int JSON_object_first_final = 27;
|
66
68
|
static const int JSON_object_error = 0;
|
@@ -68,29 +70,30 @@ static const int JSON_object_error = 0;
|
|
68
70
|
static const int JSON_object_en_main = 1;
|
69
71
|
|
70
72
|
|
71
|
-
#line
|
73
|
+
#line 117 "parser.rl"
|
72
74
|
|
73
75
|
|
74
76
|
static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
75
77
|
{
|
76
78
|
int cs = EVIL;
|
77
79
|
VALUE last_name = Qnil;
|
80
|
+
VALUE object_class = json->object_class;
|
78
81
|
|
79
82
|
if (json->max_nesting && json->current_nesting > json->max_nesting) {
|
80
83
|
rb_raise(eNestingError, "nesting of %d is to deep", json->current_nesting);
|
81
84
|
}
|
82
85
|
|
83
|
-
*result = rb_hash_new();
|
86
|
+
*result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class);
|
84
87
|
|
85
88
|
|
86
|
-
#line
|
89
|
+
#line 90 "parser.c"
|
87
90
|
{
|
88
91
|
cs = JSON_object_start;
|
89
92
|
}
|
90
93
|
|
91
|
-
#line
|
94
|
+
#line 132 "parser.rl"
|
92
95
|
|
93
|
-
#line
|
96
|
+
#line 97 "parser.c"
|
94
97
|
{
|
95
98
|
if ( p == pe )
|
96
99
|
goto _test_eof;
|
@@ -118,7 +121,7 @@ case 2:
|
|
118
121
|
goto st2;
|
119
122
|
goto st0;
|
120
123
|
tr2:
|
121
|
-
#line
|
124
|
+
#line 103 "parser.rl"
|
122
125
|
{
|
123
126
|
char *np = JSON_parse_string(json, p, pe, &last_name);
|
124
127
|
if (np == NULL) { p--; {p++; cs = 3; goto _out;} } else {p = (( np))-1;}
|
@@ -128,7 +131,7 @@ st3:
|
|
128
131
|
if ( ++p == pe )
|
129
132
|
goto _test_eof3;
|
130
133
|
case 3:
|
131
|
-
#line
|
134
|
+
#line 135 "parser.c"
|
132
135
|
switch( (*p) ) {
|
133
136
|
case 13: goto st3;
|
134
137
|
case 32: goto st3;
|
@@ -195,7 +198,7 @@ case 8:
|
|
195
198
|
goto st8;
|
196
199
|
goto st0;
|
197
200
|
tr11:
|
198
|
-
#line
|
201
|
+
#line 92 "parser.rl"
|
199
202
|
{
|
200
203
|
VALUE v = Qnil;
|
201
204
|
char *np = JSON_parse_value(json, p, pe, &v);
|
@@ -211,7 +214,7 @@ st9:
|
|
211
214
|
if ( ++p == pe )
|
212
215
|
goto _test_eof9;
|
213
216
|
case 9:
|
214
|
-
#line
|
217
|
+
#line 218 "parser.c"
|
215
218
|
switch( (*p) ) {
|
216
219
|
case 13: goto st9;
|
217
220
|
case 32: goto st9;
|
@@ -300,14 +303,14 @@ case 18:
|
|
300
303
|
goto st9;
|
301
304
|
goto st18;
|
302
305
|
tr4:
|
303
|
-
#line
|
306
|
+
#line 108 "parser.rl"
|
304
307
|
{ p--; {p++; cs = 27; goto _out;} }
|
305
308
|
goto st27;
|
306
309
|
st27:
|
307
310
|
if ( ++p == pe )
|
308
311
|
goto _test_eof27;
|
309
312
|
case 27:
|
310
|
-
#line
|
313
|
+
#line 314 "parser.c"
|
311
314
|
goto st0;
|
312
315
|
st19:
|
313
316
|
if ( ++p == pe )
|
@@ -405,7 +408,7 @@ case 26:
|
|
405
408
|
_out: {}
|
406
409
|
}
|
407
410
|
|
408
|
-
#line
|
411
|
+
#line 133 "parser.rl"
|
409
412
|
|
410
413
|
if (cs >= JSON_object_first_final) {
|
411
414
|
if (RTEST(json->create_id)) {
|
@@ -424,7 +427,7 @@ case 26:
|
|
424
427
|
}
|
425
428
|
|
426
429
|
|
427
|
-
#line
|
430
|
+
#line 431 "parser.c"
|
428
431
|
static const int JSON_value_start = 1;
|
429
432
|
static const int JSON_value_first_final = 21;
|
430
433
|
static const int JSON_value_error = 0;
|
@@ -432,7 +435,7 @@ static const int JSON_value_error = 0;
|
|
432
435
|
static const int JSON_value_en_main = 1;
|
433
436
|
|
434
437
|
|
435
|
-
#line
|
438
|
+
#line 231 "parser.rl"
|
436
439
|
|
437
440
|
|
438
441
|
static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -440,14 +443,14 @@ static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
440
443
|
int cs = EVIL;
|
441
444
|
|
442
445
|
|
443
|
-
#line
|
446
|
+
#line 447 "parser.c"
|
444
447
|
{
|
445
448
|
cs = JSON_value_start;
|
446
449
|
}
|
447
450
|
|
448
|
-
#line
|
451
|
+
#line 238 "parser.rl"
|
449
452
|
|
450
|
-
#line
|
453
|
+
#line 454 "parser.c"
|
451
454
|
{
|
452
455
|
if ( p == pe )
|
453
456
|
goto _test_eof;
|
@@ -472,14 +475,14 @@ st0:
|
|
472
475
|
cs = 0;
|
473
476
|
goto _out;
|
474
477
|
tr0:
|
475
|
-
#line
|
478
|
+
#line 179 "parser.rl"
|
476
479
|
{
|
477
480
|
char *np = JSON_parse_string(json, p, pe, result);
|
478
481
|
if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
|
479
482
|
}
|
480
483
|
goto st21;
|
481
484
|
tr2:
|
482
|
-
#line
|
485
|
+
#line 184 "parser.rl"
|
483
486
|
{
|
484
487
|
char *np;
|
485
488
|
if(pe > p + 9 && !strncmp(MinusInfinity, p, 9)) {
|
@@ -499,7 +502,7 @@ tr2:
|
|
499
502
|
}
|
500
503
|
goto st21;
|
501
504
|
tr5:
|
502
|
-
#line
|
505
|
+
#line 202 "parser.rl"
|
503
506
|
{
|
504
507
|
char *np;
|
505
508
|
json->current_nesting++;
|
@@ -509,7 +512,7 @@ tr5:
|
|
509
512
|
}
|
510
513
|
goto st21;
|
511
514
|
tr9:
|
512
|
-
#line
|
515
|
+
#line 210 "parser.rl"
|
513
516
|
{
|
514
517
|
char *np;
|
515
518
|
json->current_nesting++;
|
@@ -519,7 +522,7 @@ tr9:
|
|
519
522
|
}
|
520
523
|
goto st21;
|
521
524
|
tr16:
|
522
|
-
#line
|
525
|
+
#line 172 "parser.rl"
|
523
526
|
{
|
524
527
|
if (json->allow_nan) {
|
525
528
|
*result = CInfinity;
|
@@ -529,7 +532,7 @@ tr16:
|
|
529
532
|
}
|
530
533
|
goto st21;
|
531
534
|
tr18:
|
532
|
-
#line
|
535
|
+
#line 165 "parser.rl"
|
533
536
|
{
|
534
537
|
if (json->allow_nan) {
|
535
538
|
*result = CNaN;
|
@@ -539,19 +542,19 @@ tr18:
|
|
539
542
|
}
|
540
543
|
goto st21;
|
541
544
|
tr22:
|
542
|
-
#line
|
545
|
+
#line 159 "parser.rl"
|
543
546
|
{
|
544
547
|
*result = Qfalse;
|
545
548
|
}
|
546
549
|
goto st21;
|
547
550
|
tr25:
|
548
|
-
#line
|
551
|
+
#line 156 "parser.rl"
|
549
552
|
{
|
550
553
|
*result = Qnil;
|
551
554
|
}
|
552
555
|
goto st21;
|
553
556
|
tr28:
|
554
|
-
#line
|
557
|
+
#line 162 "parser.rl"
|
555
558
|
{
|
556
559
|
*result = Qtrue;
|
557
560
|
}
|
@@ -560,9 +563,9 @@ st21:
|
|
560
563
|
if ( ++p == pe )
|
561
564
|
goto _test_eof21;
|
562
565
|
case 21:
|
563
|
-
#line
|
566
|
+
#line 218 "parser.rl"
|
564
567
|
{ p--; {p++; cs = 21; goto _out;} }
|
565
|
-
#line
|
568
|
+
#line 569 "parser.c"
|
566
569
|
goto st0;
|
567
570
|
st2:
|
568
571
|
if ( ++p == pe )
|
@@ -723,7 +726,7 @@ case 20:
|
|
723
726
|
_out: {}
|
724
727
|
}
|
725
728
|
|
726
|
-
#line
|
729
|
+
#line 239 "parser.rl"
|
727
730
|
|
728
731
|
if (cs >= JSON_value_first_final) {
|
729
732
|
return p;
|
@@ -733,7 +736,7 @@ case 20:
|
|
733
736
|
}
|
734
737
|
|
735
738
|
|
736
|
-
#line
|
739
|
+
#line 740 "parser.c"
|
737
740
|
static const int JSON_integer_start = 1;
|
738
741
|
static const int JSON_integer_first_final = 5;
|
739
742
|
static const int JSON_integer_error = 0;
|
@@ -741,7 +744,7 @@ static const int JSON_integer_error = 0;
|
|
741
744
|
static const int JSON_integer_en_main = 1;
|
742
745
|
|
743
746
|
|
744
|
-
#line
|
747
|
+
#line 255 "parser.rl"
|
745
748
|
|
746
749
|
|
747
750
|
static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -749,15 +752,15 @@ static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *res
|
|
749
752
|
int cs = EVIL;
|
750
753
|
|
751
754
|
|
752
|
-
#line
|
755
|
+
#line 756 "parser.c"
|
753
756
|
{
|
754
757
|
cs = JSON_integer_start;
|
755
758
|
}
|
756
759
|
|
757
|
-
#line
|
760
|
+
#line 262 "parser.rl"
|
758
761
|
json->memo = p;
|
759
762
|
|
760
|
-
#line
|
763
|
+
#line 764 "parser.c"
|
761
764
|
{
|
762
765
|
if ( p == pe )
|
763
766
|
goto _test_eof;
|
@@ -791,14 +794,14 @@ case 3:
|
|
791
794
|
goto st0;
|
792
795
|
goto tr4;
|
793
796
|
tr4:
|
794
|
-
#line
|
797
|
+
#line 252 "parser.rl"
|
795
798
|
{ p--; {p++; cs = 5; goto _out;} }
|
796
799
|
goto st5;
|
797
800
|
st5:
|
798
801
|
if ( ++p == pe )
|
799
802
|
goto _test_eof5;
|
800
803
|
case 5:
|
801
|
-
#line
|
804
|
+
#line 805 "parser.c"
|
802
805
|
goto st0;
|
803
806
|
st4:
|
804
807
|
if ( ++p == pe )
|
@@ -817,7 +820,7 @@ case 4:
|
|
817
820
|
_out: {}
|
818
821
|
}
|
819
822
|
|
820
|
-
#line
|
823
|
+
#line 264 "parser.rl"
|
821
824
|
|
822
825
|
if (cs >= JSON_integer_first_final) {
|
823
826
|
long len = p - json->memo;
|
@@ -829,7 +832,7 @@ case 4:
|
|
829
832
|
}
|
830
833
|
|
831
834
|
|
832
|
-
#line
|
835
|
+
#line 836 "parser.c"
|
833
836
|
static const int JSON_float_start = 1;
|
834
837
|
static const int JSON_float_first_final = 10;
|
835
838
|
static const int JSON_float_error = 0;
|
@@ -837,7 +840,7 @@ static const int JSON_float_error = 0;
|
|
837
840
|
static const int JSON_float_en_main = 1;
|
838
841
|
|
839
842
|
|
840
|
-
#line
|
843
|
+
#line 286 "parser.rl"
|
841
844
|
|
842
845
|
|
843
846
|
static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -845,15 +848,15 @@ static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *resul
|
|
845
848
|
int cs = EVIL;
|
846
849
|
|
847
850
|
|
848
|
-
#line
|
851
|
+
#line 852 "parser.c"
|
849
852
|
{
|
850
853
|
cs = JSON_float_start;
|
851
854
|
}
|
852
855
|
|
853
|
-
#line
|
856
|
+
#line 293 "parser.rl"
|
854
857
|
json->memo = p;
|
855
858
|
|
856
|
-
#line
|
859
|
+
#line 860 "parser.c"
|
857
860
|
{
|
858
861
|
if ( p == pe )
|
859
862
|
goto _test_eof;
|
@@ -911,14 +914,14 @@ case 5:
|
|
911
914
|
goto st0;
|
912
915
|
goto tr7;
|
913
916
|
tr7:
|
914
|
-
#line
|
917
|
+
#line 280 "parser.rl"
|
915
918
|
{ p--; {p++; cs = 10; goto _out;} }
|
916
919
|
goto st10;
|
917
920
|
st10:
|
918
921
|
if ( ++p == pe )
|
919
922
|
goto _test_eof10;
|
920
923
|
case 10:
|
921
|
-
#line
|
924
|
+
#line 925 "parser.c"
|
922
925
|
goto st0;
|
923
926
|
st6:
|
924
927
|
if ( ++p == pe )
|
@@ -979,7 +982,7 @@ case 9:
|
|
979
982
|
_out: {}
|
980
983
|
}
|
981
984
|
|
982
|
-
#line
|
985
|
+
#line 295 "parser.rl"
|
983
986
|
|
984
987
|
if (cs >= JSON_float_first_final) {
|
985
988
|
long len = p - json->memo;
|
@@ -992,7 +995,7 @@ case 9:
|
|
992
995
|
|
993
996
|
|
994
997
|
|
995
|
-
#line
|
998
|
+
#line 999 "parser.c"
|
996
999
|
static const int JSON_array_start = 1;
|
997
1000
|
static const int JSON_array_first_final = 17;
|
998
1001
|
static const int JSON_array_error = 0;
|
@@ -1000,27 +1003,28 @@ static const int JSON_array_error = 0;
|
|
1000
1003
|
static const int JSON_array_en_main = 1;
|
1001
1004
|
|
1002
1005
|
|
1003
|
-
#line
|
1006
|
+
#line 331 "parser.rl"
|
1004
1007
|
|
1005
1008
|
|
1006
1009
|
static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
1007
1010
|
{
|
1008
1011
|
int cs = EVIL;
|
1012
|
+
VALUE array_class = json->array_class;
|
1009
1013
|
|
1010
1014
|
if (json->max_nesting && json->current_nesting > json->max_nesting) {
|
1011
1015
|
rb_raise(eNestingError, "nesting of %d is to deep", json->current_nesting);
|
1012
1016
|
}
|
1013
|
-
*result = rb_ary_new();
|
1017
|
+
*result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class);
|
1014
1018
|
|
1015
1019
|
|
1016
|
-
#line
|
1020
|
+
#line 1021 "parser.c"
|
1017
1021
|
{
|
1018
1022
|
cs = JSON_array_start;
|
1019
1023
|
}
|
1020
1024
|
|
1021
|
-
#line
|
1025
|
+
#line 344 "parser.rl"
|
1022
1026
|
|
1023
|
-
#line
|
1027
|
+
#line 1028 "parser.c"
|
1024
1028
|
{
|
1025
1029
|
if ( p == pe )
|
1026
1030
|
goto _test_eof;
|
@@ -1059,7 +1063,7 @@ case 2:
|
|
1059
1063
|
goto st2;
|
1060
1064
|
goto st0;
|
1061
1065
|
tr2:
|
1062
|
-
#line
|
1066
|
+
#line 312 "parser.rl"
|
1063
1067
|
{
|
1064
1068
|
VALUE v = Qnil;
|
1065
1069
|
char *np = JSON_parse_value(json, p, pe, &v);
|
@@ -1075,7 +1079,7 @@ st3:
|
|
1075
1079
|
if ( ++p == pe )
|
1076
1080
|
goto _test_eof3;
|
1077
1081
|
case 3:
|
1078
|
-
#line
|
1082
|
+
#line 1083 "parser.c"
|
1079
1083
|
switch( (*p) ) {
|
1080
1084
|
case 13: goto st3;
|
1081
1085
|
case 32: goto st3;
|
@@ -1175,14 +1179,14 @@ case 12:
|
|
1175
1179
|
goto st3;
|
1176
1180
|
goto st12;
|
1177
1181
|
tr4:
|
1178
|
-
#line
|
1182
|
+
#line 323 "parser.rl"
|
1179
1183
|
{ p--; {p++; cs = 17; goto _out;} }
|
1180
1184
|
goto st17;
|
1181
1185
|
st17:
|
1182
1186
|
if ( ++p == pe )
|
1183
1187
|
goto _test_eof17;
|
1184
1188
|
case 17:
|
1185
|
-
#line
|
1189
|
+
#line 1190 "parser.c"
|
1186
1190
|
goto st0;
|
1187
1191
|
st13:
|
1188
1192
|
if ( ++p == pe )
|
@@ -1238,7 +1242,7 @@ case 16:
|
|
1238
1242
|
_out: {}
|
1239
1243
|
}
|
1240
1244
|
|
1241
|
-
#line
|
1245
|
+
#line 345 "parser.rl"
|
1242
1246
|
|
1243
1247
|
if(cs >= JSON_array_first_final) {
|
1244
1248
|
return p + 1;
|
@@ -1304,7 +1308,7 @@ static VALUE json_string_unescape(char *p, char *pe)
|
|
1304
1308
|
}
|
1305
1309
|
|
1306
1310
|
|
1307
|
-
#line
|
1311
|
+
#line 1312 "parser.c"
|
1308
1312
|
static const int JSON_string_start = 1;
|
1309
1313
|
static const int JSON_string_first_final = 8;
|
1310
1314
|
static const int JSON_string_error = 0;
|
@@ -1312,7 +1316,7 @@ static const int JSON_string_error = 0;
|
|
1312
1316
|
static const int JSON_string_en_main = 1;
|
1313
1317
|
|
1314
1318
|
|
1315
|
-
#line
|
1319
|
+
#line 429 "parser.rl"
|
1316
1320
|
|
1317
1321
|
|
1318
1322
|
static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result)
|
@@ -1321,15 +1325,15 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
|
|
1321
1325
|
|
1322
1326
|
*result = rb_str_new("", 0);
|
1323
1327
|
|
1324
|
-
#line
|
1328
|
+
#line 1329 "parser.c"
|
1325
1329
|
{
|
1326
1330
|
cs = JSON_string_start;
|
1327
1331
|
}
|
1328
1332
|
|
1329
|
-
#line
|
1333
|
+
#line 437 "parser.rl"
|
1330
1334
|
json->memo = p;
|
1331
1335
|
|
1332
|
-
#line
|
1336
|
+
#line 1337 "parser.c"
|
1333
1337
|
{
|
1334
1338
|
if ( p == pe )
|
1335
1339
|
goto _test_eof;
|
@@ -1354,7 +1358,7 @@ case 2:
|
|
1354
1358
|
goto st0;
|
1355
1359
|
goto st2;
|
1356
1360
|
tr2:
|
1357
|
-
#line
|
1361
|
+
#line 415 "parser.rl"
|
1358
1362
|
{
|
1359
1363
|
*result = json_string_unescape(json->memo + 1, p);
|
1360
1364
|
if (NIL_P(*result)) {
|
@@ -1365,14 +1369,14 @@ tr2:
|
|
1365
1369
|
{p = (( p + 1))-1;}
|
1366
1370
|
}
|
1367
1371
|
}
|
1368
|
-
#line
|
1372
|
+
#line 426 "parser.rl"
|
1369
1373
|
{ p--; {p++; cs = 8; goto _out;} }
|
1370
1374
|
goto st8;
|
1371
1375
|
st8:
|
1372
1376
|
if ( ++p == pe )
|
1373
1377
|
goto _test_eof8;
|
1374
1378
|
case 8:
|
1375
|
-
#line
|
1379
|
+
#line 1380 "parser.c"
|
1376
1380
|
goto st0;
|
1377
1381
|
st3:
|
1378
1382
|
if ( ++p == pe )
|
@@ -1448,7 +1452,7 @@ case 7:
|
|
1448
1452
|
_out: {}
|
1449
1453
|
}
|
1450
1454
|
|
1451
|
-
#line
|
1455
|
+
#line 439 "parser.rl"
|
1452
1456
|
|
1453
1457
|
if (cs >= JSON_string_first_final) {
|
1454
1458
|
return p + 1;
|
@@ -1459,7 +1463,7 @@ case 7:
|
|
1459
1463
|
|
1460
1464
|
|
1461
1465
|
|
1462
|
-
#line
|
1466
|
+
#line 1467 "parser.c"
|
1463
1467
|
static const int JSON_start = 1;
|
1464
1468
|
static const int JSON_first_final = 10;
|
1465
1469
|
static const int JSON_error = 0;
|
@@ -1467,7 +1471,7 @@ static const int JSON_error = 0;
|
|
1467
1471
|
static const int JSON_en_main = 1;
|
1468
1472
|
|
1469
1473
|
|
1470
|
-
#line
|
1474
|
+
#line 473 "parser.rl"
|
1471
1475
|
|
1472
1476
|
|
1473
1477
|
/*
|
@@ -1502,6 +1506,8 @@ static const int JSON_en_main = 1;
|
|
1502
1506
|
* * *create_additions*: If set to false, the Parser doesn't create
|
1503
1507
|
* additions even if a matchin class and create_id was found. This option
|
1504
1508
|
* defaults to true.
|
1509
|
+
* * *object_class*: Defaults to Hash
|
1510
|
+
* * *array_class*: Defaults to Array
|
1505
1511
|
*/
|
1506
1512
|
static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
|
1507
1513
|
{
|
@@ -1551,11 +1557,25 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
|
|
1551
1557
|
} else {
|
1552
1558
|
json->create_id = rb_funcall(mJSON, i_create_id, 0);
|
1553
1559
|
}
|
1560
|
+
tmp = ID2SYM(i_object_class);
|
1561
|
+
if (st_lookup(RHASH_TBL(opts), tmp, 0)) {
|
1562
|
+
json->object_class = rb_hash_aref(opts, tmp);
|
1563
|
+
} else {
|
1564
|
+
json->object_class = Qnil;
|
1565
|
+
}
|
1566
|
+
tmp = ID2SYM(i_array_class);
|
1567
|
+
if (st_lookup(RHASH_TBL(opts), tmp, 0)) {
|
1568
|
+
json->array_class = rb_hash_aref(opts, tmp);
|
1569
|
+
} else {
|
1570
|
+
json->array_class = Qnil;
|
1571
|
+
}
|
1554
1572
|
}
|
1555
1573
|
} else {
|
1556
1574
|
json->max_nesting = 19;
|
1557
1575
|
json->allow_nan = 0;
|
1558
1576
|
json->create_id = rb_funcall(mJSON, i_create_id, 0);
|
1577
|
+
json->object_class = Qnil;
|
1578
|
+
json->array_class = Qnil;
|
1559
1579
|
}
|
1560
1580
|
json->current_nesting = 0;
|
1561
1581
|
/*
|
@@ -1590,16 +1610,16 @@ static VALUE cParser_parse(VALUE self)
|
|
1590
1610
|
GET_STRUCT;
|
1591
1611
|
|
1592
1612
|
|
1593
|
-
#line
|
1613
|
+
#line 1614 "parser.c"
|
1594
1614
|
{
|
1595
1615
|
cs = JSON_start;
|
1596
1616
|
}
|
1597
1617
|
|
1598
|
-
#line
|
1618
|
+
#line 611 "parser.rl"
|
1599
1619
|
p = json->source;
|
1600
1620
|
pe = p + json->len;
|
1601
1621
|
|
1602
|
-
#line
|
1622
|
+
#line 1623 "parser.c"
|
1603
1623
|
{
|
1604
1624
|
if ( p == pe )
|
1605
1625
|
goto _test_eof;
|
@@ -1655,7 +1675,7 @@ case 5:
|
|
1655
1675
|
goto st1;
|
1656
1676
|
goto st5;
|
1657
1677
|
tr3:
|
1658
|
-
#line
|
1678
|
+
#line 462 "parser.rl"
|
1659
1679
|
{
|
1660
1680
|
char *np;
|
1661
1681
|
json->current_nesting = 1;
|
@@ -1664,7 +1684,7 @@ tr3:
|
|
1664
1684
|
}
|
1665
1685
|
goto st10;
|
1666
1686
|
tr4:
|
1667
|
-
#line
|
1687
|
+
#line 455 "parser.rl"
|
1668
1688
|
{
|
1669
1689
|
char *np;
|
1670
1690
|
json->current_nesting = 1;
|
@@ -1676,7 +1696,7 @@ st10:
|
|
1676
1696
|
if ( ++p == pe )
|
1677
1697
|
goto _test_eof10;
|
1678
1698
|
case 10:
|
1679
|
-
#line
|
1699
|
+
#line 1700 "parser.c"
|
1680
1700
|
switch( (*p) ) {
|
1681
1701
|
case 13: goto st10;
|
1682
1702
|
case 32: goto st10;
|
@@ -1733,7 +1753,7 @@ case 9:
|
|
1733
1753
|
_out: {}
|
1734
1754
|
}
|
1735
1755
|
|
1736
|
-
#line
|
1756
|
+
#line 614 "parser.rl"
|
1737
1757
|
|
1738
1758
|
if (cs >= JSON_first_final && p == pe) {
|
1739
1759
|
return result;
|
@@ -1753,6 +1773,8 @@ static void JSON_mark(JSON_Parser *json)
|
|
1753
1773
|
{
|
1754
1774
|
rb_gc_mark_maybe(json->Vsource);
|
1755
1775
|
rb_gc_mark_maybe(json->create_id);
|
1776
|
+
rb_gc_mark_maybe(json->object_class);
|
1777
|
+
rb_gc_mark_maybe(json->array_class);
|
1756
1778
|
}
|
1757
1779
|
|
1758
1780
|
static void JSON_free(JSON_Parser *json)
|
@@ -1802,4 +1824,6 @@ void Init_parser()
|
|
1802
1824
|
i_chr = rb_intern("chr");
|
1803
1825
|
i_max_nesting = rb_intern("max_nesting");
|
1804
1826
|
i_allow_nan = rb_intern("allow_nan");
|
1827
|
+
i_object_class = rb_intern("object_class");
|
1828
|
+
i_array_class = rb_intern("array_class");
|
1805
1829
|
}
|