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/dump.h CHANGED
@@ -1,10 +1,7 @@
1
- /* dump.h
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2011 Peter Ohler. All rights reserved.
5
2
 
6
- #ifndef __OJ_DUMP_H__
7
- #define __OJ_DUMP_H__
3
+ #ifndef OJ_DUMP_H
4
+ #define OJ_DUMP_H
8
5
 
9
6
  #include <ruby.h>
10
7
 
@@ -45,6 +42,8 @@ extern void oj_dump_rails_val(VALUE obj, int depth, Out out);
45
42
  extern void oj_dump_custom_val(VALUE obj, int depth, Out out, bool as_ok);
46
43
  extern void oj_dump_wab_val(VALUE obj, int depth, Out out);
47
44
 
45
+ extern void oj_dump_raw_json(VALUE obj, int depth, Out out);
46
+
48
47
  extern VALUE oj_add_to_json(int argc, VALUE *argv, VALUE self);
49
48
  extern VALUE oj_remove_to_json(int argc, VALUE *argv, VALUE self);
50
49
 
@@ -91,4 +90,4 @@ dump_ulong(unsigned long num, Out out) {
91
90
  *out->cur = '\0';
92
91
  }
93
92
 
94
- #endif /* __OJ_DUMP_H__ */
93
+ #endif /* OJ_DUMP_H */
data/ext/oj/dump_compat.c CHANGED
@@ -1,7 +1,4 @@
1
- /* dump_object.c
2
- * Copyright (c) 2012, 2017, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012, 2017 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include "code.h"
7
4
  #include "dump.h"
@@ -64,12 +61,10 @@ dump_values_array(VALUE *values, int depth, Out out) {
64
61
  } else {
65
62
  if (out->opts->dump_opts.use) {
66
63
  size = d2 * out->opts->dump_opts.indent_size + out->opts->dump_opts.array_size + 2;
67
- } else {
68
- size = d2 * out->indent + 3;
69
- }
70
- if (out->opts->dump_opts.use) {
71
64
  size += out->opts->dump_opts.array_size;
72
65
  size += out->opts->dump_opts.indent_size;
66
+ } else {
67
+ size = d2 * out->indent + 3;
73
68
  }
74
69
  for (; Qundef != *values; values++) {
75
70
  assure_size(out, size);
@@ -80,6 +75,7 @@ dump_values_array(VALUE *values, int depth, Out out) {
80
75
  }
81
76
  if (0 < out->opts->dump_opts.indent_size) {
82
77
  int i;
78
+
83
79
  for (i = d2; 0 < i; i--) {
84
80
  strcpy(out->cur, out->opts->dump_opts.indent_str);
85
81
  out->cur += out->opts->dump_opts.indent_size;
@@ -155,7 +151,7 @@ dump_array(VALUE a, int depth, Out out, bool as_ok) {
155
151
  if (as_ok && !oj_use_hash_alt && rb_obj_class(a) != rb_cArray && rb_respond_to(a, oj_to_json_id)) {
156
152
  dump_to_json(a, out);
157
153
  return;
158
- }
154
+ }
159
155
  cnt = (int)RARRAY_LEN(a);
160
156
  *out->cur++ = '[';
161
157
  assure_size(out, 2);
@@ -190,9 +186,9 @@ dump_array(VALUE a, int depth, Out out, bool as_ok) {
190
186
  *out->cur++ = ',';
191
187
  }
192
188
  }
193
- size = depth * out->indent + 1;
194
- assure_size(out, size);
195
189
  if (out->opts->dump_opts.use) {
190
+ size = out->opts->dump_opts.array_size + out->opts->dump_opts.indent_size * depth + 1;
191
+ assure_size(out, size);
196
192
  if (0 < out->opts->dump_opts.array_size) {
197
193
  strcpy(out->cur, out->opts->dump_opts.array_nl);
198
194
  out->cur += out->opts->dump_opts.array_size;
@@ -206,6 +202,8 @@ dump_array(VALUE a, int depth, Out out, bool as_ok) {
206
202
  }
207
203
  }
208
204
  } else {
205
+ size = depth * out->indent + 1;
206
+ assure_size(out, size);
209
207
  fill_indent(out, depth);
210
208
  }
211
209
  *out->cur++ = ']';
@@ -217,7 +215,7 @@ static ID _dump_id = 0;
217
215
 
218
216
  static void
219
217
  bigdecimal_alt(VALUE obj, int depth, Out out) {
220
- struct _Attr attrs[] = {
218
+ struct _attr attrs[] = {
221
219
  { "b", 1, Qnil },
222
220
  { NULL, 0, Qnil },
223
221
  };
@@ -235,7 +233,7 @@ static ID imag_id = 0;
235
233
 
236
234
  static void
237
235
  complex_alt(VALUE obj, int depth, Out out) {
238
- struct _Attr attrs[] = {
236
+ struct _attr attrs[] = {
239
237
  { "r", 1, Qnil },
240
238
  { "i", 1, Qnil },
241
239
  { NULL, 0, Qnil },
@@ -258,7 +256,7 @@ static ID start_id = 0;
258
256
 
259
257
  static void
260
258
  date_alt(VALUE obj, int depth, Out out) {
261
- struct _Attr attrs[] = {
259
+ struct _attr attrs[] = {
262
260
  { "y", 1, Qnil },
263
261
  { "m", 1, Qnil },
264
262
  { "d", 1, Qnil },
@@ -286,7 +284,7 @@ static ID offset_id = 0;
286
284
 
287
285
  static void
288
286
  datetime_alt(VALUE obj, int depth, Out out) {
289
- struct _Attr attrs[] = {
287
+ struct _attr attrs[] = {
290
288
  { "y", 1, Qnil },
291
289
  { "m", 1, Qnil },
292
290
  { "d", 1, Qnil },
@@ -375,7 +373,7 @@ static ID table_id = 0;
375
373
 
376
374
  static void
377
375
  openstruct_alt(VALUE obj, int depth, Out out) {
378
- struct _Attr attrs[] = {
376
+ struct _attr attrs[] = {
379
377
  { "t", 1, Qnil },
380
378
  { NULL, 0, Qnil },
381
379
  };
@@ -425,7 +423,7 @@ static ID denominator_id = 0;
425
423
 
426
424
  static void
427
425
  rational_alt(VALUE obj, int depth, Out out) {
428
- struct _Attr attrs[] = {
426
+ struct _attr attrs[] = {
429
427
  { "n", 1, Qnil },
430
428
  { "d", 1, Qnil },
431
429
  { NULL, 0, Qnil },
@@ -445,7 +443,7 @@ static ID source_id = 0;
445
443
 
446
444
  static void
447
445
  regexp_alt(VALUE obj, int depth, Out out) {
448
- struct _Attr attrs[] = {
446
+ struct _attr attrs[] = {
449
447
  { "o", 1, Qnil },
450
448
  { "s", 1, Qnil },
451
449
  { NULL, 0, Qnil },
@@ -462,7 +460,7 @@ regexp_alt(VALUE obj, int depth, Out out) {
462
460
 
463
461
  static void
464
462
  time_alt(VALUE obj, int depth, Out out) {
465
- struct _Attr attrs[] = {
463
+ struct _attr attrs[] = {
466
464
  { "s", 1, Qundef, 0, Qundef },
467
465
  { "n", 1, Qundef, 0, Qundef },
468
466
  { NULL, 0, Qnil },
@@ -471,10 +469,14 @@ time_alt(VALUE obj, int depth, Out out) {
471
469
  long long nsec;
472
470
 
473
471
  #ifdef HAVE_RB_TIME_TIMESPEC
474
- {
472
+ if (16 <= sizeof(struct timespec)) {
475
473
  struct timespec ts = rb_time_timespec(obj);
476
- sec = ts.tv_sec;
474
+
475
+ sec = (long long)ts.tv_sec;
477
476
  nsec = ts.tv_nsec;
477
+ } else {
478
+ sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
479
+ nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
478
480
  }
479
481
  #else
480
482
  sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
@@ -487,7 +489,7 @@ time_alt(VALUE obj, int depth, Out out) {
487
489
  oj_code_attrs(obj, attrs, depth, out, true);
488
490
  }
489
491
 
490
- struct _Code oj_compat_codes[] = {
492
+ struct _code oj_compat_codes[] = {
491
493
  { "BigDecimal", Qnil, bigdecimal_alt, NULL, false },
492
494
  { "Complex", Qnil, complex_alt, NULL, false },
493
495
  { "Date", Qnil, date_alt, false },
@@ -643,7 +645,8 @@ dump_float(VALUE obj, int depth, Out out, bool as_ok) {
643
645
  }
644
646
 
645
647
  static int
646
- hash_cb(VALUE key, VALUE value, Out out) {
648
+ hash_cb(VALUE key, VALUE value, VALUE ov) {
649
+ Out out = (Out)ov;
647
650
  int depth = out->depth;
648
651
 
649
652
  if (out->omit_nil && Qnil == value) {
@@ -711,7 +714,7 @@ dump_hash(VALUE obj, int depth, Out out, bool as_ok) {
711
714
  if (as_ok && !oj_use_hash_alt && rb_obj_class(obj) != rb_cHash && rb_respond_to(obj, oj_to_json_id)) {
712
715
  dump_to_json(obj, out);
713
716
  return;
714
- }
717
+ }
715
718
  cnt = (int)RHASH_SIZE(obj);
716
719
  assure_size(out, 2);
717
720
  if (0 == cnt) {
@@ -758,9 +761,12 @@ dump_obj(VALUE obj, int depth, Out out, bool as_ok) {
758
761
  exception_alt(obj, depth, out);
759
762
  return;
760
763
  }
764
+ if (Yes == out->opts->raw_json && rb_respond_to(obj, oj_raw_json_id)) {
765
+ oj_dump_raw_json(obj, depth, out);
766
+ return;
767
+ }
761
768
  if (as_ok && rb_respond_to(obj, oj_to_json_id)) {
762
769
  dump_to_json(obj, out);
763
-
764
770
  return;
765
771
  }
766
772
  // Nothing else matched so encode as a JSON object with Ruby obj members
@@ -862,7 +868,7 @@ dump_bignum(VALUE obj, int depth, Out out, bool as_ok) {
862
868
  // this must use to_s to pass the json gem unit tests.
863
869
  volatile VALUE rs;
864
870
  int cnt;
865
- bool dump_as_string = false;
871
+ bool dump_as_string = false;
866
872
 
867
873
  if (use_bignum_alt) {
868
874
  rs = rb_big2str(obj, 10);
@@ -872,21 +878,18 @@ dump_bignum(VALUE obj, int depth, Out out, bool as_ok) {
872
878
  rb_check_type(rs, T_STRING);
873
879
  cnt = (int)RSTRING_LEN(rs);
874
880
 
875
- if (out->opts->integer_range_min != 0 || out->opts->integer_range_max != 0) {
881
+ if (out->opts->int_range_min != 0 || out->opts->int_range_max != 0) {
876
882
  dump_as_string = true; // Bignum cannot be inside of Fixnum range
877
883
  assure_size(out, cnt + 2);
878
884
  *out->cur++ = '"';
879
- } else {
885
+ } else {
880
886
  assure_size(out, cnt);
881
- }
882
-
887
+ }
883
888
  memcpy(out->cur, rb_string_value_ptr((VALUE*)&rs), cnt);
884
889
  out->cur += cnt;
885
-
886
- if(dump_as_string) {
890
+ if (dump_as_string) {
887
891
  *out->cur++ = '"';
888
- }
889
-
892
+ }
890
893
  *out->cur = '\0';
891
894
  }
892
895
 
data/ext/oj/dump_leaf.c CHANGED
@@ -1,7 +1,4 @@
1
- /* dump_leaf.c
2
- * Copyright (c) 2012, 2017, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012, 2017 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include <errno.h>
7
4
 
@@ -15,7 +12,7 @@ grow(Out out, size_t len) {
15
12
  size_t size = out->end - out->buf;
16
13
  long pos = out->cur - out->buf;
17
14
  char *buf;
18
-
15
+
19
16
  size *= 2;
20
17
  if (size <= len * 2 + pos) {
21
18
  size += len;
@@ -227,7 +224,7 @@ oj_dump_leaf_to_json(Leaf leaf, Options copts, Out out) {
227
224
  void
228
225
  oj_write_leaf_to_file(Leaf leaf, const char *path, Options copts) {
229
226
  char buf[4096];
230
- struct _Out out;
227
+ struct _out out;
231
228
  size_t size;
232
229
  FILE *f;
233
230
 
data/ext/oj/dump_object.c CHANGED
@@ -1,7 +1,4 @@
1
- /* dump_object.c
2
- * Copyright (c) 2012, 2017, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012, 2017 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include "dump.h"
7
4
  #include "odd.h"
@@ -56,7 +53,7 @@ dump_data(VALUE obj, int depth, Out out, bool as_ok) {
56
53
  }
57
54
  } else {
58
55
  long id = oj_check_circular(obj, out);
59
-
56
+
60
57
  if (0 <= id) {
61
58
  dump_obj_attrs(obj, clas, id, depth, out);
62
59
  }
@@ -72,7 +69,7 @@ dump_obj(VALUE obj, int depth, Out out, bool as_ok) {
72
69
  volatile VALUE rstr = rb_funcall(obj, oj_to_s_id, 0);
73
70
  const char *str = rb_string_value_ptr((VALUE*)&rstr);
74
71
  int len = (int)RSTRING_LEN(rstr);
75
-
72
+
76
73
  if (0 == strcasecmp("Infinity", str)) {
77
74
  str = oj_nan_str(obj, out->opts->dump_opts.nan_dump, out->opts->mode, true, &len);
78
75
  oj_dump_raw(str, len, out);
@@ -224,7 +221,8 @@ dump_sym(VALUE obj, int depth, Out out, bool as_ok) {
224
221
  }
225
222
 
226
223
  static int
227
- hash_cb(VALUE key, VALUE value, Out out) {
224
+ hash_cb(VALUE key, VALUE value, VALUE ov) {
225
+ Out out = (Out)ov;
228
226
  int depth = out->depth;
229
227
  long size = depth * out->indent + 1;
230
228
 
@@ -280,7 +278,7 @@ hash_cb(VALUE key, VALUE value, Out out) {
280
278
  }
281
279
  out->depth = depth;
282
280
  *out->cur++ = ',';
283
-
281
+
284
282
  return ST_CONTINUE;
285
283
  }
286
284
 
@@ -348,7 +346,8 @@ dump_hash_class(VALUE obj, VALUE clas, int depth, Out out) {
348
346
 
349
347
  #ifdef HAVE_RB_IVAR_FOREACH
350
348
  static int
351
- dump_attr_cb(ID key, VALUE value, Out out) {
349
+ dump_attr_cb(ID key, VALUE value, VALUE ov) {
350
+ Out out = (Out)ov;
352
351
  int depth = out->depth;
353
352
  size_t size = depth * out->indent + 1;
354
353
  const char *attr = rb_id2name(key);
@@ -363,6 +362,8 @@ dump_attr_cb(ID key, VALUE value, Out out) {
363
362
  // the key name is NULL. Not an empty string but NULL.
364
363
  if (NULL == attr) {
365
364
  attr = "";
365
+ } else if (Yes == out->opts->ignore_under && '@' == *attr && '_' == attr[1]) {
366
+ return ST_CONTINUE;
366
367
  }
367
368
  if (0 == strcmp("bt", attr) || 0 == strcmp("mesg", attr)) {
368
369
  return ST_CONTINUE;
@@ -384,7 +385,7 @@ dump_attr_cb(ID key, VALUE value, Out out) {
384
385
  oj_dump_obj_val(value, depth, out);
385
386
  out->depth = depth;
386
387
  *out->cur++ = ',';
387
-
388
+
388
389
  return ST_CONTINUE;
389
390
  }
390
391
  #endif
@@ -423,8 +424,8 @@ dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
423
424
  if (odd->raw) {
424
425
  v = rb_funcall(obj, *odd->attrs, 0);
425
426
  if (Qundef == v || T_STRING != rb_type(v)) {
426
- rb_raise(rb_eEncodingError, "Invalid type for raw JSON.\n");
427
- } else {
427
+ rb_raise(rb_eEncodingError, "Invalid type for raw JSON.");
428
+ } else {
428
429
  const char *s = rb_string_value_ptr((VALUE*)&v);
429
430
  int len = (int)RSTRING_LEN(v);
430
431
  const char *name = rb_id2name(*odd->attrs);
@@ -460,9 +461,11 @@ dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
460
461
  char *n;
461
462
  char *end;
462
463
  ID i;
463
-
464
+
464
465
  if (sizeof(nbuf) <= nlen) {
465
- n2 = strdup(name);
466
+ if (NULL == (n2 = strdup(name))) {
467
+ rb_raise(rb_eNoMemError, "for attribute name.");
468
+ }
466
469
  } else {
467
470
  strcpy(n2, name);
468
471
  }
@@ -608,9 +611,12 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
608
611
  size = d2 * out->indent + 1;
609
612
  for (i = cnt; 0 < i; i--, np++) {
610
613
  VALUE value;
611
-
614
+
612
615
  vid = rb_to_id(*np);
613
616
  attr = rb_id2name(vid);
617
+ if (Yes == out->opts->ignore_under && '@' == *attr && '_' == attr[1]) {
618
+ continue;
619
+ }
614
620
  value = rb_ivar_get(obj, vid);
615
621
 
616
622
  if (oj_dump_ignore(out->opts, value)) {
@@ -737,7 +743,7 @@ dump_struct(VALUE obj, int depth, Out out, bool as_ok) {
737
743
  #else // RSTRUCT_LEN_RETURNS_INTEGER_OBJECT
738
744
  cnt = (int)RSTRUCT_LEN(obj);
739
745
  #endif // RSTRUCT_LEN_RETURNS_INTEGER_OBJECT
740
-
746
+
741
747
  for (i = 0; i < cnt; i++) {
742
748
  v = RSTRUCT_GET(obj, i);
743
749
  if (oj_dump_ignore(out->opts, v)) {
@@ -810,7 +816,7 @@ static DumpFunc obj_funcs[] = {
810
816
  void
811
817
  oj_dump_obj_val(VALUE obj, int depth, Out out) {
812
818
  int type = rb_type(obj);
813
-
819
+
814
820
  if (Yes == out->opts->trace) {
815
821
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceIn);
816
822
  }
data/ext/oj/dump_strict.c CHANGED
@@ -1,7 +1,4 @@
1
- /* dump_strict.c
2
- * Copyright (c) 2012, 2017, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012, 2017 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include <stdlib.h>
7
4
  #include <time.h>
@@ -45,7 +42,7 @@ dump_float(VALUE obj, int depth, Out out, bool as_ok) {
45
42
  cnt = 3;
46
43
  } else {
47
44
  NanDump nd = out->opts->dump_opts.nan_dump;
48
-
45
+
49
46
  if (AutoNan == nd) {
50
47
  nd = RaiseNan;
51
48
  }
@@ -195,11 +192,12 @@ dump_array(VALUE a, int depth, Out out, bool as_ok) {
195
192
  }
196
193
 
197
194
  static int
198
- hash_cb(VALUE key, VALUE value, Out out) {
195
+ hash_cb(VALUE key, VALUE value, VALUE ov) {
196
+ Out out = (Out)ov;
199
197
  int depth = out->depth;
200
198
  long size;
201
199
  int rtype = rb_type(key);
202
-
200
+
203
201
  if (rtype != T_STRING && rtype != T_SYMBOL) {
204
202
  rb_raise(rb_eTypeError, "In :strict and :null mode all Hash keys must be Strings or Symbols, not %s.\n", rb_class2name(rb_obj_class(key)));
205
203
  }
@@ -359,7 +357,7 @@ static DumpFunc strict_funcs[] = {
359
357
  void
360
358
  oj_dump_strict_val(VALUE obj, int depth, Out out) {
361
359
  int type = rb_type(obj);
362
-
360
+
363
361
  if (Yes == out->opts->trace) {
364
362
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceIn);
365
363
  }
@@ -408,7 +406,7 @@ static DumpFunc null_funcs[] = {
408
406
  void
409
407
  oj_dump_null_val(VALUE obj, int depth, Out out) {
410
408
  int type = rb_type(obj);
411
-
409
+
412
410
  if (Yes == out->opts->trace) {
413
411
  oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceOut);
414
412
  }