oj 3.13.11 → 3.15.0

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.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +74 -0
  3. data/README.md +4 -2
  4. data/ext/oj/buf.h +11 -6
  5. data/ext/oj/cache.c +25 -24
  6. data/ext/oj/cache8.c +10 -9
  7. data/ext/oj/circarray.c +8 -6
  8. data/ext/oj/circarray.h +2 -2
  9. data/ext/oj/code.c +17 -24
  10. data/ext/oj/code.h +2 -2
  11. data/ext/oj/compat.c +17 -44
  12. data/ext/oj/custom.c +70 -141
  13. data/ext/oj/debug.c +3 -9
  14. data/ext/oj/dump.c +128 -118
  15. data/ext/oj/dump.h +12 -8
  16. data/ext/oj/dump_compat.c +564 -641
  17. data/ext/oj/dump_leaf.c +17 -63
  18. data/ext/oj/dump_object.c +70 -199
  19. data/ext/oj/dump_strict.c +22 -46
  20. data/ext/oj/encoder.c +1 -1
  21. data/ext/oj/err.c +2 -13
  22. data/ext/oj/err.h +9 -12
  23. data/ext/oj/extconf.rb +14 -5
  24. data/ext/oj/fast.c +75 -103
  25. data/ext/oj/intern.c +52 -50
  26. data/ext/oj/intern.h +4 -8
  27. data/ext/oj/mem.c +318 -0
  28. data/ext/oj/mem.h +53 -0
  29. data/ext/oj/mimic_json.c +75 -47
  30. data/ext/oj/object.c +49 -66
  31. data/ext/oj/odd.c +89 -67
  32. data/ext/oj/odd.h +15 -15
  33. data/ext/oj/oj.c +140 -99
  34. data/ext/oj/oj.h +80 -51
  35. data/ext/oj/parse.c +162 -184
  36. data/ext/oj/parse.h +7 -10
  37. data/ext/oj/parser.c +89 -34
  38. data/ext/oj/parser.h +18 -7
  39. data/ext/oj/rails.c +82 -146
  40. data/ext/oj/rails.h +1 -1
  41. data/ext/oj/reader.c +11 -12
  42. data/ext/oj/reader.h +4 -2
  43. data/ext/oj/resolve.c +3 -4
  44. data/ext/oj/rxclass.c +6 -5
  45. data/ext/oj/rxclass.h +1 -1
  46. data/ext/oj/saj.c +20 -31
  47. data/ext/oj/saj2.c +329 -93
  48. data/ext/oj/saj2.h +23 -0
  49. data/ext/oj/scp.c +3 -14
  50. data/ext/oj/sparse.c +26 -70
  51. data/ext/oj/stream_writer.c +12 -22
  52. data/ext/oj/strict.c +20 -52
  53. data/ext/oj/string_writer.c +21 -21
  54. data/ext/oj/trace.h +31 -4
  55. data/ext/oj/usual.c +105 -150
  56. data/ext/oj/usual.h +68 -0
  57. data/ext/oj/util.h +1 -1
  58. data/ext/oj/val_stack.c +1 -1
  59. data/ext/oj/val_stack.h +8 -7
  60. data/ext/oj/validate.c +21 -26
  61. data/ext/oj/wab.c +31 -68
  62. data/lib/oj/active_support_helper.rb +0 -1
  63. data/lib/oj/bag.rb +7 -1
  64. data/lib/oj/easy_hash.rb +4 -5
  65. data/lib/oj/error.rb +0 -1
  66. data/lib/oj/json.rb +4 -2
  67. data/lib/oj/mimic.rb +4 -2
  68. data/lib/oj/saj.rb +20 -6
  69. data/lib/oj/state.rb +9 -6
  70. data/lib/oj/version.rb +1 -2
  71. data/lib/oj.rb +2 -0
  72. data/pages/Compatibility.md +1 -1
  73. data/pages/InstallOptions.md +20 -0
  74. data/pages/Options.md +10 -0
  75. data/test/_test_active.rb +8 -9
  76. data/test/_test_active_mimic.rb +7 -8
  77. data/test/_test_mimic_rails.rb +17 -20
  78. data/test/activerecord/result_test.rb +5 -6
  79. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  80. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  81. data/test/{activesupport5 → activesupport7}/encoding_test.rb +20 -34
  82. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  83. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  84. data/test/files.rb +15 -15
  85. data/test/foo.rb +9 -71
  86. data/test/helper.rb +11 -8
  87. data/test/isolated/shared.rb +3 -2
  88. data/test/json_gem/json_addition_test.rb +2 -2
  89. data/test/json_gem/json_common_interface_test.rb +4 -4
  90. data/test/json_gem/json_encoding_test.rb +0 -0
  91. data/test/json_gem/json_ext_parser_test.rb +1 -0
  92. data/test/json_gem/json_fixtures_test.rb +3 -2
  93. data/test/json_gem/json_generator_test.rb +48 -36
  94. data/test/json_gem/json_generic_object_test.rb +11 -11
  95. data/test/json_gem/json_parser_test.rb +54 -47
  96. data/test/json_gem/json_string_matching_test.rb +9 -9
  97. data/test/json_gem/test_helper.rb +7 -3
  98. data/test/mem.rb +13 -12
  99. data/test/perf.rb +21 -26
  100. data/test/perf_compat.rb +31 -33
  101. data/test/perf_dump.rb +50 -0
  102. data/test/perf_fast.rb +80 -82
  103. data/test/perf_file.rb +27 -29
  104. data/test/perf_object.rb +65 -69
  105. data/test/perf_once.rb +12 -11
  106. data/test/perf_parser.rb +42 -48
  107. data/test/perf_saj.rb +46 -54
  108. data/test/perf_scp.rb +57 -69
  109. data/test/perf_simple.rb +41 -39
  110. data/test/perf_strict.rb +68 -70
  111. data/test/perf_wab.rb +67 -69
  112. data/test/prec.rb +3 -3
  113. data/test/sample/change.rb +0 -1
  114. data/test/sample/dir.rb +0 -1
  115. data/test/sample/doc.rb +0 -1
  116. data/test/sample/file.rb +0 -1
  117. data/test/sample/group.rb +0 -1
  118. data/test/sample/hasprops.rb +0 -1
  119. data/test/sample/layer.rb +0 -1
  120. data/test/sample/rect.rb +0 -1
  121. data/test/sample/shape.rb +0 -1
  122. data/test/sample/text.rb +0 -1
  123. data/test/sample.rb +16 -16
  124. data/test/sample_json.rb +8 -8
  125. data/test/test_compat.rb +76 -42
  126. data/test/test_custom.rb +72 -51
  127. data/test/test_debian.rb +7 -10
  128. data/test/test_fast.rb +86 -90
  129. data/test/test_file.rb +41 -30
  130. data/test/test_gc.rb +16 -5
  131. data/test/test_generate.rb +5 -5
  132. data/test/test_hash.rb +4 -4
  133. data/test/test_integer_range.rb +9 -9
  134. data/test/test_null.rb +20 -20
  135. data/test/test_object.rb +85 -96
  136. data/test/test_parser.rb +6 -22
  137. data/test/test_parser_debug.rb +27 -0
  138. data/test/test_parser_saj.rb +115 -23
  139. data/test/test_parser_usual.rb +6 -6
  140. data/test/test_rails.rb +2 -2
  141. data/test/test_saj.rb +10 -8
  142. data/test/test_scp.rb +37 -39
  143. data/test/test_strict.rb +30 -32
  144. data/test/test_various.rb +147 -99
  145. data/test/test_wab.rb +48 -44
  146. data/test/test_writer.rb +47 -47
  147. data/test/tests.rb +13 -4
  148. data/test/tests_mimic.rb +12 -3
  149. data/test/tests_mimic_addition.rb +12 -3
  150. metadata +33 -144
  151. data/test/activesupport4/decoding_test.rb +0 -108
  152. data/test/activesupport4/encoding_test.rb +0 -531
  153. data/test/activesupport4/test_helper.rb +0 -41
  154. data/test/activesupport5/test_helper.rb +0 -72
  155. data/test/bar.rb +0 -16
  156. data/test/baz.rb +0 -16
  157. data/test/bug.rb +0 -16
  158. data/test/zoo.rb +0 -13
data/ext/oj/usual.h ADDED
@@ -0,0 +1,68 @@
1
+ // Copyright (c) 2022, Peter Ohler, All rights reserved.
2
+
3
+ #include <ruby.h>
4
+ #include <stdbool.h>
5
+ #include <stdint.h>
6
+
7
+ struct _cache;
8
+ struct _ojParser;
9
+
10
+ // Used to mark the start of each Hash, Array, or Object. The members point at
11
+ // positions of the start in the value stack and if not an Array into the key
12
+ // stack.
13
+ typedef struct _col {
14
+ long vi; // value stack index
15
+ long ki; // key stack index if an hash else -1 for an array
16
+ } *Col;
17
+
18
+ typedef union _key {
19
+ struct {
20
+ int16_t len;
21
+ char buf[30];
22
+ };
23
+ struct {
24
+ int16_t xlen; // should be the same as len
25
+ char *key;
26
+ };
27
+ } *Key;
28
+
29
+ #define MISS_AUTO 'A'
30
+ #define MISS_RAISE 'R'
31
+ #define MISS_IGNORE 'I'
32
+
33
+ typedef struct _usual {
34
+ VALUE *vhead;
35
+ VALUE *vtail;
36
+ VALUE *vend;
37
+
38
+ Col chead;
39
+ Col ctail;
40
+ Col cend;
41
+
42
+ Key khead;
43
+ Key ktail;
44
+ Key kend;
45
+
46
+ VALUE (*get_key)(struct _ojParser *p, Key kp);
47
+ struct _cache *key_cache; // same as str_cache or sym_cache
48
+ struct _cache *str_cache;
49
+ struct _cache *sym_cache;
50
+ struct _cache *class_cache;
51
+ struct _cache *attr_cache;
52
+
53
+ VALUE array_class;
54
+ VALUE hash_class;
55
+
56
+ char *create_id;
57
+ uint8_t create_id_len;
58
+ uint8_t cache_str;
59
+ uint8_t cache_xrate;
60
+ uint8_t miss_class;
61
+ bool cache_keys;
62
+ bool ignore_json_create;
63
+ } *Usual;
64
+
65
+ // Initialize the parser with the usual delegate. If the usual delegate is
66
+ // wrapped then this function is called first and then the parser functions
67
+ // can be replaced.
68
+ extern void oj_init_usual(struct _ojParser *p, Usual d);
data/ext/oj/util.h CHANGED
@@ -13,7 +13,7 @@ typedef struct _timeInfo {
13
13
  int day;
14
14
  int mon;
15
15
  int year;
16
- } * TimeInfo;
16
+ }* TimeInfo;
17
17
 
18
18
  extern void sec_as_time(int64_t secs, TimeInfo ti);
19
19
 
data/ext/oj/val_stack.c CHANGED
@@ -12,7 +12,7 @@ static void mark(void *ptr) {
12
12
  ValStack stack = (ValStack)ptr;
13
13
  Val v;
14
14
 
15
- if (0 == ptr) {
15
+ if (NULL == ptr) {
16
16
  return;
17
17
  }
18
18
  #ifdef HAVE_PTHREAD_MUTEX_INIT
data/ext/oj/val_stack.h CHANGED
@@ -6,6 +6,7 @@
6
6
 
7
7
  #include <stdint.h>
8
8
 
9
+ #include "mem.h"
9
10
  #include "odd.h"
10
11
  #include "ruby.h"
11
12
  #ifdef HAVE_PTHREAD_MUTEX_INIT
@@ -28,10 +29,10 @@ typedef enum {
28
29
 
29
30
  typedef struct _val {
30
31
  volatile VALUE val;
31
- const char * key;
32
+ const char *key;
32
33
  char karray[32];
33
34
  volatile VALUE key_val;
34
- const char * classname;
35
+ const char *classname;
35
36
  VALUE clas;
36
37
  OddArgs odd_args;
37
38
  uint16_t klen;
@@ -39,7 +40,7 @@ typedef struct _val {
39
40
  char next; // ValNext
40
41
  char k1; // first original character in the key
41
42
  char kalloc;
42
- } * Val;
43
+ } *Val;
43
44
 
44
45
  typedef struct _valStack {
45
46
  struct _val base[STACK_INC];
@@ -52,7 +53,7 @@ typedef struct _valStack {
52
53
  VALUE mutex;
53
54
  #endif
54
55
 
55
- } * ValStack;
56
+ } *ValStack;
56
57
 
57
58
  extern VALUE oj_stack_init(ValStack stack);
58
59
 
@@ -62,7 +63,7 @@ inline static int stack_empty(ValStack stack) {
62
63
 
63
64
  inline static void stack_cleanup(ValStack stack) {
64
65
  if (stack->base != stack->head) {
65
- xfree(stack->head);
66
+ OJ_R_FREE(stack->head);
66
67
  stack->head = NULL;
67
68
  }
68
69
  }
@@ -76,10 +77,10 @@ inline static void stack_push(ValStack stack, VALUE val, ValNext next) {
76
77
  // A realloc can trigger a GC so make sure it happens outside the lock
77
78
  // but lock before changing pointers.
78
79
  if (stack->base == stack->head) {
79
- head = ALLOC_N(struct _val, len + STACK_INC);
80
+ head = OJ_R_ALLOC_N(struct _val, len + STACK_INC);
80
81
  memcpy(head, stack->base, sizeof(struct _val) * len);
81
82
  } else {
82
- REALLOC_N(head, struct _val, len + STACK_INC);
83
+ OJ_R_REALLOC_N(head, struct _val, len + STACK_INC);
83
84
  }
84
85
  #ifdef HAVE_PTHREAD_MUTEX_INIT
85
86
  pthread_mutex_lock(&stack->mutex);
data/ext/oj/validate.c CHANGED
@@ -2,50 +2,45 @@
2
2
 
3
3
  #include "parser.h"
4
4
 
5
- static void
6
- noop(ojParser p) {
5
+ static void noop(ojParser p) {
7
6
  }
8
7
 
9
- static VALUE
10
- option(ojParser p, const char *key, VALUE value) {
8
+ static VALUE option(ojParser p, const char *key, VALUE value) {
11
9
  rb_raise(rb_eArgError, "%s is not an option for the validate delegate", key);
12
10
  return Qnil;
13
11
  }
14
12
 
15
- static VALUE
16
- result(ojParser p) {
13
+ static VALUE result(ojParser p) {
17
14
  return Qnil;
18
15
  }
19
16
 
20
- static void
21
- dfree(ojParser p) {
17
+ static void dfree(ojParser p) {
22
18
  }
23
19
 
24
- static void
25
- mark(ojParser p) {
20
+ static void mark(ojParser p) {
26
21
  }
27
22
 
28
23
  void oj_set_parser_validator(ojParser p) {
29
- p->ctx = NULL;
30
- Funcs end = p->funcs + 3;
24
+ Funcs end = p->funcs + 3;
31
25
  Funcs f;
26
+ p->ctx = NULL;
32
27
 
33
28
  for (f = p->funcs; f < end; f++) {
34
- f->add_null = noop;
35
- f->add_true = noop;
36
- f->add_false = noop;
37
- f->add_int = noop;
38
- f->add_float = noop;
39
- f->add_big = noop;
40
- f->add_str = noop;
41
- f->open_array = noop;
42
- f->close_array = noop;
43
- f->open_object = noop;
44
- f->close_object = noop;
29
+ f->add_null = noop;
30
+ f->add_true = noop;
31
+ f->add_false = noop;
32
+ f->add_int = noop;
33
+ f->add_float = noop;
34
+ f->add_big = noop;
35
+ f->add_str = noop;
36
+ f->open_array = noop;
37
+ f->close_array = noop;
38
+ f->open_object = noop;
39
+ f->close_object = noop;
45
40
  }
46
41
  p->option = option;
47
42
  p->result = result;
48
- p->free = dfree;
49
- p->mark = mark;
50
- p->start = noop;
43
+ p->free = dfree;
44
+ p->mark = mark;
45
+ p->start = noop;
51
46
  }
data/ext/oj/wab.c CHANGED
@@ -35,7 +35,7 @@ static VALUE uri_http_clas = Qundef;
35
35
 
36
36
  ///// dump functions /////
37
37
 
38
- static VALUE resolve_wab_uuid_class() {
38
+ static VALUE resolve_wab_uuid_class(void) {
39
39
  if (Qundef == wab_uuid_clas) {
40
40
  volatile VALUE wab_module;
41
41
 
@@ -50,7 +50,7 @@ static VALUE resolve_wab_uuid_class() {
50
50
  return wab_uuid_clas;
51
51
  }
52
52
 
53
- static VALUE resolve_uri_class() {
53
+ static VALUE resolve_uri_class(void) {
54
54
  if (Qundef == uri_clas) {
55
55
  uri_clas = Qnil;
56
56
  if (rb_const_defined_at(rb_cObject, rb_intern("URI"))) {
@@ -60,7 +60,7 @@ static VALUE resolve_uri_class() {
60
60
  return uri_clas;
61
61
  }
62
62
 
63
- static VALUE resolve_uri_http_class() {
63
+ static VALUE resolve_uri_http_class(void) {
64
64
  if (Qundef == uri_http_clas) {
65
65
  volatile VALUE uri_module;
66
66
 
@@ -76,15 +76,13 @@ static VALUE resolve_uri_http_class() {
76
76
  }
77
77
 
78
78
  static void raise_wab(VALUE obj) {
79
- rb_raise(rb_eTypeError,
80
- "Failed to dump %s Object to JSON in wab mode.\n",
81
- rb_class2name(rb_obj_class(obj)));
79
+ rb_raise(rb_eTypeError, "Failed to dump %s Object to JSON in wab mode.\n", rb_class2name(rb_obj_class(obj)));
82
80
  }
83
81
 
84
82
  // Removed dependencies on math due to problems with CentOS 5.4.
85
83
  static void dump_float(VALUE obj, int depth, Out out, bool as_ok) {
86
84
  char buf[64];
87
- char * b;
85
+ char *b;
88
86
  double d = rb_num2dbl(obj);
89
87
  int cnt = 0;
90
88
 
@@ -124,9 +122,9 @@ static void dump_array(VALUE a, int depth, Out out, bool as_ok) {
124
122
  *out->cur++ = ']';
125
123
  } else {
126
124
  size = d2 * out->indent + 2;
125
+ assure_size(out, size * cnt);
127
126
  cnt--;
128
127
  for (i = 0; i <= cnt; i++) {
129
- assure_size(out, size);
130
128
  fill_indent(out, d2);
131
129
  oj_dump_wab_val(RARRAY_AREF(a, i), d2, out);
132
130
  if (i < cnt) {
@@ -194,20 +192,15 @@ static void dump_time(VALUE obj, Out out) {
194
192
  time_t sec;
195
193
  long long nsec;
196
194
 
197
- #ifdef HAVE_RB_TIME_TIMESPEC
198
195
  if (16 <= sizeof(struct timespec)) {
199
196
  struct timespec ts = rb_time_timespec(obj);
200
197
 
201
198
  sec = ts.tv_sec;
202
199
  nsec = ts.tv_nsec;
203
200
  } else {
204
- sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
205
- nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
201
+ sec = NUM2LL(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
202
+ nsec = NUM2LL(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
206
203
  }
207
- #else
208
- sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
209
- nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
210
- #endif
211
204
 
212
205
  assure_size(out, 36);
213
206
  // 2012-01-05T23:58:07.123456000Z
@@ -231,13 +224,13 @@ static void dump_obj(VALUE obj, int depth, Out out, bool as_ok) {
231
224
  if (rb_cTime == clas) {
232
225
  dump_time(obj, out);
233
226
  } else if (oj_bigdecimal_class == clas) {
234
- volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
227
+ volatile VALUE rstr = oj_safe_string_convert(obj);
235
228
 
236
229
  oj_dump_raw(RSTRING_PTR(rstr), (int)RSTRING_LEN(rstr), out);
237
230
  } else if (resolve_wab_uuid_class() == clas) {
238
- oj_dump_str(rb_funcall(obj, oj_to_s_id, 0), depth, out, false);
231
+ oj_dump_str(oj_safe_string_convert(obj), depth, out, false);
239
232
  } else if (resolve_uri_http_class() == clas) {
240
- oj_dump_str(rb_funcall(obj, oj_to_s_id, 0), depth, out, false);
233
+ oj_dump_str(oj_safe_string_convert(obj), depth, out, false);
241
234
  } else {
242
235
  raise_wab(obj);
243
236
  }
@@ -271,9 +264,7 @@ static DumpFunc wab_funcs[] = {
271
264
  void oj_dump_wab_val(VALUE obj, int depth, Out out) {
272
265
  int type = rb_type(obj);
273
266
 
274
- if (Yes == out->opts->trace) {
275
- oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceIn);
276
- }
267
+ TRACE(out->opts->trace, "dump", obj, depth, TraceIn);
277
268
  if (MAX_DEPTH < depth) {
278
269
  rb_raise(rb_eNoMemError, "Too deeply nested.\n");
279
270
  }
@@ -282,9 +273,7 @@ void oj_dump_wab_val(VALUE obj, int depth, Out out) {
282
273
 
283
274
  if (NULL != f) {
284
275
  f(obj, depth, out, false);
285
- if (Yes == out->opts->trace) {
286
- oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceOut);
287
- }
276
+ TRACE(out->opts->trace, "dump", obj, depth, TraceOut);
288
277
  return;
289
278
  }
290
279
  }
@@ -308,7 +297,7 @@ static VALUE calc_hash_key(ParseInfo pi, Val parent) {
308
297
  #if HAVE_RB_ENC_INTERNED_STR
309
298
  rkey = rb_enc_interned_str(parent->key, parent->klen, oj_utf8_encoding);
310
299
  #else
311
- rkey = rb_utf8_str_new(parent->key, parent->klen);
300
+ rkey = rb_utf8_str_new(parent->key, parent->klen);
312
301
  rkey = rb_str_intern(rkey);
313
302
  OBJ_FREEZE(rkey);
314
303
  #endif
@@ -317,15 +306,11 @@ static VALUE calc_hash_key(ParseInfo pi, Val parent) {
317
306
  }
318
307
 
319
308
  static void hash_end(ParseInfo pi) {
320
- if (Yes == pi->options.trace) {
321
- oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
322
- }
309
+ TRACE_PARSE_HASH_END(pi->options.trace, pi);
323
310
  }
324
311
 
325
312
  static void array_end(ParseInfo pi) {
326
- if (Yes == pi->options.trace) {
327
- oj_trace_parse_array_end(pi, __FILE__, __LINE__);
328
- }
313
+ TRACE_PARSE_ARRAY_END(pi->options.trace, pi);
329
314
  }
330
315
 
331
316
  static VALUE noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
@@ -333,9 +318,7 @@ static VALUE noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
333
318
  }
334
319
 
335
320
  static void add_value(ParseInfo pi, VALUE val) {
336
- if (Yes == pi->options.trace) {
337
- oj_trace_parse_call("add_value", pi, __FILE__, __LINE__, val);
338
- }
321
+ TRACE_PARSE_CALL(pi->options.trace, "add_value", pi, val);
339
322
  pi->stack.head->val = val;
340
323
  }
341
324
 
@@ -459,14 +442,14 @@ static VALUE protect_uri(VALUE rstr) {
459
442
  static VALUE cstr_to_rstr(ParseInfo pi, const char *str, size_t len) {
460
443
  volatile VALUE v = Qnil;
461
444
 
462
- if (30 == len && '-' == str[4] && '-' == str[7] && 'T' == str[10] && ':' == str[13] &&
463
- ':' == str[16] && '.' == str[19] && 'Z' == str[29]) {
445
+ if (30 == len && '-' == str[4] && '-' == str[7] && 'T' == str[10] && ':' == str[13] && ':' == str[16] &&
446
+ '.' == str[19] && 'Z' == str[29]) {
464
447
  if (Qnil != (v = time_parse(str, (int)len))) {
465
448
  return v;
466
449
  }
467
450
  }
468
- if (36 == len && '-' == str[8] && '-' == str[13] && '-' == str[18] && '-' == str[23] &&
469
- uuid_check(str, (int)len) && Qnil != resolve_wab_uuid_class()) {
451
+ if (36 == len && '-' == str[8] && '-' == str[13] && '-' == str[18] && '-' == str[23] && uuid_check(str, (int)len) &&
452
+ Qnil != resolve_wab_uuid_class()) {
470
453
  return rb_funcall(wab_uuid_clas, oj_new_id, 1, rb_str_new(str, len));
471
454
  }
472
455
  if (7 < len && 0 == strncasecmp("http://", str, 7)) {
@@ -483,9 +466,7 @@ static VALUE cstr_to_rstr(ParseInfo pi, const char *str, size_t len) {
483
466
 
484
467
  static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
485
468
  pi->stack.head->val = cstr_to_rstr(pi, str, len);
486
- if (Yes == pi->options.trace) {
487
- oj_trace_parse_call("add_string", pi, __FILE__, __LINE__, pi->stack.head->val);
488
- }
469
+ TRACE_PARSE_CALL(pi->options.trace, "add_string", pi, pi->stack.head->val);
489
470
  }
490
471
 
491
472
  static void add_num(ParseInfo pi, NumInfo ni) {
@@ -493,15 +474,11 @@ static void add_num(ParseInfo pi, NumInfo ni) {
493
474
  oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
494
475
  }
495
476
  pi->stack.head->val = oj_num_as_value(ni);
496
- if (Yes == pi->options.trace) {
497
- oj_trace_parse_call("add_number", pi, __FILE__, __LINE__, pi->stack.head->val);
498
- }
477
+ TRACE_PARSE_CALL(pi->options.trace, "add_number", pi, pi->stack.head->val);
499
478
  }
500
479
 
501
480
  static VALUE start_hash(ParseInfo pi) {
502
- if (Yes == pi->options.trace) {
503
- oj_trace_parse_in("start_hash", pi, __FILE__, __LINE__);
504
- }
481
+ TRACE_PARSE_IN(pi->options.trace, "start_hash", pi);
505
482
  if (Qnil != pi->options.hash_class) {
506
483
  return rb_class_new_instance(0, NULL, pi->options.hash_class);
507
484
  }
@@ -512,9 +489,7 @@ static void hash_set_cstr(ParseInfo pi, Val parent, const char *str, size_t len,
512
489
  volatile VALUE rval = cstr_to_rstr(pi, str, len);
513
490
 
514
491
  rb_hash_aset(stack_peek(&pi->stack)->val, calc_hash_key(pi, parent), rval);
515
- if (Yes == pi->options.trace) {
516
- oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rval);
517
- }
492
+ TRACE_PARSE_CALL(pi->options.trace, "set_string", pi, rval);
518
493
  }
519
494
 
520
495
  static void hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
@@ -525,22 +500,16 @@ static void hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
525
500
  }
526
501
  rval = oj_num_as_value(ni);
527
502
  rb_hash_aset(stack_peek(&pi->stack)->val, calc_hash_key(pi, parent), rval);
528
- if (Yes == pi->options.trace) {
529
- oj_trace_parse_call("set_number", pi, __FILE__, __LINE__, rval);
530
- }
503
+ TRACE_PARSE_CALL(pi->options.trace, "set_number", pi, rval);
531
504
  }
532
505
 
533
506
  static void hash_set_value(ParseInfo pi, Val parent, VALUE value) {
534
507
  rb_hash_aset(stack_peek(&pi->stack)->val, calc_hash_key(pi, parent), value);
535
- if (Yes == pi->options.trace) {
536
- oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, value);
537
- }
508
+ TRACE_PARSE_CALL(pi->options.trace, "set_value", pi, value);
538
509
  }
539
510
 
540
511
  static VALUE start_array(ParseInfo pi) {
541
- if (Yes == pi->options.trace) {
542
- oj_trace_parse_in("start_array", pi, __FILE__, __LINE__);
543
- }
512
+ TRACE_PARSE_IN(pi->options.trace, "start_array", pi);
544
513
  return rb_ary_new();
545
514
  }
546
515
 
@@ -548,9 +517,7 @@ static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const c
548
517
  volatile VALUE rval = cstr_to_rstr(pi, str, len);
549
518
 
550
519
  rb_ary_push(stack_peek(&pi->stack)->val, rval);
551
- if (Yes == pi->options.trace) {
552
- oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, rval);
553
- }
520
+ TRACE_PARSE_CALL(pi->options.trace, "set_value", pi, rval);
554
521
  }
555
522
 
556
523
  static void array_append_num(ParseInfo pi, NumInfo ni) {
@@ -561,16 +528,12 @@ static void array_append_num(ParseInfo pi, NumInfo ni) {
561
528
  }
562
529
  rval = oj_num_as_value(ni);
563
530
  rb_ary_push(stack_peek(&pi->stack)->val, rval);
564
- if (Yes == pi->options.trace) {
565
- oj_trace_parse_call("append_number", pi, __FILE__, __LINE__, rval);
566
- }
531
+ TRACE_PARSE_CALL(pi->options.trace, "append_number", pi, rval);
567
532
  }
568
533
 
569
534
  static void array_append_value(ParseInfo pi, VALUE value) {
570
535
  rb_ary_push(stack_peek(&pi->stack)->val, value);
571
- if (Yes == pi->options.trace) {
572
- oj_trace_parse_call("append_value", pi, __FILE__, __LINE__, value);
573
- }
536
+ TRACE_PARSE_CALL(pi->options.trace, "append_value", pi, value);
574
537
  }
575
538
 
576
539
  void oj_set_wab_callbacks(ParseInfo pi) {
@@ -1,4 +1,3 @@
1
-
2
1
  require 'active_support/time'
3
2
 
4
3
  module Oj
data/lib/oj/bag.rb CHANGED
@@ -15,7 +15,7 @@ module Oj
15
15
  # @example Oj::Bag.new(:@x => 42, :@y => 57)
16
16
  # @param [Hash] args instance variable symbols and their values
17
17
  def initialize(args = {})
18
- args.each do |k,v|
18
+ args.each do |k, v|
19
19
  self.instance_variable_set(k, v)
20
20
  end
21
21
  end
@@ -26,6 +26,7 @@ module Oj
26
26
  # variable reader, otherwise false.
27
27
  def respond_to?(m)
28
28
  return true if super
29
+
29
30
  instance_variables.include?(:"@#{m}")
30
31
  end
31
32
 
@@ -37,8 +38,10 @@ module Oj
37
38
  # @raise [NoMethodError] if the instance variable is not defined.
38
39
  def method_missing(m, *args, &block)
39
40
  raise ArgumentError.new("wrong number of arguments (#{args.size} for 0) to method #{m}") unless args.nil? or args.empty?
41
+
40
42
  at_m = :"@#{m}"
41
43
  raise NoMethodError.new("undefined method #{m}", m) unless instance_variable_defined?(at_m)
44
+
42
45
  instance_variable_get(at_m)
43
46
  end
44
47
 
@@ -47,9 +50,11 @@ module Oj
47
50
  # @return [Boolean] true if each variable and value are the same, otherwise false.
48
51
  def eql?(other)
49
52
  return false if (other.nil? or self.class != other.class)
53
+
50
54
  ova = other.instance_variables
51
55
  iv = instance_variables
52
56
  return false if ova.size != iv.size
57
+
53
58
  iv.all? { |vid| instance_variable_get(vid) != other.instance_variable_get(vid) }
54
59
  end
55
60
  alias == eql?
@@ -65,6 +70,7 @@ module Oj
65
70
  classname = classname.to_s unless classname.is_a?(String)
66
71
  tokens = classname.split('::').map(&:to_sym)
67
72
  raise NameError.new("Invalid classname '#{classname}") if tokens.empty?
73
+
68
74
  m = Object
69
75
  tokens[0..-2].each do |sym|
70
76
  if m.const_defined?(sym)
data/lib/oj/easy_hash.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Oj
3
2
 
4
3
  # A Hash subclass that normalizes the hash keys to allow lookup by the
@@ -6,10 +5,6 @@ module Oj
6
5
  # that match the keys.
7
6
  class EasyHash < Hash
8
7
 
9
- # Initializes the instance to an empty Hash.
10
- def initialize()
11
- end
12
-
13
8
  # Replaces the Object.respond_to?() method.
14
9
  # @param [Symbol] m method symbol
15
10
  # @param [Boolean] include_all whether to include private and protected methods in the search
@@ -19,12 +14,14 @@ module Oj
19
14
  return true if super
20
15
  return true if has_key?(m)
21
16
  return true if has_key?(m.to_s)
17
+
22
18
  has_key?(m.to_sym)
23
19
  end
24
20
 
25
21
  def [](key)
26
22
  return fetch(key, nil) if has_key?(key)
27
23
  return fetch(key.to_s, nil) if has_key?(key.to_s)
24
+
28
25
  fetch(key.to_sym, nil)
29
26
  end
30
27
 
@@ -36,9 +33,11 @@ module Oj
36
33
  def method_missing(m, *args, &block)
37
34
  if m.to_s.end_with?('=')
38
35
  raise ArgumentError.new("wrong number of arguments (#{args.size} for 1 with #{m}) to method #{m}") if args.nil? or 1 != args.length
36
+
39
37
  m = m[0..-2]
40
38
  return store(m.to_s, args[0]) if has_key?(m.to_s)
41
39
  return store(m.to_sym, args[0]) if has_key?(m.to_sym)
40
+
42
41
  return store(m, args[0])
43
42
  else
44
43
  raise ArgumentError.new("wrong number of arguments (#{args.size} for 0 with #{m}) to method #{m}") unless args.nil? or args.empty?
data/lib/oj/error.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  module Oj
3
2
 
4
3
  # Inherit Error class from StandardError.
data/lib/oj/json.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  require 'ostruct'
3
2
  require 'oj/state'
4
3
 
@@ -51,7 +50,7 @@ module JSON
51
50
 
52
51
  def self.dump_default_options=(h)
53
52
  m = Oj::MimicDumpOption.new
54
- h.each do |k,v|
53
+ h.each do |k, v|
55
54
  m[k] = v
56
55
  end
57
56
  end
@@ -76,16 +75,19 @@ module JSON
76
75
  class Parser
77
76
  def initialize(src)
78
77
  raise TypeError.new("already initialized") unless @source.nil?
78
+
79
79
  @source = src
80
80
  end
81
81
 
82
82
  def source()
83
83
  raise TypeError.new("already initialized") if @source.nil?
84
+
84
85
  @source
85
86
  end
86
87
 
87
88
  def parse()
88
89
  raise TypeError.new("already initialized") if @source.nil?
90
+
89
91
  JSON.parse(@source)
90
92
  end
91
93
 
data/lib/oj/mimic.rb CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  require 'bigdecimal'
3
2
  begin
4
3
  require 'ostruct'
@@ -64,6 +63,8 @@ module Oj
64
63
  self.store(:allow_nan, true)
65
64
  self.store(:quirks_mode, oo[:quirks_mode])
66
65
  self.store(:ascii_only, (:ascii == oo[:escape_mode]))
66
+
67
+ super
67
68
  end
68
69
 
69
70
  def []=(key, value)
@@ -102,6 +103,7 @@ module Oj
102
103
  def as_json(*)
103
104
  name = self.class.name.to_s
104
105
  raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
106
+
105
107
  { JSON.create_id => name, 't' => table }
106
108
  end
107
109
  end
@@ -232,6 +234,7 @@ module Oj
232
234
  def as_json(*)
233
235
  name = self.class.name.to_s
234
236
  raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
237
+
235
238
  { JSON.create_id => name, 'v' => values }
236
239
  end
237
240
  end
@@ -273,7 +276,6 @@ module Oj
273
276
  end
274
277
  end
275
278
  end
276
-
277
279
  end # self.mimic_loaded
278
280
 
279
281
  end # Oj