oj 3.11.0 → 3.16.5

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 (173) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1421 -0
  3. data/README.md +20 -5
  4. data/RELEASE_NOTES.md +61 -0
  5. data/ext/oj/buf.h +48 -38
  6. data/ext/oj/cache.c +329 -0
  7. data/ext/oj/cache.h +22 -0
  8. data/ext/oj/cache8.c +60 -62
  9. data/ext/oj/cache8.h +8 -7
  10. data/ext/oj/circarray.c +35 -35
  11. data/ext/oj/circarray.h +11 -9
  12. data/ext/oj/code.c +156 -174
  13. data/ext/oj/code.h +19 -18
  14. data/ext/oj/compat.c +140 -197
  15. data/ext/oj/custom.c +737 -879
  16. data/ext/oj/debug.c +126 -0
  17. data/ext/oj/dump.c +830 -835
  18. data/ext/oj/dump.h +65 -53
  19. data/ext/oj/dump_compat.c +566 -642
  20. data/ext/oj/dump_leaf.c +95 -182
  21. data/ext/oj/dump_object.c +518 -659
  22. data/ext/oj/dump_strict.c +301 -334
  23. data/ext/oj/encode.h +3 -4
  24. data/ext/oj/encoder.c +43 -0
  25. data/ext/oj/err.c +27 -24
  26. data/ext/oj/err.h +38 -13
  27. data/ext/oj/extconf.rb +23 -7
  28. data/ext/oj/fast.c +1043 -1073
  29. data/ext/oj/intern.c +313 -0
  30. data/ext/oj/intern.h +22 -0
  31. data/ext/oj/mem.c +318 -0
  32. data/ext/oj/mem.h +53 -0
  33. data/ext/oj/mimic_json.c +449 -423
  34. data/ext/oj/object.c +530 -576
  35. data/ext/oj/odd.c +155 -138
  36. data/ext/oj/odd.h +24 -22
  37. data/ext/oj/oj.c +1331 -993
  38. data/ext/oj/oj.h +306 -292
  39. data/ext/oj/parse.c +934 -938
  40. data/ext/oj/parse.h +73 -70
  41. data/ext/oj/parser.c +1600 -0
  42. data/ext/oj/parser.h +101 -0
  43. data/ext/oj/rails.c +795 -845
  44. data/ext/oj/rails.h +7 -7
  45. data/ext/oj/reader.c +132 -140
  46. data/ext/oj/reader.h +67 -78
  47. data/ext/oj/resolve.c +40 -59
  48. data/ext/oj/resolve.h +3 -2
  49. data/ext/oj/rxclass.c +67 -67
  50. data/ext/oj/rxclass.h +11 -9
  51. data/ext/oj/saj.c +441 -480
  52. data/ext/oj/saj2.c +584 -0
  53. data/ext/oj/saj2.h +23 -0
  54. data/ext/oj/scp.c +78 -111
  55. data/ext/oj/sparse.c +726 -730
  56. data/ext/oj/stream_writer.c +146 -165
  57. data/ext/oj/strict.c +103 -123
  58. data/ext/oj/string_writer.c +241 -253
  59. data/ext/oj/trace.c +29 -33
  60. data/ext/oj/trace.h +41 -11
  61. data/ext/oj/usual.c +1218 -0
  62. data/ext/oj/usual.h +69 -0
  63. data/ext/oj/util.c +103 -103
  64. data/ext/oj/util.h +3 -2
  65. data/ext/oj/val_stack.c +60 -49
  66. data/ext/oj/val_stack.h +79 -85
  67. data/ext/oj/validate.c +46 -0
  68. data/ext/oj/wab.c +307 -350
  69. data/lib/oj/active_support_helper.rb +1 -3
  70. data/lib/oj/bag.rb +8 -1
  71. data/lib/oj/easy_hash.rb +9 -9
  72. data/lib/oj/error.rb +1 -2
  73. data/lib/oj/json.rb +162 -150
  74. data/lib/oj/mimic.rb +9 -19
  75. data/lib/oj/saj.rb +20 -6
  76. data/lib/oj/schandler.rb +5 -4
  77. data/lib/oj/state.rb +12 -8
  78. data/lib/oj/version.rb +1 -2
  79. data/lib/oj.rb +2 -0
  80. data/pages/Compatibility.md +1 -1
  81. data/pages/InstallOptions.md +20 -0
  82. data/pages/JsonGem.md +15 -0
  83. data/pages/Modes.md +8 -3
  84. data/pages/Options.md +43 -5
  85. data/pages/Parser.md +309 -0
  86. data/pages/Rails.md +14 -2
  87. data/test/_test_active.rb +8 -9
  88. data/test/_test_active_mimic.rb +7 -8
  89. data/test/_test_mimic_rails.rb +17 -20
  90. data/test/activerecord/result_test.rb +12 -8
  91. data/test/activesupport6/encoding_test.rb +63 -28
  92. data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
  93. data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
  94. data/test/{activesupport5 → activesupport7}/encoding_test.rb +86 -50
  95. data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
  96. data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
  97. data/test/files.rb +15 -15
  98. data/test/foo.rb +17 -43
  99. data/test/helper.rb +16 -3
  100. data/test/isolated/shared.rb +3 -2
  101. data/test/json_gem/json_addition_test.rb +2 -2
  102. data/test/json_gem/json_common_interface_test.rb +8 -6
  103. data/test/json_gem/json_encoding_test.rb +0 -0
  104. data/test/json_gem/json_ext_parser_test.rb +1 -0
  105. data/test/json_gem/json_fixtures_test.rb +3 -2
  106. data/test/json_gem/json_generator_test.rb +71 -41
  107. data/test/json_gem/json_generic_object_test.rb +11 -11
  108. data/test/json_gem/json_parser_test.rb +54 -47
  109. data/test/json_gem/json_string_matching_test.rb +9 -9
  110. data/test/json_gem/test_helper.rb +12 -0
  111. data/test/mem.rb +34 -0
  112. data/test/perf.rb +22 -27
  113. data/test/perf_compat.rb +31 -33
  114. data/test/perf_dump.rb +50 -0
  115. data/test/perf_fast.rb +80 -82
  116. data/test/perf_file.rb +27 -29
  117. data/test/perf_object.rb +65 -69
  118. data/test/perf_once.rb +59 -0
  119. data/test/perf_parser.rb +183 -0
  120. data/test/perf_saj.rb +46 -54
  121. data/test/perf_scp.rb +58 -69
  122. data/test/perf_simple.rb +41 -39
  123. data/test/perf_strict.rb +74 -82
  124. data/test/perf_wab.rb +67 -69
  125. data/test/prec.rb +5 -5
  126. data/test/sample/change.rb +0 -1
  127. data/test/sample/dir.rb +0 -1
  128. data/test/sample/doc.rb +0 -1
  129. data/test/sample/file.rb +0 -1
  130. data/test/sample/group.rb +0 -1
  131. data/test/sample/hasprops.rb +0 -1
  132. data/test/sample/layer.rb +0 -1
  133. data/test/sample/rect.rb +0 -1
  134. data/test/sample/shape.rb +0 -1
  135. data/test/sample/text.rb +0 -1
  136. data/test/sample.rb +16 -16
  137. data/test/sample_json.rb +8 -8
  138. data/test/test_compat.rb +97 -45
  139. data/test/test_custom.rb +73 -51
  140. data/test/test_debian.rb +7 -10
  141. data/test/test_fast.rb +135 -79
  142. data/test/test_file.rb +41 -30
  143. data/test/test_gc.rb +16 -5
  144. data/test/test_generate.rb +21 -0
  145. data/test/test_hash.rb +15 -5
  146. data/test/test_integer_range.rb +9 -9
  147. data/test/test_null.rb +20 -20
  148. data/test/test_object.rb +99 -96
  149. data/test/test_parser.rb +11 -0
  150. data/test/test_parser_debug.rb +27 -0
  151. data/test/test_parser_saj.rb +337 -0
  152. data/test/test_parser_usual.rb +251 -0
  153. data/test/test_rails.rb +2 -2
  154. data/test/test_saj.rb +10 -8
  155. data/test/test_scp.rb +38 -40
  156. data/test/test_strict.rb +40 -32
  157. data/test/test_various.rb +165 -84
  158. data/test/test_wab.rb +48 -44
  159. data/test/test_writer.rb +47 -47
  160. data/test/tests.rb +13 -5
  161. data/test/tests_mimic.rb +12 -3
  162. data/test/tests_mimic_addition.rb +12 -3
  163. metadata +75 -127
  164. data/ext/oj/hash.c +0 -135
  165. data/ext/oj/hash.h +0 -18
  166. data/ext/oj/hash_test.c +0 -484
  167. data/test/activesupport4/decoding_test.rb +0 -108
  168. data/test/activesupport4/encoding_test.rb +0 -531
  169. data/test/activesupport4/test_helper.rb +0 -41
  170. data/test/activesupport5/test_helper.rb +0 -72
  171. data/test/bar.rb +0 -35
  172. data/test/baz.rb +0 -16
  173. data/test/zoo.rb +0 -13
data/ext/oj/val_stack.h CHANGED
@@ -1,157 +1,151 @@
1
1
  // Copyright (c) 2011 Peter Ohler. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for license details.
2
3
 
3
4
  #ifndef OJ_VAL_STACK_H
4
5
  #define OJ_VAL_STACK_H
5
6
 
6
- #include "ruby.h"
7
- #include "odd.h"
8
7
  #include <stdint.h>
8
+
9
+ #include "mem.h"
10
+ #include "odd.h"
11
+ #include "ruby.h"
9
12
  #ifdef HAVE_PTHREAD_MUTEX_INIT
10
13
  #include <pthread.h>
11
14
  #endif
12
15
 
13
- #define STACK_INC 64
16
+ #define STACK_INC 64
14
17
 
15
18
  typedef enum {
16
- NEXT_NONE = 0,
17
- NEXT_ARRAY_NEW = 'a',
18
- NEXT_ARRAY_ELEMENT = 'e',
19
- NEXT_ARRAY_COMMA = ',',
20
- NEXT_HASH_NEW = 'h',
21
- NEXT_HASH_KEY = 'k',
22
- NEXT_HASH_COLON = ':',
23
- NEXT_HASH_VALUE = 'v',
24
- NEXT_HASH_COMMA = 'n',
19
+ NEXT_NONE = 0,
20
+ NEXT_ARRAY_NEW = 'a',
21
+ NEXT_ARRAY_ELEMENT = 'e',
22
+ NEXT_ARRAY_COMMA = ',',
23
+ NEXT_HASH_NEW = 'h',
24
+ NEXT_HASH_KEY = 'k',
25
+ NEXT_HASH_COLON = ':',
26
+ NEXT_HASH_VALUE = 'v',
27
+ NEXT_HASH_COMMA = 'n',
25
28
  } ValNext;
26
29
 
27
30
  typedef struct _val {
28
- volatile VALUE val;
29
- const char *key;
30
- char karray[32];
31
- volatile VALUE key_val;
32
- const char *classname;
33
- VALUE clas;
34
- OddArgs odd_args;
35
- uint16_t klen;
36
- uint16_t clen;
37
- char next; // ValNext
38
- char k1; // first original character in the key
39
- char kalloc;
31
+ volatile VALUE val;
32
+ const char *key;
33
+ char karray[32];
34
+ volatile VALUE key_val;
35
+ const char *classname;
36
+ VALUE clas;
37
+ OddArgs odd_args;
38
+ uint16_t klen;
39
+ uint16_t clen;
40
+ char next; // ValNext
41
+ char k1; // first original character in the key
42
+ char kalloc;
40
43
  } *Val;
41
44
 
42
45
  typedef struct _valStack {
43
- struct _val base[STACK_INC];
44
- Val head; // current stack
45
- Val end; // stack end
46
- Val tail; // pointer to one past last element name on stack
46
+ struct _val base[STACK_INC];
47
+ Val head; // current stack
48
+ Val end; // stack end
49
+ Val tail; // pointer to one past last element name on stack
47
50
  #ifdef HAVE_PTHREAD_MUTEX_INIT
48
- pthread_mutex_t mutex;
51
+ pthread_mutex_t mutex;
49
52
  #else
50
- VALUE mutex;
53
+ VALUE mutex;
51
54
  #endif
52
55
 
53
56
  } *ValStack;
54
57
 
55
- extern VALUE oj_stack_init(ValStack stack);
58
+ extern VALUE oj_stack_init(ValStack stack);
56
59
 
57
- inline static int
58
- stack_empty(ValStack stack) {
60
+ inline static int stack_empty(ValStack stack) {
59
61
  return (stack->head == stack->tail);
60
62
  }
61
63
 
62
- inline static void
63
- stack_cleanup(ValStack stack) {
64
+ inline static void stack_cleanup(ValStack stack) {
64
65
  if (stack->base != stack->head) {
65
- xfree(stack->head);
66
- stack->head = NULL;
66
+ OJ_R_FREE(stack->head);
67
+ stack->head = NULL;
67
68
  }
68
69
  }
69
70
 
70
- inline static void
71
- stack_push(ValStack stack, VALUE val, ValNext next) {
71
+ inline static void stack_push(ValStack stack, VALUE val, ValNext next) {
72
72
  if (stack->end <= stack->tail) {
73
- size_t len = stack->end - stack->head;
74
- size_t toff = stack->tail - stack->head;
75
- Val head = stack->head;
76
-
77
- // A realloc can trigger a GC so make sure it happens outside the lock
78
- // but lock before changing pointers.
79
- if (stack->base == stack->head) {
80
- head = ALLOC_N(struct _val, len + STACK_INC);
81
- memcpy(head, stack->base, sizeof(struct _val) * len);
82
- } else {
83
- REALLOC_N(head, struct _val, len + STACK_INC);
84
- }
73
+ size_t len = stack->end - stack->head;
74
+ size_t toff = stack->tail - stack->head;
75
+ Val head = stack->head;
76
+
77
+ // A realloc can trigger a GC so make sure it happens outside the lock
78
+ // but lock before changing pointers.
79
+ if (stack->base == stack->head) {
80
+ head = OJ_R_ALLOC_N(struct _val, len + STACK_INC);
81
+ memcpy(head, stack->base, sizeof(struct _val) * len);
82
+ } else {
83
+ OJ_R_REALLOC_N(head, struct _val, len + STACK_INC);
84
+ }
85
85
  #ifdef HAVE_PTHREAD_MUTEX_INIT
86
- pthread_mutex_lock(&stack->mutex);
86
+ pthread_mutex_lock(&stack->mutex);
87
87
  #else
88
- rb_mutex_lock(stack->mutex);
88
+ rb_mutex_lock(stack->mutex);
89
89
  #endif
90
- stack->head = head;
91
- stack->tail = stack->head + toff;
92
- stack->end = stack->head + len + STACK_INC;
90
+ stack->head = head;
91
+ stack->tail = stack->head + toff;
92
+ stack->end = stack->head + len + STACK_INC;
93
93
  #ifdef HAVE_PTHREAD_MUTEX_INIT
94
- pthread_mutex_unlock(&stack->mutex);
94
+ pthread_mutex_unlock(&stack->mutex);
95
95
  #else
96
- rb_mutex_unlock(stack->mutex);
96
+ rb_mutex_unlock(stack->mutex);
97
97
  #endif
98
98
  }
99
- stack->tail->val = val;
100
- stack->tail->next = next;
99
+ stack->tail->val = val;
100
+ stack->tail->next = next;
101
101
  stack->tail->classname = NULL;
102
- stack->tail->clas = Qundef;
103
- stack->tail->odd_args = NULL;
104
- stack->tail->key = 0;
105
- stack->tail->key_val = Qundef;
106
- stack->tail->clen = 0;
107
- stack->tail->klen = 0;
108
- stack->tail->kalloc = 0;
102
+ stack->tail->clas = Qundef;
103
+ stack->tail->odd_args = NULL;
104
+ stack->tail->key = 0;
105
+ stack->tail->key_val = Qundef;
106
+ stack->tail->clen = 0;
107
+ stack->tail->klen = 0;
108
+ stack->tail->kalloc = 0;
109
109
  stack->tail++;
110
110
  }
111
111
 
112
- inline static size_t
113
- stack_size(ValStack stack) {
112
+ inline static size_t stack_size(ValStack stack) {
114
113
  return stack->tail - stack->head;
115
114
  }
116
115
 
117
- inline static Val
118
- stack_peek(ValStack stack) {
116
+ inline static Val stack_peek(ValStack stack) {
119
117
  if (stack->head < stack->tail) {
120
- return stack->tail - 1;
118
+ return stack->tail - 1;
121
119
  }
122
120
  return 0;
123
121
  }
124
122
 
125
- inline static Val
126
- stack_peek_up(ValStack stack) {
123
+ inline static Val stack_peek_up(ValStack stack) {
127
124
  if (stack->head < stack->tail - 1) {
128
- return stack->tail - 2;
125
+ return stack->tail - 2;
129
126
  }
130
127
  return 0;
131
128
  }
132
129
 
133
- inline static Val
134
- stack_prev(ValStack stack) {
130
+ inline static Val stack_prev(ValStack stack) {
135
131
  return stack->tail;
136
132
  }
137
133
 
138
- inline static VALUE
139
- stack_head_val(ValStack stack) {
134
+ inline static VALUE stack_head_val(ValStack stack) {
140
135
  if (Qundef != stack->head->val) {
141
- return stack->head->val;
136
+ return stack->head->val;
142
137
  }
143
138
  return Qnil;
144
139
  }
145
140
 
146
- inline static Val
147
- stack_pop(ValStack stack) {
141
+ inline static Val stack_pop(ValStack stack) {
148
142
  if (stack->head < stack->tail) {
149
- stack->tail--;
150
- return stack->tail;
143
+ stack->tail--;
144
+ return stack->tail;
151
145
  }
152
146
  return 0;
153
147
  }
154
148
 
155
- extern const char* oj_stack_next_string(ValNext n);
149
+ extern const char *oj_stack_next_string(ValNext n);
156
150
 
157
151
  #endif /* OJ_VAL_STACK_H */
data/ext/oj/validate.c ADDED
@@ -0,0 +1,46 @@
1
+ // Copyright (c) 2021, Peter Ohler, All rights reserved.
2
+
3
+ #include "parser.h"
4
+
5
+ static void noop(ojParser p) {
6
+ }
7
+
8
+ static VALUE option(ojParser p, const char *key, VALUE value) {
9
+ rb_raise(rb_eArgError, "%s is not an option for the validate delegate", key);
10
+ return Qnil;
11
+ }
12
+
13
+ static VALUE result(ojParser p) {
14
+ return Qnil;
15
+ }
16
+
17
+ static void dfree(ojParser p) {
18
+ }
19
+
20
+ static void mark(ojParser p) {
21
+ }
22
+
23
+ void oj_set_parser_validator(ojParser p) {
24
+ Funcs end = p->funcs + 3;
25
+ Funcs f;
26
+ p->ctx = NULL;
27
+
28
+ for (f = p->funcs; f < end; f++) {
29
+ f->add_null = noop;
30
+ f->add_true = noop;
31
+ f->add_false = noop;
32
+ f->add_int = noop;
33
+ f->add_float = noop;
34
+ f->add_big = noop;
35
+ f->add_str = noop;
36
+ f->open_array = noop;
37
+ f->close_array = noop;
38
+ f->open_object = noop;
39
+ f->close_object = noop;
40
+ }
41
+ p->option = option;
42
+ p->result = result;
43
+ p->free = dfree;
44
+ p->mark = mark;
45
+ p->start = noop;
46
+ }