oj 3.7.4 → 3.11.2

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -4
  3. data/ext/oj/buf.h +6 -34
  4. data/ext/oj/cache8.c +3 -3
  5. data/ext/oj/cache8.h +5 -33
  6. data/ext/oj/circarray.c +5 -9
  7. data/ext/oj/circarray.h +5 -8
  8. data/ext/oj/code.c +3 -6
  9. data/ext/oj/code.h +7 -10
  10. data/ext/oj/compat.c +11 -14
  11. data/ext/oj/custom.c +108 -75
  12. data/ext/oj/dump.c +132 -92
  13. data/ext/oj/dump.h +6 -7
  14. data/ext/oj/dump_compat.c +37 -34
  15. data/ext/oj/dump_leaf.c +3 -6
  16. data/ext/oj/dump_object.c +23 -17
  17. data/ext/oj/dump_strict.c +7 -9
  18. data/ext/oj/encode.h +6 -32
  19. data/ext/oj/err.c +2 -5
  20. data/ext/oj/err.h +6 -34
  21. data/ext/oj/extconf.rb +6 -0
  22. data/ext/oj/fast.c +39 -56
  23. data/ext/oj/hash.c +11 -39
  24. data/ext/oj/hash.h +5 -33
  25. data/ext/oj/hash_test.c +3 -31
  26. data/ext/oj/mimic_json.c +65 -44
  27. data/ext/oj/object.c +38 -69
  28. data/ext/oj/odd.c +18 -17
  29. data/ext/oj/odd.h +6 -9
  30. data/ext/oj/oj.c +139 -93
  31. data/ext/oj/oj.h +43 -35
  32. data/ext/oj/parse.c +164 -60
  33. data/ext/oj/parse.h +30 -31
  34. data/ext/oj/rails.c +119 -83
  35. data/ext/oj/rails.h +4 -7
  36. data/ext/oj/reader.c +5 -8
  37. data/ext/oj/reader.h +7 -10
  38. data/ext/oj/resolve.c +4 -7
  39. data/ext/oj/resolve.h +4 -7
  40. data/ext/oj/rxclass.c +8 -11
  41. data/ext/oj/rxclass.h +8 -11
  42. data/ext/oj/saj.c +9 -12
  43. data/ext/oj/scp.c +4 -7
  44. data/ext/oj/sparse.c +67 -33
  45. data/ext/oj/stream_writer.c +16 -15
  46. data/ext/oj/strict.c +9 -12
  47. data/ext/oj/string_writer.c +27 -8
  48. data/ext/oj/trace.c +5 -8
  49. data/ext/oj/trace.h +9 -12
  50. data/ext/oj/util.c +136 -0
  51. data/ext/oj/util.h +19 -0
  52. data/ext/oj/val_stack.c +28 -36
  53. data/ext/oj/val_stack.h +19 -50
  54. data/ext/oj/wab.c +29 -29
  55. data/lib/oj.rb +0 -8
  56. data/lib/oj/json.rb +1 -1
  57. data/lib/oj/mimic.rb +46 -2
  58. data/lib/oj/version.rb +2 -2
  59. data/pages/Modes.md +47 -45
  60. data/pages/Options.md +43 -10
  61. data/pages/Rails.md +60 -21
  62. data/pages/Security.md +1 -1
  63. data/test/activesupport5/abstract_unit.rb +45 -0
  64. data/test/activesupport5/decoding_test.rb +68 -60
  65. data/test/activesupport5/encoding_test.rb +111 -96
  66. data/test/activesupport5/encoding_test_cases.rb +33 -25
  67. data/test/activesupport5/test_helper.rb +43 -21
  68. data/test/activesupport5/time_zone_test_helpers.rb +18 -3
  69. data/test/activesupport6/abstract_unit.rb +44 -0
  70. data/test/activesupport6/decoding_test.rb +133 -0
  71. data/test/activesupport6/encoding_test.rb +507 -0
  72. data/test/activesupport6/encoding_test_cases.rb +98 -0
  73. data/test/activesupport6/test_common.rb +17 -0
  74. data/test/activesupport6/test_helper.rb +163 -0
  75. data/test/activesupport6/time_zone_test_helpers.rb +39 -0
  76. data/test/bar.rb +24 -6
  77. data/test/baz.rb +16 -0
  78. data/test/foo.rb +26 -57
  79. data/test/helper.rb +10 -0
  80. data/test/json_gem/json_common_interface_test.rb +8 -3
  81. data/test/json_gem/json_generator_test.rb +15 -3
  82. data/test/json_gem/test_helper.rb +8 -0
  83. data/test/prec.rb +23 -0
  84. data/test/sample_json.rb +1 -1
  85. data/test/test_compat.rb +21 -10
  86. data/test/test_custom.rb +135 -8
  87. data/test/test_integer_range.rb +1 -2
  88. data/test/test_object.rb +35 -2
  89. data/test/test_rails.rb +35 -0
  90. data/test/test_strict.rb +24 -1
  91. data/test/test_various.rb +52 -63
  92. data/test/test_writer.rb +19 -2
  93. data/test/tests.rb +1 -0
  94. data/test/zoo.rb +13 -0
  95. metadata +100 -75
data/ext/oj/val_stack.c CHANGED
@@ -1,34 +1,9 @@
1
- /* val_stack.c
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions are met:
7
- *
8
- * - Redistributions of source code must retain the above copyright notice, this
9
- * list of conditions and the following disclaimer.
10
- *
11
- * - Redistributions in binary form must reproduce the above copyright notice,
12
- * this list of conditions and the following disclaimer in the documentation
13
- * and/or other materials provided with the distribution.
14
- *
15
- * - Neither the name of Peter Ohler nor the names of its contributors may be
16
- * used to endorse or promote products derived from this software without
17
- * specific prior written permission.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
- */
1
+ // Copyright (c) 2011 Peter Ohler. All rights reserved.
2
+
3
+ #include <string.h>
30
4
 
31
5
  #include "oj.h"
6
+ #include "odd.h"
32
7
  #include "val_stack.h"
33
8
 
34
9
  static void
@@ -39,7 +14,7 @@ mark(void *ptr) {
39
14
  if (0 == ptr) {
40
15
  return;
41
16
  }
42
- #if HAVE_LIBPTHREAD
17
+ #ifdef HAVE_PTHREAD_MUTEX_INIT
43
18
  pthread_mutex_lock(&stack->mutex);
44
19
  #else
45
20
  rb_mutex_lock(stack->mutex);
@@ -52,8 +27,18 @@ mark(void *ptr) {
52
27
  if (Qnil != v->key_val && Qundef != v->key_val) {
53
28
  rb_gc_mark(v->key_val);
54
29
  }
30
+ if (NULL != v->odd_args) {
31
+ VALUE *a;
32
+ int i;
33
+
34
+ for (i = v->odd_args->odd->attr_cnt, a = v->odd_args->args; 0 < i; i--, a++) {
35
+ if (Qnil != *a) {
36
+ rb_gc_mark(*a);
37
+ }
38
+ }
39
+ }
55
40
  }
56
- #if HAVE_LIBPTHREAD
41
+ #ifdef HAVE_PTHREAD_MUTEX_INIT
57
42
  pthread_mutex_unlock(&stack->mutex);
58
43
  #else
59
44
  rb_mutex_unlock(stack->mutex);
@@ -62,21 +47,28 @@ mark(void *ptr) {
62
47
 
63
48
  VALUE
64
49
  oj_stack_init(ValStack stack) {
65
- #if HAVE_LIBPTHREAD
66
- pthread_mutex_init(&stack->mutex, 0);
50
+ #ifdef HAVE_PTHREAD_MUTEX_INIT
51
+ int err;
52
+
53
+ if (0 != (err = pthread_mutex_init(&stack->mutex, 0))) {
54
+ rb_raise(rb_eException, "failed to initialize a mutex. %s", strerror(err));
55
+ }
67
56
  #else
68
57
  stack->mutex = rb_mutex_new();
69
58
  #endif
70
59
  stack->head = stack->base;
71
- stack->end = stack->base + sizeof(stack->base) / sizeof(struct _Val);
60
+ stack->end = stack->base + sizeof(stack->base) / sizeof(struct _val);
72
61
  stack->tail = stack->head;
73
62
  stack->head->val = Qundef;
74
- stack->head->key = 0;
63
+ stack->head->key = NULL;
75
64
  stack->head->key_val = Qundef;
76
- stack->head->classname = 0;
65
+ stack->head->classname = NULL;
66
+ stack->head->odd_args = NULL;
67
+ stack->head->clas = Qundef;
77
68
  stack->head->klen = 0;
78
69
  stack->head->clen = 0;
79
70
  stack->head->next = NEXT_NONE;
71
+
80
72
  return Data_Wrap_Struct(oj_cstack_class, mark, 0, stack);
81
73
  }
82
74
 
data/ext/oj/val_stack.h CHANGED
@@ -1,40 +1,12 @@
1
- /* val_stack.h
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions are met:
7
- *
8
- * - Redistributions of source code must retain the above copyright notice, this
9
- * list of conditions and the following disclaimer.
10
- *
11
- * - Redistributions in binary form must reproduce the above copyright notice,
12
- * this list of conditions and the following disclaimer in the documentation
13
- * and/or other materials provided with the distribution.
14
- *
15
- * - Neither the name of Peter Ohler nor the names of its contributors may be
16
- * used to endorse or promote products derived from this software without
17
- * specific prior written permission.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
- */
30
-
31
- #ifndef __OJ_VAL_STACK_H__
32
- #define __OJ_VAL_STACK_H__
1
+ // Copyright (c) 2011 Peter Ohler. All rights reserved.
2
+
3
+ #ifndef OJ_VAL_STACK_H
4
+ #define OJ_VAL_STACK_H
33
5
 
34
6
  #include "ruby.h"
35
7
  #include "odd.h"
36
8
  #include <stdint.h>
37
- #if HAVE_LIBPTHREAD
9
+ #ifdef HAVE_PTHREAD_MUTEX_INIT
38
10
  #include <pthread.h>
39
11
  #endif
40
12
 
@@ -52,18 +24,14 @@ typedef enum {
52
24
  NEXT_HASH_COMMA = 'n',
53
25
  } ValNext;
54
26
 
55
- typedef struct _Val {
27
+ typedef struct _val {
56
28
  volatile VALUE val;
57
29
  const char *key;
58
30
  char karray[32];
59
31
  volatile VALUE key_val;
60
- union {
61
- struct {
62
- const char *classname;
63
- VALUE clas;
64
- };
65
- OddArgs odd_args;
66
- };
32
+ const char *classname;
33
+ VALUE clas;
34
+ OddArgs odd_args;
67
35
  uint16_t klen;
68
36
  uint16_t clen;
69
37
  char next; // ValNext
@@ -71,12 +39,12 @@ typedef struct _Val {
71
39
  char kalloc;
72
40
  } *Val;
73
41
 
74
- typedef struct _ValStack {
75
- struct _Val base[STACK_INC];
42
+ typedef struct _valStack {
43
+ struct _val base[STACK_INC];
76
44
  Val head; // current stack
77
45
  Val end; // stack end
78
46
  Val tail; // pointer to one past last element name on stack
79
- #if HAVE_LIBPTHREAD
47
+ #ifdef HAVE_PTHREAD_MUTEX_INIT
80
48
  pthread_mutex_t mutex;
81
49
  #else
82
50
  VALUE mutex;
@@ -109,12 +77,12 @@ stack_push(ValStack stack, VALUE val, ValNext next) {
109
77
  // A realloc can trigger a GC so make sure it happens outside the lock
110
78
  // but lock before changing pointers.
111
79
  if (stack->base == stack->head) {
112
- head = ALLOC_N(struct _Val, len + STACK_INC);
113
- memcpy(head, stack->base, sizeof(struct _Val) * len);
80
+ head = ALLOC_N(struct _val, len + STACK_INC);
81
+ memcpy(head, stack->base, sizeof(struct _val) * len);
114
82
  } else {
115
- REALLOC_N(head, struct _Val, len + STACK_INC);
83
+ REALLOC_N(head, struct _val, len + STACK_INC);
116
84
  }
117
- #if HAVE_LIBPTHREAD
85
+ #ifdef HAVE_PTHREAD_MUTEX_INIT
118
86
  pthread_mutex_lock(&stack->mutex);
119
87
  #else
120
88
  rb_mutex_lock(stack->mutex);
@@ -122,7 +90,7 @@ stack_push(ValStack stack, VALUE val, ValNext next) {
122
90
  stack->head = head;
123
91
  stack->tail = stack->head + toff;
124
92
  stack->end = stack->head + len + STACK_INC;
125
- #if HAVE_LIBPTHREAD
93
+ #ifdef HAVE_PTHREAD_MUTEX_INIT
126
94
  pthread_mutex_unlock(&stack->mutex);
127
95
  #else
128
96
  rb_mutex_unlock(stack->mutex);
@@ -132,6 +100,7 @@ stack_push(ValStack stack, VALUE val, ValNext next) {
132
100
  stack->tail->next = next;
133
101
  stack->tail->classname = NULL;
134
102
  stack->tail->clas = Qundef;
103
+ stack->tail->odd_args = NULL;
135
104
  stack->tail->key = 0;
136
105
  stack->tail->key_val = Qundef;
137
106
  stack->tail->clen = 0;
@@ -185,4 +154,4 @@ stack_pop(ValStack stack) {
185
154
 
186
155
  extern const char* oj_stack_next_string(ValNext n);
187
156
 
188
- #endif /* __OJ_VAL_STACK_H__ */
157
+ #endif /* OJ_VAL_STACK_H */
data/ext/oj/wab.c CHANGED
@@ -1,7 +1,4 @@
1
- /* wab.c
2
- * Copyright (c) 2012, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include <stdlib.h>
7
4
  #include <stdio.h>
@@ -15,6 +12,7 @@
15
12
  #include "encode.h"
16
13
  #include "dump.h"
17
14
  #include "trace.h"
15
+ #include "util.h"
18
16
 
19
17
  // Workaround in case INFINITY is not defined in math.h or if the OS is CentOS
20
18
  #define OJ_INFINITY (1.0/0.0)
@@ -147,11 +145,12 @@ dump_array(VALUE a, int depth, Out out, bool as_ok) {
147
145
  }
148
146
 
149
147
  static int
150
- hash_cb(VALUE key, VALUE value, Out out) {
148
+ hash_cb(VALUE key, VALUE value, VALUE ov) {
149
+ Out out = (Out)ov;
151
150
  int depth = out->depth;
152
151
  long size;
153
152
  int rtype = rb_type(key);
154
-
153
+
155
154
  if (rtype != T_SYMBOL) {
156
155
  rb_raise(rb_eTypeError, "In :wab mode all Hash keys must be Symbols, not %s.\n", rb_class2name(rb_obj_class(key)));
157
156
  }
@@ -193,17 +192,21 @@ dump_hash(VALUE obj, int depth, Out out, bool as_ok) {
193
192
 
194
193
  static void
195
194
  dump_time(VALUE obj, Out out) {
196
- char buf[64];
197
- struct tm *tm;
198
- int len;
199
- time_t sec;
200
- long long nsec;
195
+ char buf[64];
196
+ struct _timeInfo ti;
197
+ int len;
198
+ time_t sec;
199
+ long long nsec;
201
200
 
202
201
  #ifdef HAVE_RB_TIME_TIMESPEC
203
- {
202
+ if (16 <= sizeof(struct timespec)) {
204
203
  struct timespec ts = rb_time_timespec(obj);
204
+
205
205
  sec = ts.tv_sec;
206
206
  nsec = ts.tv_nsec;
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));
207
210
  }
208
211
  #else
209
212
  sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
@@ -212,11 +215,9 @@ dump_time(VALUE obj, Out out) {
212
215
 
213
216
  assure_size(out, 36);
214
217
  // 2012-01-05T23:58:07.123456000Z
215
- tm = gmtime(&sec);
218
+ sec_as_time(sec, &ti);
216
219
 
217
- len = sprintf(buf, "%04d-%02d-%02dT%02d:%02d:%02d.%09ldZ",
218
- tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
219
- tm->tm_hour, tm->tm_min, tm->tm_sec, (long)nsec);
220
+ len = sprintf(buf, "%04d-%02d-%02dT%02d:%02d:%02d.%09ldZ", ti.year, ti.mon, ti.day, ti.hour, ti.min, ti.sec, (long)nsec);
220
221
  oj_dump_cstr(buf, len, 0, 0, out);
221
222
  }
222
223
 
@@ -267,7 +268,7 @@ static DumpFunc wab_funcs[] = {
267
268
  void
268
269
  oj_dump_wab_val(VALUE obj, int depth, Out out) {
269
270
  int type = rb_type(obj);
270
-
271
+
271
272
  if (Yes == out->opts->trace) {
272
273
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceIn);
273
274
  }
@@ -291,21 +292,21 @@ oj_dump_wab_val(VALUE obj, int depth, Out out) {
291
292
  ///// load functions /////
292
293
 
293
294
  static void
294
- hash_end(struct _ParseInfo *pi) {
295
+ hash_end(ParseInfo pi) {
295
296
  if (Yes == pi->options.trace) {
296
297
  oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
297
298
  }
298
299
  }
299
300
 
300
301
  static void
301
- array_end(struct _ParseInfo *pi) {
302
+ array_end(ParseInfo pi) {
302
303
  if (Yes == pi->options.trace) {
303
304
  oj_trace_parse_array_end(pi, __FILE__, __LINE__);
304
305
  }
305
306
  }
306
307
 
307
308
  static VALUE
308
- noop_hash_key(struct _ParseInfo *pi, const char *key, size_t klen) {
309
+ noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
309
310
  return Qundef;
310
311
  }
311
312
 
@@ -321,7 +322,7 @@ add_value(ParseInfo pi, VALUE val) {
321
322
  static bool
322
323
  uuid_check(const char *str, int len) {
323
324
  int i;
324
-
325
+
325
326
  for (i = 0; i < 8; i++, str++) {
326
327
  if ('x' != hex_chars[*(uint8_t*)str]) {
327
328
  return false;
@@ -377,7 +378,7 @@ time_parse(const char *s, int len) {
377
378
  long nsecs = 0;
378
379
  int i;
379
380
  time_t secs;
380
-
381
+
381
382
  memset(&tm, 0, sizeof(tm));
382
383
  if ('-' == *s) {
383
384
  s++;
@@ -441,7 +442,7 @@ protect_uri(VALUE rstr) {
441
442
  static VALUE
442
443
  cstr_to_rstr(const char *str, size_t len) {
443
444
  volatile VALUE v = Qnil;
444
-
445
+
445
446
  if (30 == len && '-' == str[4] && '-' == str[7] && 'T' == str[10] && ':' == str[13] && ':' == str[16] && '.' == str[19] && 'Z' == str[29]) {
446
447
  if (Qnil != (v = time_parse(str, (int)len))) {
447
448
  return v;
@@ -516,9 +517,9 @@ hash_set_cstr(ParseInfo pi, Val parent, const char *str, size_t len, const char
516
517
  }
517
518
 
518
519
  static void
519
- hash_set_num(struct _ParseInfo *pi, Val parent, NumInfo ni) {
520
+ hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
520
521
  volatile VALUE rval = Qnil;
521
-
522
+
522
523
  if (ni->infinity || ni->nan) {
523
524
  oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
524
525
  }
@@ -548,7 +549,7 @@ start_array(ParseInfo pi) {
548
549
  static void
549
550
  array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
550
551
  volatile VALUE rval = cstr_to_rstr(str, len);
551
-
552
+
552
553
  rb_ary_push(stack_peek(&pi->stack)->val, rval);
553
554
  if (Yes == pi->options.trace) {
554
555
  oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, rval);
@@ -598,7 +599,7 @@ oj_set_wab_callbacks(ParseInfo pi) {
598
599
 
599
600
  VALUE
600
601
  oj_wab_parse(int argc, VALUE *argv, VALUE self) {
601
- struct _ParseInfo pi;
602
+ struct _parseInfo pi;
602
603
 
603
604
  parse_info_init(&pi);
604
605
  pi.options = oj_default_options;
@@ -615,7 +616,7 @@ oj_wab_parse(int argc, VALUE *argv, VALUE self) {
615
616
 
616
617
  VALUE
617
618
  oj_wab_parse_cstr(int argc, VALUE *argv, char *json, size_t len) {
618
- struct _ParseInfo pi;
619
+ struct _parseInfo pi;
619
620
 
620
621
  parse_info_init(&pi);
621
622
  pi.options = oj_default_options;
@@ -625,4 +626,3 @@ oj_wab_parse_cstr(int argc, VALUE *argv, char *json, size_t len) {
625
626
 
626
627
  return oj_pi_parse(argc, argv, &pi, json, len, true);
627
628
  }
628
-
data/lib/oj.rb CHANGED
@@ -2,14 +2,6 @@
2
2
  module Oj
3
3
  end
4
4
 
5
- begin
6
- # This require exists to get around Rubinius failing to load bigdecimal from
7
- # the C extension.
8
- require 'bigdecimal'
9
- rescue Exception
10
- # ignore
11
- end
12
-
13
5
  require 'oj/version'
14
6
  require 'oj/bag'
15
7
  require 'oj/easy_hash'
data/lib/oj/json.rb CHANGED
@@ -95,7 +95,7 @@ module JSON
95
95
  State = ::JSON::Ext::Generator::State unless defined?(::JSON::State)
96
96
 
97
97
  begin
98
- Object.send(:remove_const, :Parser)
98
+ send(:remove_const, :Parser)
99
99
  rescue
100
100
  end
101
101
  Parser = ::JSON::Ext::Parser unless defined?(::JSON::Parser)
data/lib/oj/mimic.rb CHANGED
@@ -8,6 +8,50 @@ end
8
8
 
9
9
  module Oj
10
10
 
11
+ ##
12
+ # Custom mode can be used to emulate the compat mode with some minor
13
+ # differences. These are the options that setup the custom mode to be like
14
+ # the compat mode.
15
+ CUSTOM_MIMIC_JSON_OPTIONS = {
16
+ allow_gc: true,
17
+ allow_invalid_unicode: false,
18
+ allow_nan: false,
19
+ array_class: nil,
20
+ array_nl: nil,
21
+ auto_define: false,
22
+ bigdecimal_as_decimal: false,
23
+ bigdecimal_load: :auto,
24
+ circular: false,
25
+ class_cache: false,
26
+ create_additions: false,
27
+ create_id: "json_class",
28
+ empty_string: false,
29
+ escape_mode: :unicode_xss,
30
+ float_precision: 0,
31
+ hash_class: nil,
32
+ ignore: nil,
33
+ ignore_under: false,
34
+ indent: 0,
35
+ integer_range: nil,
36
+ mode: :custom,
37
+ nan: :raise,
38
+ nilnil: false,
39
+ object_nl: nil,
40
+ omit_nil: false,
41
+ quirks_mode: true,
42
+ safe: false,
43
+ second_precision: 3,
44
+ space: nil,
45
+ space_before: nil,
46
+ symbol_keys: false,
47
+ time_format: :ruby,
48
+ trace: false,
49
+ use_as_json: false,
50
+ use_raw_json: false,
51
+ use_to_hash: false,
52
+ use_to_json: true,
53
+ }
54
+
11
55
  # A bit hack-ish but does the trick. The JSON.dump_default_options is a Hash
12
56
  # but in mimic we use a C struct to store defaults. This class creates a view
13
57
  # onto that struct.
@@ -31,14 +75,14 @@ module Oj
31
75
  end
32
76
 
33
77
  # Loads mimic-ed JSON paths. Used by Oj.mimic_JSON().
34
- # @param mimic_path [Array] additional paths to add to the Ruby loaded features.
78
+ # @param mimic_paths [Array] additional paths to add to the Ruby loaded features.
35
79
  def self.mimic_loaded(mimic_paths=[])
36
80
  $LOAD_PATH.each do |d|
37
81
  next unless File.exist?(d)
38
82
 
39
83
  jfile = File.join(d, 'json.rb')
40
84
  $LOADED_FEATURES << jfile unless $LOADED_FEATURES.include?(jfile) if File.exist?(jfile)
41
-
85
+
42
86
  Dir.glob(File.join(d, 'json', '**', '*.rb')).each do |file|
43
87
  # allow json/add/xxx to be loaded. User can override with Oj.add_to_json(xxx).
44
88
  $LOADED_FEATURES << file unless $LOADED_FEATURES.include?(file) unless file.include?('add')