oj 3.7.5 → 3.7.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/ext/oj/buf.h +4 -4
  3. data/ext/oj/cache8.c +3 -3
  4. data/ext/oj/cache8.h +4 -4
  5. data/ext/oj/circarray.c +1 -1
  6. data/ext/oj/circarray.h +4 -4
  7. data/ext/oj/code.h +6 -6
  8. data/ext/oj/compat.c +5 -5
  9. data/ext/oj/custom.c +15 -13
  10. data/ext/oj/dump.c +15 -5
  11. data/ext/oj/dump.h +3 -3
  12. data/ext/oj/dump_compat.c +15 -11
  13. data/ext/oj/dump_leaf.c +1 -1
  14. data/ext/oj/dump_object.c +4 -2
  15. data/ext/oj/encode.h +3 -3
  16. data/ext/oj/err.c +1 -1
  17. data/ext/oj/err.h +5 -5
  18. data/ext/oj/fast.c +14 -14
  19. data/ext/oj/hash.c +7 -7
  20. data/ext/oj/hash.h +4 -4
  21. data/ext/oj/hash_test.c +2 -2
  22. data/ext/oj/mimic_json.c +9 -9
  23. data/ext/oj/object.c +3 -3
  24. data/ext/oj/odd.c +12 -8
  25. data/ext/oj/odd.h +5 -5
  26. data/ext/oj/oj.c +14 -12
  27. data/ext/oj/oj.h +23 -23
  28. data/ext/oj/parse.c +3 -3
  29. data/ext/oj/parse.h +26 -26
  30. data/ext/oj/rails.c +27 -23
  31. data/ext/oj/rails.h +3 -3
  32. data/ext/oj/reader.h +5 -5
  33. data/ext/oj/resolve.h +3 -3
  34. data/ext/oj/rxclass.c +5 -5
  35. data/ext/oj/rxclass.h +7 -7
  36. data/ext/oj/saj.c +2 -2
  37. data/ext/oj/scp.c +3 -3
  38. data/ext/oj/sparse.c +4 -4
  39. data/ext/oj/stream_writer.c +1 -1
  40. data/ext/oj/strict.c +6 -6
  41. data/ext/oj/string_writer.c +1 -1
  42. data/ext/oj/trace.h +8 -8
  43. data/ext/oj/val_stack.c +8 -2
  44. data/ext/oj/val_stack.h +9 -9
  45. data/ext/oj/wab.c +11 -7
  46. data/lib/oj/version.rb +1 -1
  47. data/test/bug.rb +51 -0
  48. data/test/bug2.rb +10 -0
  49. data/test/bug3.rb +46 -0
  50. data/test/bug_fast.rb +32 -0
  51. data/test/bug_load.rb +24 -0
  52. data/test/crash.rb +111 -0
  53. data/test/example.rb +11 -0
  54. data/test/foo.rb +4 -29
  55. data/test/io.rb +48 -0
  56. data/test/isolated/test_mimic_rails_datetime.rb +27 -0
  57. data/test/mem.rb +12 -27
  58. data/test/mod.rb +16 -0
  59. data/test/omit.rb +20 -0
  60. data/test/rails.rb +50 -0
  61. data/test/rails_datetime_test.rb +24 -0
  62. data/test/russian.rb +18 -0
  63. data/test/struct.rb +29 -0
  64. data/test/test_serializer.rb +59 -0
  65. data/test/write_timebars.rb +31 -0
  66. data/test/x_test.rb +185 -0
  67. metadata +102 -68
  68. data/test/big.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b79a00294bf924b3e584d91bf719d1b0e74fd567d8b677b394930a7825bda34
4
- data.tar.gz: 402f51a51d76e0f3ac1e6527b0b00a67885bc1c25d246388ab96e0ccf1354e22
3
+ metadata.gz: 7289437b014edb9bb095abd9827815e3bea0efb62b4e5486d0034158c4811c1c
4
+ data.tar.gz: 5d341b6a90bb002d7324f55277010a78236b6338710b58f490e416001167e5fa
5
5
  SHA512:
6
- metadata.gz: aab6be5b3ec6fd7f98323d38c7efe439f309d70b59ab12acfd02fb0290b99b8ba39b7d8ee9a2cd34d9a8a6f2fb69391bcaedb5c680f059df0da840e42f6484bc
7
- data.tar.gz: 9b36cb9b71beaed79b0b5d3ff8f277366b105d7c51a78e93a465824d6a86afffac16c9f719b46dcbc00337130b55bf6ccf4912eea7180c07d86ef48a9fc2419e
6
+ metadata.gz: 8f68b2fb4f0762ce86cdc9a1a56ecd42d377f485fc32d0f36cf1c0ef689eee14f73b76a3b77dd7ecd7c0d6cc3837064cb62ea201e705145af40a18aaa93cdfe8
7
+ data.tar.gz: 6406b48f3439c1340d23e1aea04fc6d781bbd0195012cdff94fbf81e409fd43978606d5fe0b61eca1c7ea635a8af16b1de876df92c3729d4ac96fb4d9951b239
@@ -28,12 +28,12 @@
28
28
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
  */
30
30
 
31
- #ifndef __OJ_BUF_H__
32
- #define __OJ_BUF_H__
31
+ #ifndef OJ_BUF_H
32
+ #define OJ_BUF_H
33
33
 
34
34
  #include "ruby.h"
35
35
 
36
- typedef struct _Buf {
36
+ typedef struct _buf {
37
37
  char *head;
38
38
  char *end;
39
39
  char *tail;
@@ -100,4 +100,4 @@ buf_append(Buf buf, char c) {
100
100
  //*buf->tail = '\0'; // for debugging
101
101
  }
102
102
 
103
- #endif /* __OJ_BUF_H__ */
103
+ #endif /* OJ_BUF_H */
@@ -14,11 +14,11 @@
14
14
  #define DEPTH 16
15
15
 
16
16
  typedef union {
17
- struct _Cache8 *child;
17
+ struct _cache8 *child;
18
18
  slot_t value;
19
19
  } Bucket;
20
20
 
21
- struct _Cache8 {
21
+ struct _cache8 {
22
22
  Bucket buckets[SLOT_CNT];
23
23
  };
24
24
 
@@ -30,7 +30,7 @@ oj_cache8_new(Cache8 *cache) {
30
30
  Bucket *b;
31
31
  int i;
32
32
 
33
- *cache = ALLOC(struct _Cache8);
33
+ *cache = ALLOC(struct _cache8);
34
34
  for (i = SLOT_CNT, b = (*cache)->buckets; 0 < i; i--, b++) {
35
35
  b->value = 0;
36
36
  }
@@ -28,13 +28,13 @@
28
28
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
  */
30
30
 
31
- #ifndef __OJ_CACHE8_H__
32
- #define __OJ_CACHE8_H__
31
+ #ifndef OJ_CACHE8_H
32
+ #define OJ_CACHE8_H
33
33
 
34
34
  #include "ruby.h"
35
35
  #include "stdint.h"
36
36
 
37
- typedef struct _Cache8 *Cache8;
37
+ typedef struct _cache8 *Cache8;
38
38
  typedef uint64_t slot_t;
39
39
  typedef uint64_t sid_t;
40
40
 
@@ -45,4 +45,4 @@ extern slot_t oj_cache8_get(Cache8 cache, sid_t key, slot_t **slot);
45
45
 
46
46
  extern void oj_cache8_print(Cache8 cache);
47
47
 
48
- #endif /* __OJ_CACHE8_H__ */
48
+ #endif /* OJ_CACHE8_H */
@@ -9,7 +9,7 @@ CircArray
9
9
  oj_circ_array_new() {
10
10
  CircArray ca;
11
11
 
12
- if (0 == (ca = ALLOC(struct _CircArray))) {
12
+ if (0 == (ca = ALLOC(struct _circArray))) {
13
13
  rb_raise(rb_eNoMemError, "not enough memory\n");
14
14
  }
15
15
  ca->objs = ca->obj_array;
@@ -3,12 +3,12 @@
3
3
  * All rights reserved.
4
4
  */
5
5
 
6
- #ifndef __OJ_CIRCARRAY_H__
7
- #define __OJ_CIRCARRAY_H__
6
+ #ifndef OJ_CIRCARRAY_H
7
+ #define OJ_CIRCARRAY_H
8
8
 
9
9
  #include "ruby.h"
10
10
 
11
- typedef struct _CircArray {
11
+ typedef struct _circArray {
12
12
  VALUE obj_array[1024];
13
13
  VALUE *objs;
14
14
  unsigned long size; // allocated size or initial array size
@@ -20,4 +20,4 @@ extern void oj_circ_array_free(CircArray ca);
20
20
  extern void oj_circ_array_set(CircArray ca, VALUE obj, unsigned long id);
21
21
  extern VALUE oj_circ_array_get(CircArray ca, unsigned long id);
22
22
 
23
- #endif /* __OJ_CIRCARRAY_H__ */
23
+ #endif /* OJ_CIRCARRAY_H */
@@ -3,8 +3,8 @@
3
3
  * All rights reserved.
4
4
  */
5
5
 
6
- #ifndef __OJ_CODE_H__
7
- #define __OJ_CODE_H__
6
+ #ifndef OJ_CODE_H
7
+ #define OJ_CODE_H
8
8
 
9
9
  #include <ruby.h>
10
10
 
@@ -13,7 +13,7 @@
13
13
  typedef void (*EncodeFunc)(VALUE obj, int depth, Out out);
14
14
  typedef VALUE (*DecodeFunc)(VALUE clas, VALUE args);
15
15
 
16
- typedef struct _Code {
16
+ typedef struct _code {
17
17
  const char *name;
18
18
  VALUE clas;
19
19
  EncodeFunc encode;
@@ -22,7 +22,7 @@ typedef struct _Code {
22
22
  } *Code;
23
23
 
24
24
  // Used by encode functions.
25
- typedef struct _Attr {
25
+ typedef struct _attr {
26
26
  const char *name;
27
27
  int len;
28
28
  VALUE value;
@@ -37,6 +37,6 @@ extern bool oj_code_has(Code codes, VALUE clas, bool encode);
37
37
 
38
38
  extern void oj_code_attrs(VALUE obj, Attr attrs, int depth, Out out, bool with_class);
39
39
 
40
- extern struct _Code oj_compat_codes[];
40
+ extern struct _code oj_compat_codes[];
41
41
 
42
- #endif /* __OJ_CODE_H__ */
42
+ #endif /* OJ_CODE_H */
@@ -78,7 +78,7 @@ start_hash(ParseInfo pi) {
78
78
  }
79
79
 
80
80
  static void
81
- end_hash(struct _ParseInfo *pi) {
81
+ end_hash(struct _parseInfo *pi) {
82
82
  Val parent = stack_peek(&pi->stack);
83
83
 
84
84
  if (0 != parent->classname) {
@@ -144,7 +144,7 @@ add_num(ParseInfo pi, NumInfo ni) {
144
144
  }
145
145
 
146
146
  static void
147
- hash_set_num(struct _ParseInfo *pi, Val parent, NumInfo ni) {
147
+ hash_set_num(struct _parseInfo *pi, Val parent, NumInfo ni) {
148
148
  volatile VALUE rval = oj_num_as_value(ni);
149
149
 
150
150
  if (!oj_use_hash_alt && rb_cHash != rb_obj_class(parent->val)) {
@@ -242,7 +242,7 @@ oj_set_compat_callbacks(ParseInfo pi) {
242
242
 
243
243
  VALUE
244
244
  oj_compat_parse(int argc, VALUE *argv, VALUE self) {
245
- struct _ParseInfo pi;
245
+ struct _parseInfo pi;
246
246
 
247
247
  parse_info_init(&pi);
248
248
  pi.options = oj_default_options;
@@ -263,7 +263,7 @@ oj_compat_parse(int argc, VALUE *argv, VALUE self) {
263
263
 
264
264
  VALUE
265
265
  oj_compat_load(int argc, VALUE *argv, VALUE self) {
266
- struct _ParseInfo pi;
266
+ struct _parseInfo pi;
267
267
 
268
268
  parse_info_init(&pi);
269
269
  pi.options = oj_default_options;
@@ -284,7 +284,7 @@ oj_compat_load(int argc, VALUE *argv, VALUE self) {
284
284
 
285
285
  VALUE
286
286
  oj_compat_parse_cstr(int argc, VALUE *argv, char *json, size_t len) {
287
- struct _ParseInfo pi;
287
+ struct _parseInfo pi;
288
288
 
289
289
  parse_info_init(&pi);
290
290
  pi.options = oj_default_options;
@@ -21,7 +21,7 @@ extern VALUE oj_parse_xml_time(const char *str, int len); // from object.c
21
21
 
22
22
  static void
23
23
  dump_obj_str(VALUE obj, int depth, Out out) {
24
- struct _Attr attrs[] = {
24
+ struct _attr attrs[] = {
25
25
  { "s", 1, Qnil },
26
26
  { NULL, 0, Qnil },
27
27
  };
@@ -55,7 +55,7 @@ static ID imag_id = 0;
55
55
 
56
56
  static void
57
57
  complex_dump(VALUE obj, int depth, Out out) {
58
- struct _Attr attrs[] = {
58
+ struct _attr attrs[] = {
59
59
  { "real", 4, Qnil },
60
60
  { "imag", 4, Qnil },
61
61
  { NULL, 0, Qnil },
@@ -82,7 +82,7 @@ complex_load(VALUE clas, VALUE args) {
82
82
  static void
83
83
  time_dump(VALUE obj, int depth, Out out) {
84
84
  if (Yes == out->opts->create_ok) {
85
- struct _Attr attrs[] = {
85
+ struct _attr attrs[] = {
86
86
  { "time", 4, Qundef, 0, Qundef },
87
87
  { NULL, 0, Qnil },
88
88
  };
@@ -103,7 +103,7 @@ time_dump(VALUE obj, int depth, Out out) {
103
103
  static void
104
104
  date_dump(VALUE obj, int depth, Out out) {
105
105
  if (Yes == out->opts->create_ok) {
106
- struct _Attr attrs[] = {
106
+ struct _attr attrs[] = {
107
107
  { "s", 1, Qnil },
108
108
  { NULL, 0, Qnil },
109
109
  };
@@ -169,7 +169,7 @@ static ID table_id = 0;
169
169
 
170
170
  static void
171
171
  openstruct_dump(VALUE obj, int depth, Out out) {
172
- struct _Attr attrs[] = {
172
+ struct _attr attrs[] = {
173
173
  { "table", 5, Qnil },
174
174
  { NULL, 0, Qnil },
175
175
  };
@@ -191,7 +191,7 @@ openstruct_load(VALUE clas, VALUE args) {
191
191
 
192
192
  static void
193
193
  range_dump(VALUE obj, int depth, Out out) {
194
- struct _Attr attrs[] = {
194
+ struct _attr attrs[] = {
195
195
  { "begin", 5, Qnil },
196
196
  { "end", 3, Qnil },
197
197
  { "exclude", 7, Qnil },
@@ -220,7 +220,7 @@ static ID denominator_id = 0;
220
220
 
221
221
  static void
222
222
  rational_dump(VALUE obj, int depth, Out out) {
223
- struct _Attr attrs[] = {
223
+ struct _attr attrs[] = {
224
224
  { "numerator", 9, Qnil },
225
225
  { "denominator", 11, Qnil },
226
226
  { NULL, 0, Qnil },
@@ -262,7 +262,7 @@ time_load(VALUE clas, VALUE args) {
262
262
  return args;
263
263
  }
264
264
 
265
- static struct _Code codes[] = {
265
+ static struct _code codes[] = {
266
266
  { "BigDecimal", Qnil, bigdecimal_dump, NULL, true },
267
267
  { "Complex", Qnil, complex_dump, complex_load, true },
268
268
  { "Date", Qnil, date_dump, date_load, true },
@@ -459,7 +459,9 @@ dump_odd(VALUE obj, Odd odd, VALUE clas, int depth, Out out) {
459
459
  ID i;
460
460
 
461
461
  if (sizeof(nbuf) <= nlen) {
462
- n2 = strdup(name);
462
+ if (NULL == (n2 = strdup(name))) {
463
+ rb_raise(rb_eNoMemError, "for attribute name.");
464
+ }
463
465
  } else {
464
466
  strcpy(n2, name);
465
467
  }
@@ -997,7 +999,7 @@ hash_set_cstr(ParseInfo pi, Val kval, const char *str, size_t len, const char *o
997
999
  }
998
1000
 
999
1001
  static void
1000
- end_hash(struct _ParseInfo *pi) {
1002
+ end_hash(struct _parseInfo *pi) {
1001
1003
  Val parent = stack_peek(&pi->stack);
1002
1004
 
1003
1005
  if (Qundef != parent->clas && parent->clas != rb_obj_class(parent->val)) {
@@ -1030,7 +1032,7 @@ calc_hash_key(ParseInfo pi, Val parent) {
1030
1032
  }
1031
1033
 
1032
1034
  static void
1033
- hash_set_num(struct _ParseInfo *pi, Val kval, NumInfo ni) {
1035
+ hash_set_num(struct _parseInfo *pi, Val kval, NumInfo ni) {
1034
1036
  Val parent = stack_peek(&pi->stack);
1035
1037
  volatile VALUE rval = oj_num_as_value(ni);
1036
1038
 
@@ -1146,7 +1148,7 @@ oj_set_custom_callbacks(ParseInfo pi) {
1146
1148
 
1147
1149
  VALUE
1148
1150
  oj_custom_parse(int argc, VALUE *argv, VALUE self) {
1149
- struct _ParseInfo pi;
1151
+ struct _parseInfo pi;
1150
1152
 
1151
1153
  parse_info_init(&pi);
1152
1154
  pi.options = oj_default_options;
@@ -1166,7 +1168,7 @@ oj_custom_parse(int argc, VALUE *argv, VALUE self) {
1166
1168
 
1167
1169
  VALUE
1168
1170
  oj_custom_parse_cstr(int argc, VALUE *argv, char *json, size_t len) {
1169
- struct _ParseInfo pi;
1171
+ struct _parseInfo pi;
1170
1172
 
1171
1173
  parse_info_init(&pi);
1172
1174
  pi.options = oj_default_options;
@@ -398,17 +398,23 @@ oj_dump_time(VALUE obj, Out out, int withZone) {
398
398
  long long nsec;
399
399
 
400
400
  #ifdef HAVE_RB_TIME_TIMESPEC
401
- {
401
+ // rb_time_timespec as well as rb_time_timeeval have a bug that causes an
402
+ // exception to be raised if a time is before 1970 on 32 bit systems so
403
+ // check the timespec size and use the ruby calls if a 32 bit system.
404
+ if (16 <= sizeof(struct timespec)) {
402
405
  struct timespec ts = rb_time_timespec(obj);
403
406
 
404
407
  sec = (long long)ts.tv_sec;
405
408
  nsec = ts.tv_nsec;
409
+ } else {
410
+ sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
411
+ nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
406
412
  }
407
413
  #else
408
414
  sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
409
415
  nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
410
416
  #endif
411
-
417
+
412
418
  *b-- = '\0';
413
419
  if (withZone) {
414
420
  long tzsecs = NUM2LONG(rb_funcall2(obj, oj_utc_offset_id, 0, 0));
@@ -497,10 +503,14 @@ oj_dump_xml_time(VALUE obj, Out out) {
497
503
  char tzsign = '+';
498
504
 
499
505
  #ifdef HAVE_RB_TIME_TIMESPEC
500
- {
506
+ if (16 <= sizeof(struct timespec)) {
501
507
  struct timespec ts = rb_time_timespec(obj);
508
+
502
509
  sec = ts.tv_sec;
503
510
  nsec = ts.tv_nsec;
511
+ } else {
512
+ sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
513
+ nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
504
514
  }
505
515
  #else
506
516
  sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
@@ -644,7 +654,7 @@ oj_dump_obj_to_json_using_params(VALUE obj, Options copts, Out out, int argc, VA
644
654
  void
645
655
  oj_write_obj_to_file(VALUE obj, const char *path, Options copts) {
646
656
  char buf[4096];
647
- struct _Out out;
657
+ struct _out out;
648
658
  size_t size;
649
659
  FILE *f;
650
660
  int ok;
@@ -676,7 +686,7 @@ oj_write_obj_to_file(VALUE obj, const char *path, Options copts) {
676
686
  void
677
687
  oj_write_obj_to_stream(VALUE obj, VALUE stream, Options copts) {
678
688
  char buf[4096];
679
- struct _Out out;
689
+ struct _out out;
680
690
  ssize_t size;
681
691
  VALUE clas = rb_obj_class(stream);
682
692
  #if !IS_WINDOWS
@@ -3,8 +3,8 @@
3
3
  * All rights reserved.
4
4
  */
5
5
 
6
- #ifndef __OJ_DUMP_H__
7
- #define __OJ_DUMP_H__
6
+ #ifndef OJ_DUMP_H
7
+ #define OJ_DUMP_H
8
8
 
9
9
  #include <ruby.h>
10
10
 
@@ -91,4 +91,4 @@ dump_ulong(unsigned long num, Out out) {
91
91
  *out->cur = '\0';
92
92
  }
93
93
 
94
- #endif /* __OJ_DUMP_H__ */
94
+ #endif /* OJ_DUMP_H */
@@ -217,7 +217,7 @@ static ID _dump_id = 0;
217
217
 
218
218
  static void
219
219
  bigdecimal_alt(VALUE obj, int depth, Out out) {
220
- struct _Attr attrs[] = {
220
+ struct _attr attrs[] = {
221
221
  { "b", 1, Qnil },
222
222
  { NULL, 0, Qnil },
223
223
  };
@@ -235,7 +235,7 @@ static ID imag_id = 0;
235
235
 
236
236
  static void
237
237
  complex_alt(VALUE obj, int depth, Out out) {
238
- struct _Attr attrs[] = {
238
+ struct _attr attrs[] = {
239
239
  { "r", 1, Qnil },
240
240
  { "i", 1, Qnil },
241
241
  { NULL, 0, Qnil },
@@ -258,7 +258,7 @@ static ID start_id = 0;
258
258
 
259
259
  static void
260
260
  date_alt(VALUE obj, int depth, Out out) {
261
- struct _Attr attrs[] = {
261
+ struct _attr attrs[] = {
262
262
  { "y", 1, Qnil },
263
263
  { "m", 1, Qnil },
264
264
  { "d", 1, Qnil },
@@ -286,7 +286,7 @@ static ID offset_id = 0;
286
286
 
287
287
  static void
288
288
  datetime_alt(VALUE obj, int depth, Out out) {
289
- struct _Attr attrs[] = {
289
+ struct _attr attrs[] = {
290
290
  { "y", 1, Qnil },
291
291
  { "m", 1, Qnil },
292
292
  { "d", 1, Qnil },
@@ -375,7 +375,7 @@ static ID table_id = 0;
375
375
 
376
376
  static void
377
377
  openstruct_alt(VALUE obj, int depth, Out out) {
378
- struct _Attr attrs[] = {
378
+ struct _attr attrs[] = {
379
379
  { "t", 1, Qnil },
380
380
  { NULL, 0, Qnil },
381
381
  };
@@ -425,7 +425,7 @@ static ID denominator_id = 0;
425
425
 
426
426
  static void
427
427
  rational_alt(VALUE obj, int depth, Out out) {
428
- struct _Attr attrs[] = {
428
+ struct _attr attrs[] = {
429
429
  { "n", 1, Qnil },
430
430
  { "d", 1, Qnil },
431
431
  { NULL, 0, Qnil },
@@ -445,7 +445,7 @@ static ID source_id = 0;
445
445
 
446
446
  static void
447
447
  regexp_alt(VALUE obj, int depth, Out out) {
448
- struct _Attr attrs[] = {
448
+ struct _attr attrs[] = {
449
449
  { "o", 1, Qnil },
450
450
  { "s", 1, Qnil },
451
451
  { NULL, 0, Qnil },
@@ -462,7 +462,7 @@ regexp_alt(VALUE obj, int depth, Out out) {
462
462
 
463
463
  static void
464
464
  time_alt(VALUE obj, int depth, Out out) {
465
- struct _Attr attrs[] = {
465
+ struct _attr attrs[] = {
466
466
  { "s", 1, Qundef, 0, Qundef },
467
467
  { "n", 1, Qundef, 0, Qundef },
468
468
  { NULL, 0, Qnil },
@@ -471,10 +471,14 @@ time_alt(VALUE obj, int depth, Out out) {
471
471
  long long nsec;
472
472
 
473
473
  #ifdef HAVE_RB_TIME_TIMESPEC
474
- {
474
+ if (16 <= sizeof(struct timespec)) {
475
475
  struct timespec ts = rb_time_timespec(obj);
476
- sec = ts.tv_sec;
476
+
477
+ sec = (long long)ts.tv_sec;
477
478
  nsec = ts.tv_nsec;
479
+ } else {
480
+ sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
481
+ nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
478
482
  }
479
483
  #else
480
484
  sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
@@ -487,7 +491,7 @@ time_alt(VALUE obj, int depth, Out out) {
487
491
  oj_code_attrs(obj, attrs, depth, out, true);
488
492
  }
489
493
 
490
- struct _Code oj_compat_codes[] = {
494
+ struct _code oj_compat_codes[] = {
491
495
  { "BigDecimal", Qnil, bigdecimal_alt, NULL, false },
492
496
  { "Complex", Qnil, complex_alt, NULL, false },
493
497
  { "Date", Qnil, date_alt, false },