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/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
  }