oj 3.13.0 → 3.13.4

Sign up to get free protection for your applications and to get access to all the features.
data/ext/oj/intern.h CHANGED
@@ -21,7 +21,6 @@ extern VALUE oj_class_intern(const char * key,
21
21
  int auto_define,
22
22
  VALUE error_class);
23
23
 
24
- extern void oj_hash_print();
25
24
  extern char *oj_strndup(const char *s, size_t len);
26
25
 
27
26
  #endif /* OJ_INTERN_H */
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 oj_encode(rb_str_new_cstr(oj_default_options.create_id));
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
- 3, // cache_str
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
- if (Qnil == (rkey = oj_sym_hash_get(kval->key + 1, kval->klen - 1, &slot))) {
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
- #else
61
- if (':' == k1) {
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
- #endif
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
- rstr = rb_str_new(str, len);
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
- parent->val = rb_str_new(str, len);
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 alway create local time, the
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
- 3, // cache_str
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 identation.
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 vsalue length to cache
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_] formating options
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_] formating options
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 mimicing the JSON gem or in strict mode.
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] = {1.0L, 1.0e1L, 1.0e2L, 1.0e3L, 1.0e4L,
404
- 1.0e5L, 1.0e6L, 1.0e7L, 1.0e8L, 1.0e9L, // 00
405
- 1.0e10L, 1.0e11L, 1.0e12L, 1.0e13L, 1.0e14L,
406
- 1.0e15L, 1.0e16L, 1.0e17L, 1.0e18L, 1.0e19L, // 10
407
- 1.0e20L, 1.0e21L, 1.0e22L, 1.0e23L, 1.0e24L,
408
- 1.0e25L, 1.0e26L, 1.0e27L, 1.0e28L, 1.0e29L, // 20
409
- 1.0e30L, 1.0e31L, 1.0e32L, 1.0e33L, 1.0e34L,
410
- 1.0e35L, 1.0e36L, 1.0e37L, 1.0e38L, 1.0e39L, // 30
411
- 1.0e40L, 1.0e41L, 1.0e42L, 1.0e43L, 1.0e44L,
412
- 1.0e45L, 1.0e46L, 1.0e47L, 1.0e48L, 1.0e49L, // 40
413
- 1.0e50L, 1.0e51L, 1.0e52L, 1.0e53L, 1.0e54L,
414
- 1.0e55L, 1.0e56L, 1.0e57L, 1.0e58L, 1.0e59L, // 50
415
- 1.0e60L, 1.0e61L, 1.0e62L, 1.0e63L, 1.0e64L,
416
- 1.0e65L, 1.0e66L, 1.0e67L, 1.0e68L, 1.0e69L, // 60
417
- 1.0e70L, 1.0e71L, 1.0e72L, 1.0e73L, 1.0e74L,
418
- 1.0e75L, 1.0e76L, 1.0e77L, 1.0e78L, 1.0e79L, // 70
419
- 1.0e80L, 1.0e81L, 1.0e82L, 1.0e83L, 1.0e84L,
420
- 1.0e85L, 1.0e86L, 1.0e87L, 1.0e88L, 1.0e89L, // 80
421
- 1.0e90L, 1.0e91L, 1.0e92L, 1.0e93L, 1.0e94L,
422
- 1.0e95L, 1.0e96L, 1.0e97L, 1.0e98L, 1.0e99L, // 90
423
- 1.0e100L, 1.0e101L, 1.0e102L, 1.0e103L, 1.0e104L,
424
- 1.0e105L, 1.0e106L, 1.0e107L, 1.0e108L, 1.0e109L, // 100
425
- 1.0e110L, 1.0e111L, 1.0e112L, 1.0e113L, 1.0e114L,
426
- 1.0e115L, 1.0e116L, 1.0e117L, 1.0e118L, 1.0e119L, // 110
427
- 1.0e120L, 1.0e121L, 1.0e122L, 1.0e123L, 1.0e124L,
428
- 1.0e125L, 1.0e126L, 1.0e127L, 1.0e128L, 1.0e129L, // 120
429
- 1.0e130L, 1.0e131L, 1.0e132L, 1.0e133L, 1.0e134L,
430
- 1.0e135L, 1.0e136L, 1.0e137L, 1.0e138L, 1.0e139L, // 130
431
- 1.0e140L, 1.0e141L, 1.0e142L, 1.0e143L, 1.0e144L,
432
- 1.0e145L, 1.0e146L, 1.0e147L, 1.0e148L, 1.0e149L, // 140
433
- 1.0e150L, 1.0e151L, 1.0e152L, 1.0e153L, 1.0e154L,
434
- 1.0e155L, 1.0e156L, 1.0e157L, 1.0e158L, 1.0e159L, // 150
435
- 1.0e160L, 1.0e161L, 1.0e162L, 1.0e163L, 1.0e164L,
436
- 1.0e165L, 1.0e166L, 1.0e167L, 1.0e168L, 1.0e169L, // 160
437
- 1.0e170L, 1.0e171L, 1.0e172L, 1.0e173L, 1.0e174L,
438
- 1.0e175L, 1.0e176L, 1.0e177L, 1.0e178L, 1.0e179L, // 170
439
- 1.0e180L, 1.0e181L, 1.0e182L, 1.0e183L, 1.0e184L,
440
- 1.0e185L, 1.0e186L, 1.0e187L, 1.0e188L, 1.0e189L, // 180
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 = p->buf.head;
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 (int div = 1000; 0 < div; div /= 10) {
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
- break;
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 (int i = 1; i < 4; i++) {
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 (int i = 1; i < 4; i++) {
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 (int i = 1; i < 5; i++) {
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 = rb_sym_to_s(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 that length are cached.
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 that length are cached.
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
- * - _capacity=_ sets the capacity of the parser. The parser grows automatically but can be updated directly with this call.
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 element use the element value as the name of the class to create an object from instead of a Hash.
1270
- * - _decimal=_ sets the approach to how decimals are parser. If _:auto_ then the decimals with significant digits are 16 or less are Floats and long ones are BigDecimal. _:ruby_ uses a call to Ruby to convert a string to a Float. _:float_ always generates a Float. _:bigdecimal_ always results in a BigDecimal.
1271
- * - _decimal_ returns the value of the decimal conversion option which can be :auto (default), :ruby, :float, or :bigdecimal.
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 ignored on parsing in favor of creating an instance and populating directly.
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 classes on parse, :ignore which ignores and continues as a Hash (default), and :raise which raises an exception if the class is not found.
1276
- * - _omit_null=_ sets the _omit_null_ flag. If true then null values in a map or object are omitted from the resulting Hash or Object.
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 = rb_sym_to_s(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
- ojParser p = ALLOC(struct _ojParser);
1446
-
1447
- memset(p, 0, sizeof(struct _ojParser));
1448
- buf_init(&p->key);
1449
- buf_init(&p->buf);
1450
- p->map = value_map;
1451
- oj_set_parser_usual(p);
1452
- usual_parser = Data_Wrap_Struct(parser_class, parser_mark, parser_free, p);
1453
- rb_gc_register_address(&usual_parser);
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
- ojParser p = ALLOC(struct _ojParser);
1469
-
1470
- memset(p, 0, sizeof(struct _ojParser));
1471
- buf_init(&p->key);
1472
- buf_init(&p->buf);
1473
- p->map = value_map;
1474
- oj_set_parser_saj(p);
1475
- saj_parser = Data_Wrap_Struct(parser_class, parser_mark, parser_free, p);
1476
- rb_gc_register_address(&saj_parser);
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
- ojParser p = ALLOC(struct _ojParser);
1491
-
1492
- memset(p, 0, sizeof(struct _ojParser));
1493
- buf_init(&p->key);
1494
- buf_init(&p->buf);
1495
- p->map = value_map;
1496
- oj_set_parser_validator(p);
1497
- validate_parser = Data_Wrap_Struct(parser_class, parser_mark, parser_free, p);
1498
- rb_gc_register_address(&validate_parser);
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
  }