oj 3.13.1 → 3.13.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1270 -0
- data/README.md +2 -2
- data/RELEASE_NOTES.md +55 -0
- 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/extconf.rb +1 -0
- data/ext/oj/fast.c +1 -1
- 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 -127
- 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 +2 -3
- data/ext/oj/string_writer.c +2 -2
- data/ext/oj/usual.c +53 -23
- 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/foo.rb +8 -8
- 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
- metadata +8 -2
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
@@ -1,8 +1,9 @@
|
|
1
1
|
// Copyright (c) 2020, 2021, Peter Ohler, All rights reserved.
|
2
2
|
|
3
|
+
#include "parser.h"
|
4
|
+
|
3
5
|
#include <fcntl.h>
|
4
6
|
|
5
|
-
#include "parser.h"
|
6
7
|
#include "oj.h"
|
7
8
|
|
8
9
|
#define DEBUG 0
|
@@ -384,87 +385,44 @@ static const byte hex_map[256] = "\
|
|
384
385
|
................................\
|
385
386
|
................................";
|
386
387
|
|
387
|
-
static long double pow_map[401] = {
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
1.0e190L, 1.0e191L, 1.0e192L, 1.0e193L, 1.0e194L,
|
426
|
-
1.0e195L, 1.0e196L, 1.0e197L, 1.0e198L, 1.0e199L, // 190
|
427
|
-
1.0e200L, 1.0e201L, 1.0e202L, 1.0e203L, 1.0e204L,
|
428
|
-
1.0e205L, 1.0e206L, 1.0e207L, 1.0e208L, 1.0e209L, // 200
|
429
|
-
1.0e210L, 1.0e211L, 1.0e212L, 1.0e213L, 1.0e214L,
|
430
|
-
1.0e215L, 1.0e216L, 1.0e217L, 1.0e218L, 1.0e219L, // 210
|
431
|
-
1.0e220L, 1.0e221L, 1.0e222L, 1.0e223L, 1.0e224L,
|
432
|
-
1.0e225L, 1.0e226L, 1.0e227L, 1.0e228L, 1.0e229L, // 220
|
433
|
-
1.0e230L, 1.0e231L, 1.0e232L, 1.0e233L, 1.0e234L,
|
434
|
-
1.0e235L, 1.0e236L, 1.0e237L, 1.0e238L, 1.0e239L, // 230
|
435
|
-
1.0e240L, 1.0e241L, 1.0e242L, 1.0e243L, 1.0e244L,
|
436
|
-
1.0e245L, 1.0e246L, 1.0e247L, 1.0e248L, 1.0e249L, // 240
|
437
|
-
1.0e250L, 1.0e251L, 1.0e252L, 1.0e253L, 1.0e254L,
|
438
|
-
1.0e255L, 1.0e256L, 1.0e257L, 1.0e258L, 1.0e259L, // 250
|
439
|
-
1.0e260L, 1.0e261L, 1.0e262L, 1.0e263L, 1.0e264L,
|
440
|
-
1.0e265L, 1.0e266L, 1.0e267L, 1.0e268L, 1.0e269L, // 260
|
441
|
-
1.0e270L, 1.0e271L, 1.0e272L, 1.0e273L, 1.0e274L,
|
442
|
-
1.0e275L, 1.0e276L, 1.0e277L, 1.0e278L, 1.0e279L, // 270
|
443
|
-
1.0e280L, 1.0e281L, 1.0e282L, 1.0e283L, 1.0e284L,
|
444
|
-
1.0e285L, 1.0e286L, 1.0e287L, 1.0e288L, 1.0e289L, // 280
|
445
|
-
1.0e290L, 1.0e291L, 1.0e292L, 1.0e293L, 1.0e294L,
|
446
|
-
1.0e295L, 1.0e296L, 1.0e297L, 1.0e298L, 1.0e299L, // 290
|
447
|
-
1.0e300L, 1.0e301L, 1.0e302L, 1.0e303L, 1.0e304L,
|
448
|
-
1.0e305L, 1.0e306L, 1.0e307L, 1.0e308L, 1.0e309L, // 300
|
449
|
-
1.0e310L, 1.0e311L, 1.0e312L, 1.0e313L, 1.0e314L,
|
450
|
-
1.0e315L, 1.0e316L, 1.0e317L, 1.0e318L, 1.0e319L, // 310
|
451
|
-
1.0e320L, 1.0e321L, 1.0e322L, 1.0e323L, 1.0e324L,
|
452
|
-
1.0e325L, 1.0e326L, 1.0e327L, 1.0e328L, 1.0e329L, // 320
|
453
|
-
1.0e330L, 1.0e331L, 1.0e332L, 1.0e333L, 1.0e334L,
|
454
|
-
1.0e335L, 1.0e336L, 1.0e337L, 1.0e338L, 1.0e339L, // 330
|
455
|
-
1.0e340L, 1.0e341L, 1.0e342L, 1.0e343L, 1.0e344L,
|
456
|
-
1.0e345L, 1.0e346L, 1.0e347L, 1.0e348L, 1.0e349L, // 340
|
457
|
-
1.0e350L, 1.0e351L, 1.0e352L, 1.0e353L, 1.0e354L,
|
458
|
-
1.0e355L, 1.0e356L, 1.0e357L, 1.0e358L, 1.0e359L, // 350
|
459
|
-
1.0e360L, 1.0e361L, 1.0e362L, 1.0e363L, 1.0e364L,
|
460
|
-
1.0e365L, 1.0e366L, 1.0e367L, 1.0e368L, 1.0e369L, // 360
|
461
|
-
1.0e370L, 1.0e371L, 1.0e372L, 1.0e373L, 1.0e374L,
|
462
|
-
1.0e375L, 1.0e376L, 1.0e377L, 1.0e378L, 1.0e379L, // 370
|
463
|
-
1.0e380L, 1.0e381L, 1.0e382L, 1.0e383L, 1.0e384L,
|
464
|
-
1.0e385L, 1.0e386L, 1.0e387L, 1.0e388L, 1.0e389L, // 380
|
465
|
-
1.0e390L, 1.0e391L, 1.0e392L, 1.0e393L, 1.0e394L,
|
466
|
-
1.0e395L, 1.0e396L, 1.0e397L, 1.0e398L, 1.0e399L, // 390
|
467
|
-
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};
|
468
426
|
|
469
427
|
static VALUE parser_class;
|
470
428
|
|
@@ -591,7 +549,7 @@ static void big_change(ojParser p) {
|
|
591
549
|
int len = 0;
|
592
550
|
|
593
551
|
buf[sizeof(buf) - 1] = '\0';
|
594
|
-
p->buf.tail
|
552
|
+
p->buf.tail = p->buf.head;
|
595
553
|
switch (p->type) {
|
596
554
|
case OJ_INT:
|
597
555
|
// If an int then it will fit in the num.raw so no need to check length;
|
@@ -622,14 +580,14 @@ static void big_change(ojParser p) {
|
|
622
580
|
buf_append_string(&p->buf, buf + len + 1, sizeof(buf) - len - 1);
|
623
581
|
if (0 < p->num.exp) {
|
624
582
|
int x = p->num.exp;
|
625
|
-
int d;
|
583
|
+
int d, div;
|
626
584
|
bool started = false;
|
627
585
|
|
628
586
|
buf_append(&p->buf, 'e');
|
629
587
|
if (0 < p->num.exp_neg) {
|
630
588
|
buf_append(&p->buf, '-');
|
631
589
|
}
|
632
|
-
for (
|
590
|
+
for (div = 1000; 0 < div; div /= 10) {
|
633
591
|
d = x / div % 10;
|
634
592
|
if (started || 0 < d) {
|
635
593
|
buf_append(&p->buf, '0' + d);
|
@@ -646,6 +604,7 @@ static void big_change(ojParser p) {
|
|
646
604
|
static void parse(ojParser p, const byte *json) {
|
647
605
|
const byte *start;
|
648
606
|
const byte *b = json;
|
607
|
+
int i;
|
649
608
|
|
650
609
|
#if DEBUG
|
651
610
|
printf("*** parse - mode: %c %s\n", p->map[256], (const char *)json);
|
@@ -889,7 +848,7 @@ static void parse(ojParser p, const byte *json) {
|
|
889
848
|
}
|
890
849
|
buf_append_string(&p->buf, (const char *)start, b - start);
|
891
850
|
b--;
|
892
|
-
|
851
|
+
break;
|
893
852
|
case BIG_E:
|
894
853
|
buf_append(&p->buf, *b);
|
895
854
|
p->map = big_exp_sign_map;
|
@@ -1015,7 +974,7 @@ static void parse(ojParser p, const byte *json) {
|
|
1015
974
|
}
|
1016
975
|
p->ri = 0;
|
1017
976
|
*p->token = *b++;
|
1018
|
-
for (
|
977
|
+
for (i = 1; i < 4; i++) {
|
1019
978
|
if ('\0' == *b) {
|
1020
979
|
p->ri = i;
|
1021
980
|
break;
|
@@ -1040,7 +999,7 @@ static void parse(ojParser p, const byte *json) {
|
|
1040
999
|
}
|
1041
1000
|
p->ri = 0;
|
1042
1001
|
*p->token = *b++;
|
1043
|
-
for (
|
1002
|
+
for (i = 1; i < 4; i++) {
|
1044
1003
|
if ('\0' == *b) {
|
1045
1004
|
p->ri = i;
|
1046
1005
|
break;
|
@@ -1065,7 +1024,7 @@ static void parse(ojParser p, const byte *json) {
|
|
1065
1024
|
}
|
1066
1025
|
p->ri = 0;
|
1067
1026
|
*p->token = *b++;
|
1068
|
-
for (
|
1027
|
+
for (i = 1; i < 5; i++) {
|
1069
1028
|
if ('\0' == *b) {
|
1070
1029
|
p->ri = i;
|
1071
1030
|
break;
|
@@ -1204,8 +1163,7 @@ static VALUE parser_new(VALUE self, VALUE mode) {
|
|
1204
1163
|
mode = rb_sym2str(mode);
|
1205
1164
|
// fall through
|
1206
1165
|
case RUBY_T_STRING: ms = RSTRING_PTR(mode); break;
|
1207
|
-
default:
|
1208
|
-
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");
|
1209
1167
|
}
|
1210
1168
|
if (0 == strcmp("usual", ms) || 0 == strcmp("standard", ms) || 0 == strcmp("strict", ms) ||
|
1211
1169
|
0 == strcmp("compat", ms)) {
|
@@ -1237,7 +1195,8 @@ static VALUE parser_new(VALUE self, VALUE mode) {
|
|
1237
1195
|
* - *:saj*
|
1238
1196
|
* - _cache_keys=_ sets the value of the _cache_keys_ flag.
|
1239
1197
|
* - _cache_keys_ returns the value of the _cache_keys_ flag.
|
1240
|
-
* - _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.
|
1241
1200
|
* - _cache_strings_ returns the value of the _cache_strings_ integer value.
|
1242
1201
|
* - _handler=_ sets the SAJ handler
|
1243
1202
|
* - _handler_ returns the SAJ handler
|
@@ -1245,19 +1204,32 @@ static VALUE parser_new(VALUE self, VALUE mode) {
|
|
1245
1204
|
* - *:usual*
|
1246
1205
|
* - _cache_keys=_ sets the value of the _cache_keys_ flag.
|
1247
1206
|
* - _cache_keys_ returns the value of the _cache_keys_ flag.
|
1248
|
-
* - _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.
|
1249
1209
|
* - _cache_strings_ returns the value of the _cache_strings_ integer value.
|
1250
|
-
* -
|
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.
|
1251
1215
|
* - _capacity_ returns the current capacity of the parser's internal stack.
|
1252
1216
|
* - _create_id_ returns the value _create_id_ or _nil_ if there is no _create_id_.
|
1253
|
-
* - _create_id=_ sets the value _create_id_ or if _nil_ unsets it. Parsed JSON objects that include the specified
|
1254
|
-
*
|
1255
|
-
* -
|
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.
|
1256
1224
|
* - _ignore_json_create_ returns the value of the _ignore_json_create_ flag.
|
1257
|
-
* - _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.
|
1258
1227
|
* - _missing_class_ return the value of the _missing_class_ indicator.
|
1259
|
-
* - _missing_class=_ sets the value of the _missing_class_ flag. Valid values are _:auto_ which creates any missing
|
1260
|
-
*
|
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.
|
1261
1233
|
* - _omit_null_ returns the value of the _omit_null_ flag.
|
1262
1234
|
* - _symbol_keys=_ sets the flag that indicates Hash keys should be parsed to Symbols versus Strings.
|
1263
1235
|
* - _symbol_keys_ returns the value of the _symbol_keys_ flag.
|
@@ -1426,15 +1398,15 @@ static VALUE usual_parser = Qundef;
|
|
1426
1398
|
*/
|
1427
1399
|
static VALUE parser_usual(VALUE self) {
|
1428
1400
|
if (Qundef == usual_parser) {
|
1429
|
-
|
1430
|
-
|
1431
|
-
|
1432
|
-
|
1433
|
-
|
1434
|
-
|
1435
|
-
|
1436
|
-
|
1437
|
-
|
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);
|
1438
1410
|
}
|
1439
1411
|
return usual_parser;
|
1440
1412
|
}
|
@@ -1449,15 +1421,15 @@ static VALUE saj_parser = Qundef;
|
|
1449
1421
|
*/
|
1450
1422
|
static VALUE parser_saj(VALUE self) {
|
1451
1423
|
if (Qundef == saj_parser) {
|
1452
|
-
|
1453
|
-
|
1454
|
-
|
1455
|
-
|
1456
|
-
|
1457
|
-
|
1458
|
-
|
1459
|
-
|
1460
|
-
|
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);
|
1461
1433
|
}
|
1462
1434
|
return saj_parser;
|
1463
1435
|
}
|
@@ -1471,15 +1443,15 @@ static VALUE validate_parser = Qundef;
|
|
1471
1443
|
*/
|
1472
1444
|
static VALUE parser_validate(VALUE self) {
|
1473
1445
|
if (Qundef == validate_parser) {
|
1474
|
-
|
1475
|
-
|
1476
|
-
|
1477
|
-
|
1478
|
-
|
1479
|
-
|
1480
|
-
|
1481
|
-
|
1482
|
-
|
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);
|
1483
1455
|
}
|
1484
1456
|
return validate_parser;
|
1485
1457
|
}
|