oj 3.13.11 → 3.15.0

Sign up to get free protection for your applications and to get access to all the features.
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