oj 3.7.4 → 3.11.2

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