oj 3.13.0 → 3.13.4
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1266 -0
- data/README.md +1 -1
- data/ext/oj/cache.c +246 -107
- data/ext/oj/cache.h +2 -1
- data/ext/oj/compat.c +1 -2
- data/ext/oj/custom.c +5 -8
- data/ext/oj/debug.c +2 -1
- data/ext/oj/dump.c +1 -4
- data/ext/oj/dump_object.c +2 -2
- data/ext/oj/extconf.rb +1 -0
- data/ext/oj/fast.c +7 -18
- data/ext/oj/intern.c +106 -216
- data/ext/oj/intern.h +0 -1
- data/ext/oj/mimic_json.c +2 -2
- data/ext/oj/object.c +11 -40
- data/ext/oj/oj.c +11 -8
- data/ext/oj/parse.c +1 -1
- data/ext/oj/parser.c +99 -143
- data/ext/oj/rails.c +1 -1
- data/ext/oj/rxclass.c +1 -1
- data/ext/oj/saj.c +1 -1
- data/ext/oj/saj2.c +7 -5
- data/ext/oj/sparse.c +1 -1
- data/ext/oj/stream_writer.c +1 -1
- data/ext/oj/strict.c +1 -2
- data/ext/oj/string_writer.c +2 -2
- data/ext/oj/usual.c +55 -25
- data/ext/oj/validate.c +2 -1
- data/ext/oj/wab.c +6 -3
- data/lib/oj/error.rb +1 -1
- data/lib/oj/state.rb +8 -7
- data/lib/oj/version.rb +1 -1
- data/pages/Options.md +13 -3
- data/pages/Parser.md +3 -3
- data/pages/Rails.md +2 -2
- data/test/benny.rb +50 -0
- data/test/big.rb +15 -0
- data/test/foo.rb +3 -5
- data/test/json_gem/json_common_interface_test.rb +1 -1
- data/test/json_gem/json_generator_test.rb +1 -1
- data/test/mem.rb +33 -0
- data/test/perf_once.rb +58 -0
- data/test/perf_parser.rb +6 -1
- data/test/test_hash.rb +1 -1
- data/test/test_parser_memory.rb +45 -0
- metadata +16 -14
- data/ext/oj/hash_test.c +0 -464
- data/test/bar.rb +0 -35
- data/test/baz.rb +0 -16
- data/test/prec.rb +0 -23
- data/test/zoo.rb +0 -13
data/ext/oj/intern.h
CHANGED
data/ext/oj/mimic_json.c
CHANGED
@@ -682,7 +682,7 @@ static VALUE mimic_set_create_id(VALUE self, VALUE id) {
|
|
682
682
|
*/
|
683
683
|
static VALUE mimic_create_id(VALUE self) {
|
684
684
|
if (NULL != oj_default_options.create_id) {
|
685
|
-
return
|
685
|
+
return rb_utf8_str_new(oj_default_options.create_id, oj_default_options.create_id_len);
|
686
686
|
}
|
687
687
|
return rb_str_new_cstr(oj_json_class);
|
688
688
|
}
|
@@ -714,7 +714,7 @@ static struct _options mimic_object_to_json_options = {0, // indent
|
|
714
714
|
false, // sec_prec_set
|
715
715
|
No, // ignore_under
|
716
716
|
Yes, // cache_keys
|
717
|
-
|
717
|
+
0, // cache_str
|
718
718
|
0, // int_range_min
|
719
719
|
0, // int_range_max
|
720
720
|
oj_json_class, // create_id
|
data/ext/oj/object.c
CHANGED
@@ -30,46 +30,19 @@ inline static long read_long(const char *str, size_t len) {
|
|
30
30
|
|
31
31
|
static VALUE calc_hash_key(ParseInfo pi, Val kval, char k1) {
|
32
32
|
volatile VALUE rkey;
|
33
|
-
#if 0
|
34
|
-
VALUE *slot;
|
35
33
|
|
36
34
|
if (':' == k1) {
|
37
|
-
|
38
|
-
rkey = rb_str_new(kval->key + 1, kval->klen - 1);
|
39
|
-
rkey = oj_encode(rkey);
|
40
|
-
rkey = rb_str_intern(rkey);
|
41
|
-
*slot = rkey;
|
42
|
-
rb_gc_register_address(slot);
|
43
|
-
}
|
44
|
-
} else if (Yes == pi->options.sym_key) {
|
45
|
-
if (Qnil == (rkey = oj_sym_hash_get(kval->key, kval->klen, &slot))) {
|
46
|
-
rkey = rb_str_new(kval->key, kval->klen);
|
47
|
-
rkey = oj_encode(rkey);
|
48
|
-
rkey = rb_str_intern(rkey);
|
49
|
-
*slot = rkey;
|
50
|
-
rb_gc_register_address(slot);
|
51
|
-
}
|
52
|
-
} else {
|
53
|
-
if (Qnil == (rkey = oj_str_hash_get(kval->key, kval->klen, &slot))) {
|
54
|
-
rkey = rb_str_new(kval->key, kval->klen);
|
55
|
-
rkey = oj_encode(rkey);
|
56
|
-
*slot = rkey;
|
57
|
-
rb_gc_register_address(slot);
|
58
|
-
}
|
35
|
+
return ID2SYM(rb_intern3(kval->key + 1, kval->klen - 1, oj_utf8_encoding));
|
59
36
|
}
|
60
|
-
|
61
|
-
|
62
|
-
rkey = ID2SYM(rb_intern3(kval->key + 1, kval->klen - 1, oj_utf8_encoding));
|
63
|
-
} else {
|
64
|
-
if (Yes == pi->options.sym_key) {
|
65
|
-
rkey = ID2SYM(rb_intern3(kval->key, kval->klen, oj_utf8_encoding));
|
66
|
-
} else {
|
67
|
-
rkey = rb_str_new(kval->key, kval->klen);
|
68
|
-
rkey = oj_encode(rkey);
|
69
|
-
}
|
37
|
+
if (Yes == pi->options.sym_key) {
|
38
|
+
return ID2SYM(rb_intern3(kval->key, kval->klen, oj_utf8_encoding));
|
70
39
|
}
|
71
|
-
#
|
40
|
+
#if HAVE_RB_ENC_INTERNED_STR
|
41
|
+
rkey = rb_enc_interned_str(kval->key, kval->klen, oj_utf8_encoding);
|
42
|
+
#else
|
43
|
+
rkey = rb_utf8_str_new(kval->key, kval->klen);
|
72
44
|
OBJ_FREEZE(rkey);
|
45
|
+
#endif
|
73
46
|
return rkey;
|
74
47
|
}
|
75
48
|
|
@@ -87,8 +60,7 @@ static VALUE str_to_value(ParseInfo pi, const char *str, size_t len, const char
|
|
87
60
|
}
|
88
61
|
rstr = oj_circ_array_get(pi->circ_array, i);
|
89
62
|
} else {
|
90
|
-
|
91
|
-
rstr = oj_encode(rstr);
|
63
|
+
rstr = rb_utf8_str_new(str, len);
|
92
64
|
}
|
93
65
|
return rstr;
|
94
66
|
}
|
@@ -259,8 +231,7 @@ static int hat_cstr(ParseInfo pi, Val parent, Val kval, const char *str, size_t
|
|
259
231
|
parent->val = ID2SYM(rb_intern3(str + 1, len - 1, oj_utf8_encoding));
|
260
232
|
break;
|
261
233
|
case 's':
|
262
|
-
|
263
|
-
parent->val = oj_encode(parent->val);
|
234
|
+
parent->val = rb_utf8_str_new(str, len);
|
264
235
|
break;
|
265
236
|
case 'c': // class
|
266
237
|
{
|
@@ -301,7 +272,7 @@ static int hat_num(ParseInfo pi, Val parent, Val kval, NumInfo ni) {
|
|
301
272
|
}
|
302
273
|
if (86400 == ni->exp) { // UTC time
|
303
274
|
parent->val = rb_time_nano_new(ni->i, (long)nsec);
|
304
|
-
// Since the ruby C routines
|
275
|
+
// Since the ruby C routines always create local time, the
|
305
276
|
// offset and then a conversion to UTC keeps makes the time
|
306
277
|
// match the expected value.
|
307
278
|
parent->val = rb_funcall2(parent->val, oj_utc_id, 0, 0);
|
data/ext/oj/oj.c
CHANGED
@@ -107,6 +107,7 @@ static VALUE bigdecimal_load_sym;
|
|
107
107
|
static VALUE bigdecimal_sym;
|
108
108
|
static VALUE cache_keys_sym;
|
109
109
|
static VALUE cache_str_sym;
|
110
|
+
static VALUE cache_string_sym;
|
110
111
|
static VALUE circular_sym;
|
111
112
|
static VALUE class_cache_sym;
|
112
113
|
static VALUE compat_bigdecimal_sym;
|
@@ -190,7 +191,7 @@ struct _options oj_default_options = {
|
|
190
191
|
false, // sec_prec_set
|
191
192
|
No, // ignore_under
|
192
193
|
Yes, // cache_keys
|
193
|
-
|
194
|
+
0, // cache_str
|
194
195
|
0, // int_range_min
|
195
196
|
0, // int_range_max
|
196
197
|
oj_json_class, // create_id
|
@@ -287,8 +288,8 @@ struct _options oj_default_options = {
|
|
287
288
|
* - *:ignore* [_nil_|_Array_] either nil or an Array of classes to ignore when dumping
|
288
289
|
* - *:ignore_under* [_Boolean_] if true then attributes that start with _ are ignored when dumping in
|
289
290
|
*object or custom mode.
|
290
|
-
* - *:cache_keys* [_Boolean_] if true then hash keys are cached
|
291
|
-
* - *:cache_str* [_Fixnum_] maximum string value length to cache
|
291
|
+
* - *:cache_keys* [_Boolean_] if true then hash keys are cached if less than 35 bytes.
|
292
|
+
* - *:cache_str* [_Fixnum_] maximum string value length to cache (strings less than this are cached)
|
292
293
|
* - *:integer_range* [_Range_] Dump integers outside range as strings.
|
293
294
|
* - *:trace* [_true,_|_false_] Trace all load and dump calls, default is false (trace is off)
|
294
295
|
* - *:safe* [_true,_|_false_] Safe mimic breaks JSON mimic to be safer, default is false (safe is
|
@@ -509,7 +510,7 @@ static VALUE get_def_opts(VALUE self) {
|
|
509
510
|
* Sets the default options for load and dump.
|
510
511
|
* - *opts* [_Hash_] options to change
|
511
512
|
* - *:indent* [_Fixnum_|_String_|_nil_] number of spaces to indent each element in a JSON
|
512
|
-
*document or the String to use for
|
513
|
+
*document or the String to use for indentation.
|
513
514
|
* - :circular [_Boolean_|_nil_] support circular references while dumping.
|
514
515
|
* - *:auto_define* [_Boolean_|_nil_] automatically define classes if they do not exist.
|
515
516
|
* - *:symbol_keys* [_Boolean_|_nil_] convert hash keys to symbols.
|
@@ -571,7 +572,7 @@ static VALUE get_def_opts(VALUE self) {
|
|
571
572
|
* - *:ignore_under* [_Boolean_] if true then attributes that start with _ are ignored when
|
572
573
|
*dumping in object or custom mode.
|
573
574
|
* - *:cache_keys* [_Boolean_] if true then hash keys are cached
|
574
|
-
* - *:cache_str* [_Fixnum_] maximum string
|
575
|
+
* - *:cache_str* [_Fixnum_] maximum string value length to cache (strings less than this are cached)
|
575
576
|
* - *:integer_range* [_Range_] Dump integers outside range as strings.
|
576
577
|
* - *:trace* [_Boolean_] turn trace on or off.
|
577
578
|
* - *:safe* [_Boolean_] turn safe mimic on or off.
|
@@ -692,7 +693,7 @@ static int parse_options_cb(VALUE k, VALUE v, VALUE opts)
|
|
692
693
|
sprintf(copts->float_fmt, "%%0.%dg", n);
|
693
694
|
copts->float_prec = n;
|
694
695
|
}
|
695
|
-
} else if (cache_str_sym == k) {
|
696
|
+
} else if (cache_str_sym == k || cache_string_sym == k) {
|
696
697
|
int n;
|
697
698
|
|
698
699
|
#ifdef RUBY_INTEGER_UNIFICATION
|
@@ -1398,7 +1399,7 @@ static VALUE to_json(int argc, VALUE *argv, VALUE self) {
|
|
1398
1399
|
* Dumps an Object to the specified file.
|
1399
1400
|
* - *file* [_String_] _path file path to write the JSON document to
|
1400
1401
|
* - *obj* [_Object_] Object to serialize as an JSON document String
|
1401
|
-
* - *options* [_Hash_]
|
1402
|
+
* - *options* [_Hash_] formatting options
|
1402
1403
|
* - *:indent* [_Fixnum_] format expected
|
1403
1404
|
* - *:circular* [_Boolean_] allow circular references, default: false
|
1404
1405
|
*/
|
@@ -1420,7 +1421,7 @@ static VALUE to_file(int argc, VALUE *argv, VALUE self) {
|
|
1420
1421
|
* Dumps an Object to the specified IO stream.
|
1421
1422
|
* - *io* [_IO_] IO stream to write the JSON document to
|
1422
1423
|
* - *obj* [_Object_] Object to serialize as an JSON document String
|
1423
|
-
* - *options* [_Hash_]
|
1424
|
+
* - *options* [_Hash_] formatting options
|
1424
1425
|
* - *:indent* [_Fixnum_] format expected
|
1425
1426
|
* - *:circular* [_Boolean_] allow circular references, default: false
|
1426
1427
|
*/
|
@@ -1920,6 +1921,8 @@ void Init_oj() {
|
|
1920
1921
|
rb_gc_register_address(&cache_keys_sym);
|
1921
1922
|
cache_str_sym = ID2SYM(rb_intern("cache_str"));
|
1922
1923
|
rb_gc_register_address(&cache_str_sym);
|
1924
|
+
cache_string_sym = ID2SYM(rb_intern("cache_string"));
|
1925
|
+
rb_gc_register_address(&cache_string_sym);
|
1923
1926
|
circular_sym = ID2SYM(rb_intern("circular"));
|
1924
1927
|
rb_gc_register_address(&circular_sym);
|
1925
1928
|
class_cache_sym = ID2SYM(rb_intern("class_cache"));
|
data/ext/oj/parse.c
CHANGED
@@ -489,7 +489,7 @@ static void read_num(ParseInfo pi) {
|
|
489
489
|
if ('.' == *pi->cur) {
|
490
490
|
pi->cur++;
|
491
491
|
// A trailing . is not a valid decimal but if encountered allow it
|
492
|
-
// except when
|
492
|
+
// except when mimicking the JSON gem or in strict mode.
|
493
493
|
if (StrictMode == pi->options.mode || CompatMode == pi->options.mode) {
|
494
494
|
int pos = (int)(pi->cur - ni.str);
|
495
495
|
|
data/ext/oj/parser.c
CHANGED
@@ -2,22 +2,7 @@
|
|
2
2
|
|
3
3
|
#include "parser.h"
|
4
4
|
|
5
|
-
#include <errno.h>
|
6
5
|
#include <fcntl.h>
|
7
|
-
#include <limits.h>
|
8
|
-
#include <math.h>
|
9
|
-
#include <pthread.h>
|
10
|
-
#include <signal.h>
|
11
|
-
#include <stdarg.h>
|
12
|
-
#include <stdbool.h>
|
13
|
-
#include <stdint.h>
|
14
|
-
#include <stdio.h>
|
15
|
-
#include <stdlib.h>
|
16
|
-
#include <string.h>
|
17
|
-
#include <sys/stat.h>
|
18
|
-
#include <sys/time.h>
|
19
|
-
#include <time.h>
|
20
|
-
#include <unistd.h>
|
21
6
|
|
22
7
|
#include "oj.h"
|
23
8
|
|
@@ -400,87 +385,44 @@ static const byte hex_map[256] = "\
|
|
400
385
|
................................\
|
401
386
|
................................";
|
402
387
|
|
403
|
-
static long double pow_map[401] = {
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
1.0e190L, 1.0e191L, 1.0e192L, 1.0e193L, 1.0e194L,
|
442
|
-
1.0e195L, 1.0e196L, 1.0e197L, 1.0e198L, 1.0e199L, // 190
|
443
|
-
1.0e200L, 1.0e201L, 1.0e202L, 1.0e203L, 1.0e204L,
|
444
|
-
1.0e205L, 1.0e206L, 1.0e207L, 1.0e208L, 1.0e209L, // 200
|
445
|
-
1.0e210L, 1.0e211L, 1.0e212L, 1.0e213L, 1.0e214L,
|
446
|
-
1.0e215L, 1.0e216L, 1.0e217L, 1.0e218L, 1.0e219L, // 210
|
447
|
-
1.0e220L, 1.0e221L, 1.0e222L, 1.0e223L, 1.0e224L,
|
448
|
-
1.0e225L, 1.0e226L, 1.0e227L, 1.0e228L, 1.0e229L, // 220
|
449
|
-
1.0e230L, 1.0e231L, 1.0e232L, 1.0e233L, 1.0e234L,
|
450
|
-
1.0e235L, 1.0e236L, 1.0e237L, 1.0e238L, 1.0e239L, // 230
|
451
|
-
1.0e240L, 1.0e241L, 1.0e242L, 1.0e243L, 1.0e244L,
|
452
|
-
1.0e245L, 1.0e246L, 1.0e247L, 1.0e248L, 1.0e249L, // 240
|
453
|
-
1.0e250L, 1.0e251L, 1.0e252L, 1.0e253L, 1.0e254L,
|
454
|
-
1.0e255L, 1.0e256L, 1.0e257L, 1.0e258L, 1.0e259L, // 250
|
455
|
-
1.0e260L, 1.0e261L, 1.0e262L, 1.0e263L, 1.0e264L,
|
456
|
-
1.0e265L, 1.0e266L, 1.0e267L, 1.0e268L, 1.0e269L, // 260
|
457
|
-
1.0e270L, 1.0e271L, 1.0e272L, 1.0e273L, 1.0e274L,
|
458
|
-
1.0e275L, 1.0e276L, 1.0e277L, 1.0e278L, 1.0e279L, // 270
|
459
|
-
1.0e280L, 1.0e281L, 1.0e282L, 1.0e283L, 1.0e284L,
|
460
|
-
1.0e285L, 1.0e286L, 1.0e287L, 1.0e288L, 1.0e289L, // 280
|
461
|
-
1.0e290L, 1.0e291L, 1.0e292L, 1.0e293L, 1.0e294L,
|
462
|
-
1.0e295L, 1.0e296L, 1.0e297L, 1.0e298L, 1.0e299L, // 290
|
463
|
-
1.0e300L, 1.0e301L, 1.0e302L, 1.0e303L, 1.0e304L,
|
464
|
-
1.0e305L, 1.0e306L, 1.0e307L, 1.0e308L, 1.0e309L, // 300
|
465
|
-
1.0e310L, 1.0e311L, 1.0e312L, 1.0e313L, 1.0e314L,
|
466
|
-
1.0e315L, 1.0e316L, 1.0e317L, 1.0e318L, 1.0e319L, // 310
|
467
|
-
1.0e320L, 1.0e321L, 1.0e322L, 1.0e323L, 1.0e324L,
|
468
|
-
1.0e325L, 1.0e326L, 1.0e327L, 1.0e328L, 1.0e329L, // 320
|
469
|
-
1.0e330L, 1.0e331L, 1.0e332L, 1.0e333L, 1.0e334L,
|
470
|
-
1.0e335L, 1.0e336L, 1.0e337L, 1.0e338L, 1.0e339L, // 330
|
471
|
-
1.0e340L, 1.0e341L, 1.0e342L, 1.0e343L, 1.0e344L,
|
472
|
-
1.0e345L, 1.0e346L, 1.0e347L, 1.0e348L, 1.0e349L, // 340
|
473
|
-
1.0e350L, 1.0e351L, 1.0e352L, 1.0e353L, 1.0e354L,
|
474
|
-
1.0e355L, 1.0e356L, 1.0e357L, 1.0e358L, 1.0e359L, // 350
|
475
|
-
1.0e360L, 1.0e361L, 1.0e362L, 1.0e363L, 1.0e364L,
|
476
|
-
1.0e365L, 1.0e366L, 1.0e367L, 1.0e368L, 1.0e369L, // 360
|
477
|
-
1.0e370L, 1.0e371L, 1.0e372L, 1.0e373L, 1.0e374L,
|
478
|
-
1.0e375L, 1.0e376L, 1.0e377L, 1.0e378L, 1.0e379L, // 370
|
479
|
-
1.0e380L, 1.0e381L, 1.0e382L, 1.0e383L, 1.0e384L,
|
480
|
-
1.0e385L, 1.0e386L, 1.0e387L, 1.0e388L, 1.0e389L, // 380
|
481
|
-
1.0e390L, 1.0e391L, 1.0e392L, 1.0e393L, 1.0e394L,
|
482
|
-
1.0e395L, 1.0e396L, 1.0e397L, 1.0e398L, 1.0e399L, // 390
|
483
|
-
1.0e400L};
|
388
|
+
static long double pow_map[401] = {
|
389
|
+
1.0L, 1.0e1L, 1.0e2L, 1.0e3L, 1.0e4L, 1.0e5L, 1.0e6L, 1.0e7L, 1.0e8L, 1.0e9L, 1.0e10L,
|
390
|
+
1.0e11L, 1.0e12L, 1.0e13L, 1.0e14L, 1.0e15L, 1.0e16L, 1.0e17L, 1.0e18L, 1.0e19L, 1.0e20L, 1.0e21L,
|
391
|
+
1.0e22L, 1.0e23L, 1.0e24L, 1.0e25L, 1.0e26L, 1.0e27L, 1.0e28L, 1.0e29L, 1.0e30L, 1.0e31L, 1.0e32L,
|
392
|
+
1.0e33L, 1.0e34L, 1.0e35L, 1.0e36L, 1.0e37L, 1.0e38L, 1.0e39L, 1.0e40L, 1.0e41L, 1.0e42L, 1.0e43L,
|
393
|
+
1.0e44L, 1.0e45L, 1.0e46L, 1.0e47L, 1.0e48L, 1.0e49L, 1.0e50L, 1.0e51L, 1.0e52L, 1.0e53L, 1.0e54L,
|
394
|
+
1.0e55L, 1.0e56L, 1.0e57L, 1.0e58L, 1.0e59L, 1.0e60L, 1.0e61L, 1.0e62L, 1.0e63L, 1.0e64L, 1.0e65L,
|
395
|
+
1.0e66L, 1.0e67L, 1.0e68L, 1.0e69L, 1.0e70L, 1.0e71L, 1.0e72L, 1.0e73L, 1.0e74L, 1.0e75L, 1.0e76L,
|
396
|
+
1.0e77L, 1.0e78L, 1.0e79L, 1.0e80L, 1.0e81L, 1.0e82L, 1.0e83L, 1.0e84L, 1.0e85L, 1.0e86L, 1.0e87L,
|
397
|
+
1.0e88L, 1.0e89L, 1.0e90L, 1.0e91L, 1.0e92L, 1.0e93L, 1.0e94L, 1.0e95L, 1.0e96L, 1.0e97L, 1.0e98L,
|
398
|
+
1.0e99L, 1.0e100L, 1.0e101L, 1.0e102L, 1.0e103L, 1.0e104L, 1.0e105L, 1.0e106L, 1.0e107L, 1.0e108L, 1.0e109L,
|
399
|
+
1.0e110L, 1.0e111L, 1.0e112L, 1.0e113L, 1.0e114L, 1.0e115L, 1.0e116L, 1.0e117L, 1.0e118L, 1.0e119L, 1.0e120L,
|
400
|
+
1.0e121L, 1.0e122L, 1.0e123L, 1.0e124L, 1.0e125L, 1.0e126L, 1.0e127L, 1.0e128L, 1.0e129L, 1.0e130L, 1.0e131L,
|
401
|
+
1.0e132L, 1.0e133L, 1.0e134L, 1.0e135L, 1.0e136L, 1.0e137L, 1.0e138L, 1.0e139L, 1.0e140L, 1.0e141L, 1.0e142L,
|
402
|
+
1.0e143L, 1.0e144L, 1.0e145L, 1.0e146L, 1.0e147L, 1.0e148L, 1.0e149L, 1.0e150L, 1.0e151L, 1.0e152L, 1.0e153L,
|
403
|
+
1.0e154L, 1.0e155L, 1.0e156L, 1.0e157L, 1.0e158L, 1.0e159L, 1.0e160L, 1.0e161L, 1.0e162L, 1.0e163L, 1.0e164L,
|
404
|
+
1.0e165L, 1.0e166L, 1.0e167L, 1.0e168L, 1.0e169L, 1.0e170L, 1.0e171L, 1.0e172L, 1.0e173L, 1.0e174L, 1.0e175L,
|
405
|
+
1.0e176L, 1.0e177L, 1.0e178L, 1.0e179L, 1.0e180L, 1.0e181L, 1.0e182L, 1.0e183L, 1.0e184L, 1.0e185L, 1.0e186L,
|
406
|
+
1.0e187L, 1.0e188L, 1.0e189L, 1.0e190L, 1.0e191L, 1.0e192L, 1.0e193L, 1.0e194L, 1.0e195L, 1.0e196L, 1.0e197L,
|
407
|
+
1.0e198L, 1.0e199L, 1.0e200L, 1.0e201L, 1.0e202L, 1.0e203L, 1.0e204L, 1.0e205L, 1.0e206L, 1.0e207L, 1.0e208L,
|
408
|
+
1.0e209L, 1.0e210L, 1.0e211L, 1.0e212L, 1.0e213L, 1.0e214L, 1.0e215L, 1.0e216L, 1.0e217L, 1.0e218L, 1.0e219L,
|
409
|
+
1.0e220L, 1.0e221L, 1.0e222L, 1.0e223L, 1.0e224L, 1.0e225L, 1.0e226L, 1.0e227L, 1.0e228L, 1.0e229L, 1.0e230L,
|
410
|
+
1.0e231L, 1.0e232L, 1.0e233L, 1.0e234L, 1.0e235L, 1.0e236L, 1.0e237L, 1.0e238L, 1.0e239L, 1.0e240L, 1.0e241L,
|
411
|
+
1.0e242L, 1.0e243L, 1.0e244L, 1.0e245L, 1.0e246L, 1.0e247L, 1.0e248L, 1.0e249L, 1.0e250L, 1.0e251L, 1.0e252L,
|
412
|
+
1.0e253L, 1.0e254L, 1.0e255L, 1.0e256L, 1.0e257L, 1.0e258L, 1.0e259L, 1.0e260L, 1.0e261L, 1.0e262L, 1.0e263L,
|
413
|
+
1.0e264L, 1.0e265L, 1.0e266L, 1.0e267L, 1.0e268L, 1.0e269L, 1.0e270L, 1.0e271L, 1.0e272L, 1.0e273L, 1.0e274L,
|
414
|
+
1.0e275L, 1.0e276L, 1.0e277L, 1.0e278L, 1.0e279L, 1.0e280L, 1.0e281L, 1.0e282L, 1.0e283L, 1.0e284L, 1.0e285L,
|
415
|
+
1.0e286L, 1.0e287L, 1.0e288L, 1.0e289L, 1.0e290L, 1.0e291L, 1.0e292L, 1.0e293L, 1.0e294L, 1.0e295L, 1.0e296L,
|
416
|
+
1.0e297L, 1.0e298L, 1.0e299L, 1.0e300L, 1.0e301L, 1.0e302L, 1.0e303L, 1.0e304L, 1.0e305L, 1.0e306L, 1.0e307L,
|
417
|
+
1.0e308L, 1.0e309L, 1.0e310L, 1.0e311L, 1.0e312L, 1.0e313L, 1.0e314L, 1.0e315L, 1.0e316L, 1.0e317L, 1.0e318L,
|
418
|
+
1.0e319L, 1.0e320L, 1.0e321L, 1.0e322L, 1.0e323L, 1.0e324L, 1.0e325L, 1.0e326L, 1.0e327L, 1.0e328L, 1.0e329L,
|
419
|
+
1.0e330L, 1.0e331L, 1.0e332L, 1.0e333L, 1.0e334L, 1.0e335L, 1.0e336L, 1.0e337L, 1.0e338L, 1.0e339L, 1.0e340L,
|
420
|
+
1.0e341L, 1.0e342L, 1.0e343L, 1.0e344L, 1.0e345L, 1.0e346L, 1.0e347L, 1.0e348L, 1.0e349L, 1.0e350L, 1.0e351L,
|
421
|
+
1.0e352L, 1.0e353L, 1.0e354L, 1.0e355L, 1.0e356L, 1.0e357L, 1.0e358L, 1.0e359L, 1.0e360L, 1.0e361L, 1.0e362L,
|
422
|
+
1.0e363L, 1.0e364L, 1.0e365L, 1.0e366L, 1.0e367L, 1.0e368L, 1.0e369L, 1.0e370L, 1.0e371L, 1.0e372L, 1.0e373L,
|
423
|
+
1.0e374L, 1.0e375L, 1.0e376L, 1.0e377L, 1.0e378L, 1.0e379L, 1.0e380L, 1.0e381L, 1.0e382L, 1.0e383L, 1.0e384L,
|
424
|
+
1.0e385L, 1.0e386L, 1.0e387L, 1.0e388L, 1.0e389L, 1.0e390L, 1.0e391L, 1.0e392L, 1.0e393L, 1.0e394L, 1.0e395L,
|
425
|
+
1.0e396L, 1.0e397L, 1.0e398L, 1.0e399L, 1.0e400L};
|
484
426
|
|
485
427
|
static VALUE parser_class;
|
486
428
|
|
@@ -607,7 +549,7 @@ static void big_change(ojParser p) {
|
|
607
549
|
int len = 0;
|
608
550
|
|
609
551
|
buf[sizeof(buf) - 1] = '\0';
|
610
|
-
p->buf.tail
|
552
|
+
p->buf.tail = p->buf.head;
|
611
553
|
switch (p->type) {
|
612
554
|
case OJ_INT:
|
613
555
|
// If an int then it will fit in the num.raw so no need to check length;
|
@@ -638,14 +580,14 @@ static void big_change(ojParser p) {
|
|
638
580
|
buf_append_string(&p->buf, buf + len + 1, sizeof(buf) - len - 1);
|
639
581
|
if (0 < p->num.exp) {
|
640
582
|
int x = p->num.exp;
|
641
|
-
int d;
|
583
|
+
int d, div;
|
642
584
|
bool started = false;
|
643
585
|
|
644
586
|
buf_append(&p->buf, 'e');
|
645
587
|
if (0 < p->num.exp_neg) {
|
646
588
|
buf_append(&p->buf, '-');
|
647
589
|
}
|
648
|
-
for (
|
590
|
+
for (div = 1000; 0 < div; div /= 10) {
|
649
591
|
d = x / div % 10;
|
650
592
|
if (started || 0 < d) {
|
651
593
|
buf_append(&p->buf, '0' + d);
|
@@ -662,6 +604,7 @@ static void big_change(ojParser p) {
|
|
662
604
|
static void parse(ojParser p, const byte *json) {
|
663
605
|
const byte *start;
|
664
606
|
const byte *b = json;
|
607
|
+
int i;
|
665
608
|
|
666
609
|
#if DEBUG
|
667
610
|
printf("*** parse - mode: %c %s\n", p->map[256], (const char *)json);
|
@@ -905,7 +848,7 @@ static void parse(ojParser p, const byte *json) {
|
|
905
848
|
}
|
906
849
|
buf_append_string(&p->buf, (const char *)start, b - start);
|
907
850
|
b--;
|
908
|
-
|
851
|
+
break;
|
909
852
|
case BIG_E:
|
910
853
|
buf_append(&p->buf, *b);
|
911
854
|
p->map = big_exp_sign_map;
|
@@ -1031,7 +974,7 @@ static void parse(ojParser p, const byte *json) {
|
|
1031
974
|
}
|
1032
975
|
p->ri = 0;
|
1033
976
|
*p->token = *b++;
|
1034
|
-
for (
|
977
|
+
for (i = 1; i < 4; i++) {
|
1035
978
|
if ('\0' == *b) {
|
1036
979
|
p->ri = i;
|
1037
980
|
break;
|
@@ -1056,7 +999,7 @@ static void parse(ojParser p, const byte *json) {
|
|
1056
999
|
}
|
1057
1000
|
p->ri = 0;
|
1058
1001
|
*p->token = *b++;
|
1059
|
-
for (
|
1002
|
+
for (i = 1; i < 4; i++) {
|
1060
1003
|
if ('\0' == *b) {
|
1061
1004
|
p->ri = i;
|
1062
1005
|
break;
|
@@ -1081,7 +1024,7 @@ static void parse(ojParser p, const byte *json) {
|
|
1081
1024
|
}
|
1082
1025
|
p->ri = 0;
|
1083
1026
|
*p->token = *b++;
|
1084
|
-
for (
|
1027
|
+
for (i = 1; i < 5; i++) {
|
1085
1028
|
if ('\0' == *b) {
|
1086
1029
|
p->ri = i;
|
1087
1030
|
break;
|
@@ -1217,11 +1160,10 @@ static VALUE parser_new(VALUE self, VALUE mode) {
|
|
1217
1160
|
|
1218
1161
|
switch (rb_type(mode)) {
|
1219
1162
|
case RUBY_T_SYMBOL:
|
1220
|
-
mode =
|
1163
|
+
mode = rb_sym2str(mode);
|
1221
1164
|
// fall through
|
1222
1165
|
case RUBY_T_STRING: ms = RSTRING_PTR(mode); break;
|
1223
|
-
default:
|
1224
|
-
rb_raise(rb_eArgError, "mode must be :validate, :usual, :saj, or :object");
|
1166
|
+
default: rb_raise(rb_eArgError, "mode must be :validate, :usual, :saj, or :object");
|
1225
1167
|
}
|
1226
1168
|
if (0 == strcmp("usual", ms) || 0 == strcmp("standard", ms) || 0 == strcmp("strict", ms) ||
|
1227
1169
|
0 == strcmp("compat", ms)) {
|
@@ -1253,7 +1195,8 @@ static VALUE parser_new(VALUE self, VALUE mode) {
|
|
1253
1195
|
* - *:saj*
|
1254
1196
|
* - _cache_keys=_ sets the value of the _cache_keys_ flag.
|
1255
1197
|
* - _cache_keys_ returns the value of the _cache_keys_ flag.
|
1256
|
-
* - _cache_strings=_ sets the value of the _cache_strings_ to an positive integer less than 35. Strings shorter than
|
1198
|
+
* - _cache_strings=_ sets the value of the _cache_strings_ to an positive integer less than 35. Strings shorter than
|
1199
|
+
* that length are cached.
|
1257
1200
|
* - _cache_strings_ returns the value of the _cache_strings_ integer value.
|
1258
1201
|
* - _handler=_ sets the SAJ handler
|
1259
1202
|
* - _handler_ returns the SAJ handler
|
@@ -1261,19 +1204,32 @@ static VALUE parser_new(VALUE self, VALUE mode) {
|
|
1261
1204
|
* - *:usual*
|
1262
1205
|
* - _cache_keys=_ sets the value of the _cache_keys_ flag.
|
1263
1206
|
* - _cache_keys_ returns the value of the _cache_keys_ flag.
|
1264
|
-
* - _cache_strings=_ sets the value of the _cache_strings_ to an positive integer less than 35. Strings shorter than
|
1207
|
+
* - _cache_strings=_ sets the value of the _cache_strings_ to an positive integer less than 35. Strings shorter than
|
1208
|
+
* that length are cached.
|
1265
1209
|
* - _cache_strings_ returns the value of the _cache_strings_ integer value.
|
1266
|
-
* -
|
1210
|
+
* - _cache_expunge=_ sets the value of the _cache_expunge_ where 0 never expunges, 1 expunges slowly, 2 expunges
|
1211
|
+
* faster, and 3 or higher expunges agressively.
|
1212
|
+
* - _cache_expunge_ returns the value of the _cache_expunge_ integer value.
|
1213
|
+
* - _capacity=_ sets the capacity of the parser. The parser grows automatically but can be updated directly with this
|
1214
|
+
* call.
|
1267
1215
|
* - _capacity_ returns the current capacity of the parser's internal stack.
|
1268
1216
|
* - _create_id_ returns the value _create_id_ or _nil_ if there is no _create_id_.
|
1269
|
-
* - _create_id=_ sets the value _create_id_ or if _nil_ unsets it. Parsed JSON objects that include the specified
|
1270
|
-
*
|
1271
|
-
* -
|
1217
|
+
* - _create_id=_ sets the value _create_id_ or if _nil_ unsets it. Parsed JSON objects that include the specified
|
1218
|
+
* element use the element value as the name of the class to create an object from instead of a Hash.
|
1219
|
+
* - _decimal=_ sets the approach to how decimals are parser. If _:auto_ then the decimals with significant digits are
|
1220
|
+
* 16 or less are Floats and long ones are BigDecimal. _:ruby_ uses a call to Ruby to convert a string to a Float.
|
1221
|
+
* _:float_ always generates a Float. _:bigdecimal_ always results in a BigDecimal.
|
1222
|
+
* - _decimal_ returns the value of the decimal conversion option which can be :auto (default), :ruby, :float, or
|
1223
|
+
* :bigdecimal.
|
1272
1224
|
* - _ignore_json_create_ returns the value of the _ignore_json_create_ flag.
|
1273
|
-
* - _ignore_json_create=_ sets the value of the _ignore_json_create_ flag. When set the class json_create method is
|
1225
|
+
* - _ignore_json_create=_ sets the value of the _ignore_json_create_ flag. When set the class json_create method is
|
1226
|
+
* ignored on parsing in favor of creating an instance and populating directly.
|
1274
1227
|
* - _missing_class_ return the value of the _missing_class_ indicator.
|
1275
|
-
* - _missing_class=_ sets the value of the _missing_class_ flag. Valid values are _:auto_ which creates any missing
|
1276
|
-
*
|
1228
|
+
* - _missing_class=_ sets the value of the _missing_class_ flag. Valid values are _:auto_ which creates any missing
|
1229
|
+
* classes on parse, :ignore which ignores and continues as a Hash (default), and :raise which raises an exception if
|
1230
|
+
* the class is not found.
|
1231
|
+
* - _omit_null=_ sets the _omit_null_ flag. If true then null values in a map or object are omitted from the
|
1232
|
+
* resulting Hash or Object.
|
1277
1233
|
* - _omit_null_ returns the value of the _omit_null_ flag.
|
1278
1234
|
* - _symbol_keys=_ sets the flag that indicates Hash keys should be parsed to Symbols versus Strings.
|
1279
1235
|
* - _symbol_keys_ returns the value of the _symbol_keys_ flag.
|
@@ -1290,7 +1246,7 @@ static VALUE parser_missing(int argc, VALUE *argv, VALUE self) {
|
|
1290
1246
|
#endif
|
1291
1247
|
switch (rb_type(rkey)) {
|
1292
1248
|
case RUBY_T_SYMBOL:
|
1293
|
-
rkey =
|
1249
|
+
rkey = rb_sym2str(rkey);
|
1294
1250
|
// fall through
|
1295
1251
|
case RUBY_T_STRING: key = rb_string_value_ptr(&rkey); break;
|
1296
1252
|
default: rb_raise(rb_eArgError, "option method must be a symbol or string");
|
@@ -1442,15 +1398,15 @@ static VALUE usual_parser = Qundef;
|
|
1442
1398
|
*/
|
1443
1399
|
static VALUE parser_usual(VALUE self) {
|
1444
1400
|
if (Qundef == usual_parser) {
|
1445
|
-
|
1446
|
-
|
1447
|
-
|
1448
|
-
|
1449
|
-
|
1450
|
-
|
1451
|
-
|
1452
|
-
|
1453
|
-
|
1401
|
+
ojParser p = ALLOC(struct _ojParser);
|
1402
|
+
|
1403
|
+
memset(p, 0, sizeof(struct _ojParser));
|
1404
|
+
buf_init(&p->key);
|
1405
|
+
buf_init(&p->buf);
|
1406
|
+
p->map = value_map;
|
1407
|
+
oj_set_parser_usual(p);
|
1408
|
+
usual_parser = Data_Wrap_Struct(parser_class, parser_mark, parser_free, p);
|
1409
|
+
rb_gc_register_address(&usual_parser);
|
1454
1410
|
}
|
1455
1411
|
return usual_parser;
|
1456
1412
|
}
|
@@ -1465,15 +1421,15 @@ static VALUE saj_parser = Qundef;
|
|
1465
1421
|
*/
|
1466
1422
|
static VALUE parser_saj(VALUE self) {
|
1467
1423
|
if (Qundef == saj_parser) {
|
1468
|
-
|
1469
|
-
|
1470
|
-
|
1471
|
-
|
1472
|
-
|
1473
|
-
|
1474
|
-
|
1475
|
-
|
1476
|
-
|
1424
|
+
ojParser p = ALLOC(struct _ojParser);
|
1425
|
+
|
1426
|
+
memset(p, 0, sizeof(struct _ojParser));
|
1427
|
+
buf_init(&p->key);
|
1428
|
+
buf_init(&p->buf);
|
1429
|
+
p->map = value_map;
|
1430
|
+
oj_set_parser_saj(p);
|
1431
|
+
saj_parser = Data_Wrap_Struct(parser_class, parser_mark, parser_free, p);
|
1432
|
+
rb_gc_register_address(&saj_parser);
|
1477
1433
|
}
|
1478
1434
|
return saj_parser;
|
1479
1435
|
}
|
@@ -1487,15 +1443,15 @@ static VALUE validate_parser = Qundef;
|
|
1487
1443
|
*/
|
1488
1444
|
static VALUE parser_validate(VALUE self) {
|
1489
1445
|
if (Qundef == validate_parser) {
|
1490
|
-
|
1491
|
-
|
1492
|
-
|
1493
|
-
|
1494
|
-
|
1495
|
-
|
1496
|
-
|
1497
|
-
|
1498
|
-
|
1446
|
+
ojParser p = ALLOC(struct _ojParser);
|
1447
|
+
|
1448
|
+
memset(p, 0, sizeof(struct _ojParser));
|
1449
|
+
buf_init(&p->key);
|
1450
|
+
buf_init(&p->buf);
|
1451
|
+
p->map = value_map;
|
1452
|
+
oj_set_parser_validator(p);
|
1453
|
+
validate_parser = Data_Wrap_Struct(parser_class, parser_mark, parser_free, p);
|
1454
|
+
rb_gc_register_address(&validate_parser);
|
1499
1455
|
}
|
1500
1456
|
return validate_parser;
|
1501
1457
|
}
|