oj 3.7.5 → 3.7.6

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 (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
@@ -14,8 +14,8 @@
14
14
 
15
15
  #include "rxclass.h"
16
16
 
17
- typedef struct _RxC {
18
- struct _RxC *next;
17
+ typedef struct _rxC {
18
+ struct _rxC *next;
19
19
  VALUE rrx;
20
20
  #if !IS_WINDOWS
21
21
  regex_t rx;
@@ -48,9 +48,9 @@ oj_rxclass_cleanup(RxClass rc) {
48
48
 
49
49
  void
50
50
  oj_rxclass_rappend(RxClass rc, VALUE rx, VALUE clas) {
51
- RxC rxc = ALLOC_N(struct _RxC, 1);
51
+ RxC rxc = ALLOC_N(struct _rxC, 1);
52
52
 
53
- memset(rxc, 0, sizeof(struct _RxC));
53
+ memset(rxc, 0, sizeof(struct _rxC));
54
54
  rxc->rrx = rx;
55
55
  rxc->clas = clas;
56
56
  if (NULL == rc->tail) {
@@ -73,7 +73,7 @@ oj_rxclass_append(RxClass rc, const char *expr, VALUE clas) {
73
73
  snprintf(rc->err, sizeof(rc->err), "expressions must be less than %lu characters", (unsigned long)sizeof(rxc->src));
74
74
  return EINVAL;
75
75
  }
76
- rxc = ALLOC_N(struct _RxC, 1);
76
+ rxc = ALLOC_N(struct _rxC, 1);
77
77
  rxc->next = 0;
78
78
  rxc->clas = clas;
79
79
 
@@ -3,17 +3,17 @@
3
3
  * All rights reserved.
4
4
  */
5
5
 
6
- #ifndef __OJ_RXCLASS_H__
7
- #define __OJ_RXCLASS_H__
6
+ #ifndef OJ_RXCLASS_H
7
+ #define OJ_RXCLASS_H
8
8
 
9
9
  #include <stdbool.h>
10
10
  #include "ruby.h"
11
11
 
12
- struct _RxC;
12
+ struct _rxC;
13
13
 
14
- typedef struct _RxClass {
15
- struct _RxC *head;
16
- struct _RxC *tail;
14
+ typedef struct _rxClass {
15
+ struct _rxC *head;
16
+ struct _rxC *tail;
17
17
  char err[128];
18
18
  } *RxClass;
19
19
 
@@ -24,4 +24,4 @@ extern VALUE oj_rxclass_match(RxClass rc, const char *str, int len);
24
24
  extern void oj_rxclass_copy(RxClass src, RxClass dest);
25
25
  extern void oj_rxclass_rappend(RxClass rc, VALUE rx, VALUE clas);
26
26
 
27
- #endif /* __OJ_RXCLASS_H__ */
27
+ #endif /* OJ_RXCLASS_H */
@@ -19,7 +19,7 @@
19
19
  #include "oj.h"
20
20
  #include "encode.h"
21
21
 
22
- typedef struct _ParseInfo {
22
+ typedef struct _parseInfo {
23
23
  char *str; /* buffer being read from */
24
24
  char *s; /* current position in buffer */
25
25
  void *stack_min;
@@ -605,7 +605,7 @@ read_quoted_value(ParseInfo pi) {
605
605
  static void
606
606
  saj_parse(VALUE handler, char *json) {
607
607
  volatile VALUE obj = Qnil;
608
- struct _ParseInfo pi;
608
+ struct _parseInfo pi;
609
609
 
610
610
  if (0 == json) {
611
611
  if (pi.has_error) {
@@ -36,7 +36,7 @@ noop_add_num(ParseInfo pi, NumInfo ni) {
36
36
  }
37
37
 
38
38
  static VALUE
39
- noop_hash_key(struct _ParseInfo *pi, const char *key, size_t klen) {
39
+ noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
40
40
  return Qundef;
41
41
  }
42
42
 
@@ -117,7 +117,7 @@ calc_hash_key(ParseInfo pi, Val kval) {
117
117
  }
118
118
 
119
119
  static VALUE
120
- hash_key(struct _ParseInfo *pi, const char *key, size_t klen) {
120
+ hash_key(ParseInfo pi, const char *key, size_t klen) {
121
121
  return rb_funcall(pi->handler, oj_hash_key_id, 1, rb_str_new(key, klen));
122
122
  }
123
123
 
@@ -159,7 +159,7 @@ array_append_value(ParseInfo pi, VALUE value) {
159
159
 
160
160
  VALUE
161
161
  oj_sc_parse(int argc, VALUE *argv, VALUE self) {
162
- struct _ParseInfo pi;
162
+ struct _parseInfo pi;
163
163
  VALUE input = argv[1];
164
164
 
165
165
  parse_info_init(&pi);
@@ -203,7 +203,7 @@ unicode_to_chars(ParseInfo pi, Buf buf, uint32_t code) {
203
203
  // entered at backslash
204
204
  static void
205
205
  read_escaped_str(ParseInfo pi) {
206
- struct _Buf buf;
206
+ struct _buf buf;
207
207
  char c;
208
208
  uint32_t code;
209
209
  Val parent = stack_peek(&pi->stack);
@@ -393,7 +393,7 @@ read_str(ParseInfo pi) {
393
393
 
394
394
  static void
395
395
  read_num(ParseInfo pi) {
396
- struct _NumInfo ni;
396
+ struct _numInfo ni;
397
397
  char c;
398
398
 
399
399
  reader_protect(&pi->rd);
@@ -525,7 +525,7 @@ read_num(ParseInfo pi) {
525
525
 
526
526
  static void
527
527
  read_nan(ParseInfo pi) {
528
- struct _NumInfo ni;
528
+ struct _numInfo ni;
529
529
  char c;
530
530
 
531
531
  ni.str = pi->rd.str;
@@ -718,7 +718,7 @@ oj_sparse2(ParseInfo pi) {
718
718
  return;
719
719
  }
720
720
  } else if ('a' == c) {
721
- struct _NumInfo ni;
721
+ struct _numInfo ni;
722
722
 
723
723
  c = reader_get(&pi->rd);
724
724
  if ('N' != c && 'n' != c) {
@@ -94,7 +94,7 @@ stream_writer_new(int argc, VALUE *argv, VALUE self) {
94
94
  } else {
95
95
  rb_raise(rb_eArgError, "expected an IO Object.");
96
96
  }
97
- sw = ALLOC(struct _StreamWriter);
97
+ sw = ALLOC(struct _streamWriter);
98
98
  if (2 == argc && T_HASH == rb_type(argv[1])) {
99
99
  volatile VALUE v;
100
100
  int buf_size = 0;
@@ -15,21 +15,21 @@
15
15
  #include "trace.h"
16
16
 
17
17
  static void
18
- hash_end(struct _ParseInfo *pi) {
18
+ hash_end(ParseInfo pi) {
19
19
  if (Yes == pi->options.trace) {
20
20
  oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
21
21
  }
22
22
  }
23
23
 
24
24
  static void
25
- array_end(struct _ParseInfo *pi) {
25
+ array_end(ParseInfo pi) {
26
26
  if (Yes == pi->options.trace) {
27
27
  oj_trace_parse_array_end(pi, __FILE__, __LINE__);
28
28
  }
29
29
  }
30
30
 
31
31
  static VALUE
32
- noop_hash_key(struct _ParseInfo *pi, const char *key, size_t klen) {
32
+ noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
33
33
  return Qundef;
34
34
  }
35
35
 
@@ -100,7 +100,7 @@ hash_set_cstr(ParseInfo pi, Val parent, const char *str, size_t len, const char
100
100
  }
101
101
 
102
102
  static void
103
- hash_set_num(struct _ParseInfo *pi, Val parent, NumInfo ni) {
103
+ hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
104
104
  volatile VALUE v;
105
105
 
106
106
  if (ni->infinity || ni->nan) {
@@ -183,7 +183,7 @@ oj_set_strict_callbacks(ParseInfo pi) {
183
183
 
184
184
  VALUE
185
185
  oj_strict_parse(int argc, VALUE *argv, VALUE self) {
186
- struct _ParseInfo pi;
186
+ struct _parseInfo pi;
187
187
 
188
188
  parse_info_init(&pi);
189
189
  pi.options = oj_default_options;
@@ -200,7 +200,7 @@ oj_strict_parse(int argc, VALUE *argv, VALUE self) {
200
200
 
201
201
  VALUE
202
202
  oj_strict_parse_cstr(int argc, VALUE *argv, char *json, size_t len) {
203
- struct _ParseInfo pi;
203
+ struct _parseInfo pi;
204
204
 
205
205
  parse_info_init(&pi);
206
206
  pi.options = oj_default_options;
@@ -272,7 +272,7 @@ str_writer_free(void *ptr) {
272
272
  */
273
273
  static VALUE
274
274
  str_writer_new(int argc, VALUE *argv, VALUE self) {
275
- StrWriter sw = ALLOC(struct _StrWriter);
275
+ StrWriter sw = ALLOC(struct _strWriter);
276
276
 
277
277
  oj_str_writer_init(sw, 0);
278
278
  if (1 == argc) {
@@ -3,8 +3,8 @@
3
3
  * All rights reserved.
4
4
  */
5
5
 
6
- #ifndef __OJ_TRACE_H__
7
- #define __OJ_TRACE_H__
6
+ #ifndef OJ_TRACE_H
7
+ #define OJ_TRACE_H
8
8
 
9
9
  #include <stdbool.h>
10
10
  #include <ruby.h>
@@ -17,12 +17,12 @@ typedef enum {
17
17
  TraceRubyOut = '<',
18
18
  } TraceWhere;
19
19
 
20
- struct _ParseInfo;
20
+ struct _parseInfo;
21
21
 
22
22
  extern void oj_trace(const char *func, VALUE obj, const char *file, int line, int depth, TraceWhere where);
23
- extern void oj_trace_parse_in(const char *func, struct _ParseInfo *pi, const char *file, int line);
24
- extern void oj_trace_parse_call(const char *func, struct _ParseInfo *pi, const char *file, int line, VALUE obj);
25
- extern void oj_trace_parse_hash_end(struct _ParseInfo *pi, const char *file, int line);
26
- extern void oj_trace_parse_array_end(struct _ParseInfo *pi, const char *file, int line);
23
+ extern void oj_trace_parse_in(const char *func, struct _parseInfo *pi, const char *file, int line);
24
+ extern void oj_trace_parse_call(const char *func, struct _parseInfo *pi, const char *file, int line, VALUE obj);
25
+ extern void oj_trace_parse_hash_end(struct _parseInfo *pi, const char *file, int line);
26
+ extern void oj_trace_parse_array_end(struct _parseInfo *pi, const char *file, int line);
27
27
 
28
- #endif /* __OJ_TRACE_H__ */
28
+ #endif /* OJ_TRACE_H */
@@ -28,6 +28,8 @@
28
28
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
  */
30
30
 
31
+ #include <string.h>
32
+
31
33
  #include "oj.h"
32
34
  #include "val_stack.h"
33
35
 
@@ -63,12 +65,16 @@ mark(void *ptr) {
63
65
  VALUE
64
66
  oj_stack_init(ValStack stack) {
65
67
  #if HAVE_LIBPTHREAD
66
- pthread_mutex_init(&stack->mutex, 0);
68
+ int err;
69
+
70
+ if (0 != (err = pthread_mutex_init(&stack->mutex, 0))) {
71
+ rb_raise(rb_eException, "failed to initialize a mutex. %s", strerror(err));
72
+ }
67
73
  #else
68
74
  stack->mutex = rb_mutex_new();
69
75
  #endif
70
76
  stack->head = stack->base;
71
- stack->end = stack->base + sizeof(stack->base) / sizeof(struct _Val);
77
+ stack->end = stack->base + sizeof(stack->base) / sizeof(struct _val);
72
78
  stack->tail = stack->head;
73
79
  stack->head->val = Qundef;
74
80
  stack->head->key = 0;
@@ -28,8 +28,8 @@
28
28
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
  */
30
30
 
31
- #ifndef __OJ_VAL_STACK_H__
32
- #define __OJ_VAL_STACK_H__
31
+ #ifndef OJ_VAL_STACK_H
32
+ #define OJ_VAL_STACK_H
33
33
 
34
34
  #include "ruby.h"
35
35
  #include "odd.h"
@@ -52,7 +52,7 @@ typedef enum {
52
52
  NEXT_HASH_COMMA = 'n',
53
53
  } ValNext;
54
54
 
55
- typedef struct _Val {
55
+ typedef struct _val {
56
56
  volatile VALUE val;
57
57
  const char *key;
58
58
  char karray[32];
@@ -71,8 +71,8 @@ typedef struct _Val {
71
71
  char kalloc;
72
72
  } *Val;
73
73
 
74
- typedef struct _ValStack {
75
- struct _Val base[STACK_INC];
74
+ typedef struct _valStack {
75
+ struct _val base[STACK_INC];
76
76
  Val head; // current stack
77
77
  Val end; // stack end
78
78
  Val tail; // pointer to one past last element name on stack
@@ -109,10 +109,10 @@ stack_push(ValStack stack, VALUE val, ValNext next) {
109
109
  // A realloc can trigger a GC so make sure it happens outside the lock
110
110
  // but lock before changing pointers.
111
111
  if (stack->base == stack->head) {
112
- head = ALLOC_N(struct _Val, len + STACK_INC);
113
- memcpy(head, stack->base, sizeof(struct _Val) * len);
112
+ head = ALLOC_N(struct _val, len + STACK_INC);
113
+ memcpy(head, stack->base, sizeof(struct _val) * len);
114
114
  } else {
115
- REALLOC_N(head, struct _Val, len + STACK_INC);
115
+ REALLOC_N(head, struct _val, len + STACK_INC);
116
116
  }
117
117
  #if HAVE_LIBPTHREAD
118
118
  pthread_mutex_lock(&stack->mutex);
@@ -185,4 +185,4 @@ stack_pop(ValStack stack) {
185
185
 
186
186
  extern const char* oj_stack_next_string(ValNext n);
187
187
 
188
- #endif /* __OJ_VAL_STACK_H__ */
188
+ #endif /* OJ_VAL_STACK_H */
@@ -200,10 +200,14 @@ dump_time(VALUE obj, Out out) {
200
200
  long long nsec;
201
201
 
202
202
  #ifdef HAVE_RB_TIME_TIMESPEC
203
- {
203
+ if (16 <= sizeof(struct timespec)) {
204
204
  struct timespec ts = rb_time_timespec(obj);
205
+
205
206
  sec = ts.tv_sec;
206
207
  nsec = ts.tv_nsec;
208
+ } else {
209
+ sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
210
+ nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
207
211
  }
208
212
  #else
209
213
  sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
@@ -291,21 +295,21 @@ oj_dump_wab_val(VALUE obj, int depth, Out out) {
291
295
  ///// load functions /////
292
296
 
293
297
  static void
294
- hash_end(struct _ParseInfo *pi) {
298
+ hash_end(ParseInfo pi) {
295
299
  if (Yes == pi->options.trace) {
296
300
  oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
297
301
  }
298
302
  }
299
303
 
300
304
  static void
301
- array_end(struct _ParseInfo *pi) {
305
+ array_end(ParseInfo pi) {
302
306
  if (Yes == pi->options.trace) {
303
307
  oj_trace_parse_array_end(pi, __FILE__, __LINE__);
304
308
  }
305
309
  }
306
310
 
307
311
  static VALUE
308
- noop_hash_key(struct _ParseInfo *pi, const char *key, size_t klen) {
312
+ noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
309
313
  return Qundef;
310
314
  }
311
315
 
@@ -516,7 +520,7 @@ hash_set_cstr(ParseInfo pi, Val parent, const char *str, size_t len, const char
516
520
  }
517
521
 
518
522
  static void
519
- hash_set_num(struct _ParseInfo *pi, Val parent, NumInfo ni) {
523
+ hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
520
524
  volatile VALUE rval = Qnil;
521
525
 
522
526
  if (ni->infinity || ni->nan) {
@@ -598,7 +602,7 @@ oj_set_wab_callbacks(ParseInfo pi) {
598
602
 
599
603
  VALUE
600
604
  oj_wab_parse(int argc, VALUE *argv, VALUE self) {
601
- struct _ParseInfo pi;
605
+ struct _parseInfo pi;
602
606
 
603
607
  parse_info_init(&pi);
604
608
  pi.options = oj_default_options;
@@ -615,7 +619,7 @@ oj_wab_parse(int argc, VALUE *argv, VALUE self) {
615
619
 
616
620
  VALUE
617
621
  oj_wab_parse_cstr(int argc, VALUE *argv, char *json, size_t len) {
618
- struct _ParseInfo pi;
622
+ struct _parseInfo pi;
619
623
 
620
624
  parse_info_init(&pi);
621
625
  pi.options = oj_default_options;
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Oj
3
3
  # Current version of the module.
4
- VERSION = '3.7.5'
4
+ VERSION = '3.7.6'
5
5
  end
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ $: << File.dirname(__FILE__)
5
+
6
+ require 'helper'
7
+
8
+ class Handler
9
+ def initialize
10
+ @state = []
11
+ end
12
+
13
+ def hash_start
14
+ @state << {}
15
+ @state.last
16
+ end
17
+
18
+ def hash_end
19
+ @state.pop
20
+ end
21
+
22
+ def hash_set(h,k,v)
23
+ h.store(k,v)
24
+ end
25
+
26
+ def array_start
27
+ @state << []
28
+ @state.last
29
+ end
30
+
31
+
32
+ def array_end
33
+ @state.pop
34
+ end
35
+
36
+ def array_append(a,v)
37
+ a << v
38
+ end
39
+
40
+ def add_value(v)
41
+ p v
42
+ end
43
+
44
+ def error(message, line, column); p "ERROR: #{message}" end
45
+ end
46
+
47
+ $handler = Handler.new
48
+
49
+ IO.popen("cat tst") { |p| puts Oj.sc_parse($handler, p) }
50
+
51
+ #File.open('tst', 'r') { |file| Oj.sc_parse($handler, file) }
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #!/usr/bin/env ruby
4
+ # encoding: UTF-8
5
+
6
+ $: << File.dirname(__FILE__)
7
+
8
+ require 'helper'
9
+
10
+