json_pure 1.1.4 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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 +109 -107
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
|
}
|