oj 3.10.6 → 3.12.1

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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -1
  3. data/ext/oj/buf.h +36 -68
  4. data/ext/oj/cache8.c +59 -62
  5. data/ext/oj/cache8.h +9 -36
  6. data/ext/oj/circarray.c +36 -42
  7. data/ext/oj/circarray.h +12 -13
  8. data/ext/oj/code.c +172 -179
  9. data/ext/oj/code.h +22 -24
  10. data/ext/oj/compat.c +176 -181
  11. data/ext/oj/custom.c +800 -864
  12. data/ext/oj/dump.c +774 -776
  13. data/ext/oj/dump.h +50 -55
  14. data/ext/oj/dump_compat.c +2 -4
  15. data/ext/oj/dump_leaf.c +118 -162
  16. data/ext/oj/dump_object.c +610 -632
  17. data/ext/oj/dump_strict.c +319 -331
  18. data/ext/oj/encode.h +4 -33
  19. data/ext/oj/err.c +40 -29
  20. data/ext/oj/err.h +25 -44
  21. data/ext/oj/extconf.rb +2 -1
  22. data/ext/oj/fast.c +1054 -1081
  23. data/ext/oj/hash.c +102 -97
  24. data/ext/oj/hash.h +10 -35
  25. data/ext/oj/hash_test.c +451 -472
  26. data/ext/oj/mimic_json.c +415 -402
  27. data/ext/oj/object.c +588 -532
  28. data/ext/oj/odd.c +124 -132
  29. data/ext/oj/odd.h +28 -29
  30. data/ext/oj/oj.c +1186 -906
  31. data/ext/oj/oj.h +289 -298
  32. data/ext/oj/parse.c +946 -870
  33. data/ext/oj/parse.h +81 -79
  34. data/ext/oj/rails.c +837 -842
  35. data/ext/oj/rails.h +8 -11
  36. data/ext/oj/reader.c +139 -147
  37. data/ext/oj/reader.h +68 -84
  38. data/ext/oj/resolve.c +44 -47
  39. data/ext/oj/resolve.h +4 -6
  40. data/ext/oj/rxclass.c +69 -73
  41. data/ext/oj/rxclass.h +13 -14
  42. data/ext/oj/saj.c +453 -484
  43. data/ext/oj/scp.c +88 -113
  44. data/ext/oj/sparse.c +783 -714
  45. data/ext/oj/stream_writer.c +123 -157
  46. data/ext/oj/strict.c +133 -106
  47. data/ext/oj/string_writer.c +199 -247
  48. data/ext/oj/trace.c +34 -41
  49. data/ext/oj/trace.h +15 -15
  50. data/ext/oj/util.c +104 -104
  51. data/ext/oj/util.h +4 -3
  52. data/ext/oj/val_stack.c +48 -76
  53. data/ext/oj/val_stack.h +80 -115
  54. data/ext/oj/wab.c +321 -325
  55. data/lib/oj.rb +0 -8
  56. data/lib/oj/bag.rb +1 -0
  57. data/lib/oj/easy_hash.rb +5 -4
  58. data/lib/oj/mimic.rb +47 -13
  59. data/lib/oj/version.rb +1 -1
  60. data/pages/Modes.md +1 -0
  61. data/pages/Options.md +23 -11
  62. data/test/activerecord/result_test.rb +7 -2
  63. data/test/foo.rb +8 -40
  64. data/test/helper.rb +10 -0
  65. data/test/json_gem/json_common_interface_test.rb +8 -3
  66. data/test/json_gem/json_generator_test.rb +15 -3
  67. data/test/json_gem/test_helper.rb +8 -0
  68. data/test/perf.rb +1 -1
  69. data/test/perf_scp.rb +11 -10
  70. data/test/perf_strict.rb +17 -23
  71. data/test/prec.rb +23 -0
  72. data/test/sample_json.rb +1 -1
  73. data/test/test_compat.rb +16 -3
  74. data/test/test_custom.rb +11 -0
  75. data/test/test_fast.rb +32 -2
  76. data/test/test_generate.rb +21 -0
  77. data/test/test_hash.rb +10 -0
  78. data/test/test_rails.rb +9 -0
  79. data/test/test_scp.rb +1 -1
  80. data/test/test_various.rb +4 -2
  81. metadata +89 -85
@@ -1,254 +1,232 @@
1
- /* strwriter.c
2
- * Copyright (c) 2012, 2017, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012, 2017 Peter Ohler. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for license details.
5
3
 
6
4
  #include "dump.h"
7
5
  #include "encode.h"
8
6
 
9
- extern VALUE Oj;
7
+ extern VALUE Oj;
10
8
 
11
- bool string_writer_optimized = false;
9
+ bool string_writer_optimized = false;
12
10
 
13
- static void
14
- key_check(StrWriter sw, const char *key) {
15
- DumpType type = sw->types[sw->depth];
11
+ static void key_check(StrWriter sw, const char *key) {
12
+ DumpType type = sw->types[sw->depth];
16
13
 
17
14
  if (0 == key && (ObjectNew == type || ObjectType == type)) {
18
- rb_raise(rb_eStandardError, "Can not push onto an Object without a key.");
15
+ rb_raise(rb_eStandardError, "Can not push onto an Object without a key.");
19
16
  }
20
17
  }
21
18
 
22
- static void
23
- push_type(StrWriter sw, DumpType type) {
19
+ static void push_type(StrWriter sw, DumpType type) {
24
20
  if (sw->types_end <= sw->types + sw->depth + 1) {
25
- size_t size = (sw->types_end - sw->types) * 2;
21
+ size_t size = (sw->types_end - sw->types) * 2;
26
22
 
27
- REALLOC_N(sw->types, char, size);
28
- sw->types_end = sw->types + size;
23
+ REALLOC_N(sw->types, char, size);
24
+ sw->types_end = sw->types + size;
29
25
  }
30
26
  sw->depth++;
31
27
  sw->types[sw->depth] = type;
32
28
  }
33
29
 
34
- static void
35
- maybe_comma(StrWriter sw) {
30
+ static void maybe_comma(StrWriter sw) {
36
31
  switch (sw->types[sw->depth]) {
37
- case ObjectNew:
38
- sw->types[sw->depth] = ObjectType;
39
- break;
40
- case ArrayNew:
41
- sw->types[sw->depth] = ArrayType;
42
- break;
32
+ case ObjectNew: sw->types[sw->depth] = ObjectType; break;
33
+ case ArrayNew: sw->types[sw->depth] = ArrayType; break;
43
34
  case ObjectType:
44
35
  case ArrayType:
45
- // Always have a few characters available in the out.buf.
46
- *sw->out.cur++ = ',';
47
- break;
36
+ // Always have a few characters available in the out.buf.
37
+ *sw->out.cur++ = ',';
38
+ break;
48
39
  }
49
40
  }
50
41
 
51
42
  // Used by stream writer also.
52
- void
53
- oj_str_writer_init(StrWriter sw, int buf_size) {
54
- sw->opts = oj_default_options;
55
- sw->depth = 0;
56
- sw->types = ALLOC_N(char, 256);
57
- sw->types_end = sw->types + 256;
58
- *sw->types = '\0';
43
+ void oj_str_writer_init(StrWriter sw, int buf_size) {
44
+ sw->opts = oj_default_options;
45
+ sw->depth = 0;
46
+ sw->types = ALLOC_N(char, 256);
47
+ sw->types_end = sw->types + 256;
48
+ *sw->types = '\0';
59
49
  sw->keyWritten = 0;
60
50
 
61
51
  if (0 == buf_size) {
62
- buf_size = 4096;
52
+ buf_size = 4096;
63
53
  } else if (buf_size < 1024) {
64
- buf_size = 1024;
54
+ buf_size = 1024;
65
55
  }
66
- sw->out.buf = ALLOC_N(char, buf_size);
67
- sw->out.end = sw->out.buf + buf_size - 10;
68
- sw->out.allocated = true;
69
- sw->out.cur = sw->out.buf;
70
- *sw->out.cur = '\0';
56
+ sw->out.buf = ALLOC_N(char, buf_size);
57
+ sw->out.end = sw->out.buf + buf_size - 10;
58
+ sw->out.allocated = true;
59
+ sw->out.cur = sw->out.buf;
60
+ *sw->out.cur = '\0';
71
61
  sw->out.circ_cache = NULL;
72
- sw->out.circ_cnt = 0;
73
- sw->out.hash_cnt = 0;
74
- sw->out.opts = &sw->opts;
75
- sw->out.indent = sw->opts.indent;
76
- sw->out.depth = 0;
77
- sw->out.argc = 0;
78
- sw->out.argv = NULL;
79
- sw->out.caller = 0;
80
- sw->out.ropts = NULL;
81
- sw->out.omit_nil = oj_default_options.dump_opts.omit_nil;
62
+ sw->out.circ_cnt = 0;
63
+ sw->out.hash_cnt = 0;
64
+ sw->out.opts = &sw->opts;
65
+ sw->out.indent = sw->opts.indent;
66
+ sw->out.depth = 0;
67
+ sw->out.argc = 0;
68
+ sw->out.argv = NULL;
69
+ sw->out.caller = 0;
70
+ sw->out.ropts = NULL;
71
+ sw->out.omit_nil = oj_default_options.dump_opts.omit_nil;
82
72
  }
83
73
 
84
- void
85
- oj_str_writer_push_key(StrWriter sw, const char *key) {
86
- DumpType type = sw->types[sw->depth];
87
- long size;
74
+ void oj_str_writer_push_key(StrWriter sw, const char *key) {
75
+ DumpType type = sw->types[sw->depth];
76
+ long size;
88
77
 
89
78
  if (sw->keyWritten) {
90
- rb_raise(rb_eStandardError, "Can not push more than one key before pushing a non-key.");
79
+ rb_raise(rb_eStandardError, "Can not push more than one key before pushing a non-key.");
91
80
  }
92
81
  if (ObjectNew != type && ObjectType != type) {
93
- rb_raise(rb_eStandardError, "Can only push a key onto an Object.");
82
+ rb_raise(rb_eStandardError, "Can only push a key onto an Object.");
94
83
  }
95
84
  size = sw->depth * sw->out.indent + 3;
96
85
  assure_size(&sw->out, size);
97
86
  maybe_comma(sw);
98
87
  if (0 < sw->depth) {
99
- fill_indent(&sw->out, sw->depth);
88
+ fill_indent(&sw->out, sw->depth);
100
89
  }
101
90
  oj_dump_cstr(key, strlen(key), 0, 0, &sw->out);
102
91
  *sw->out.cur++ = ':';
103
92
  sw->keyWritten = 1;
104
93
  }
105
94
 
106
- void
107
- oj_str_writer_push_object(StrWriter sw, const char *key) {
95
+ void oj_str_writer_push_object(StrWriter sw, const char *key) {
108
96
  if (sw->keyWritten) {
109
- sw->keyWritten = 0;
110
- assure_size(&sw->out, 1);
97
+ sw->keyWritten = 0;
98
+ assure_size(&sw->out, 1);
111
99
  } else {
112
- long size;
113
-
114
- key_check(sw, key);
115
- size = sw->depth * sw->out.indent + 3;
116
- assure_size(&sw->out, size);
117
- maybe_comma(sw);
118
- if (0 < sw->depth) {
119
- fill_indent(&sw->out, sw->depth);
120
- }
121
- if (0 != key) {
122
- oj_dump_cstr(key, strlen(key), 0, 0, &sw->out);
123
- *sw->out.cur++ = ':';
124
- }
100
+ long size;
101
+
102
+ key_check(sw, key);
103
+ size = sw->depth * sw->out.indent + 3;
104
+ assure_size(&sw->out, size);
105
+ maybe_comma(sw);
106
+ if (0 < sw->depth) {
107
+ fill_indent(&sw->out, sw->depth);
108
+ }
109
+ if (0 != key) {
110
+ oj_dump_cstr(key, strlen(key), 0, 0, &sw->out);
111
+ *sw->out.cur++ = ':';
112
+ }
125
113
  }
126
114
  *sw->out.cur++ = '{';
127
115
  push_type(sw, ObjectNew);
128
116
  }
129
117
 
130
- void
131
- oj_str_writer_push_array(StrWriter sw, const char *key) {
118
+ void oj_str_writer_push_array(StrWriter sw, const char *key) {
132
119
  if (sw->keyWritten) {
133
- sw->keyWritten = 0;
134
- assure_size(&sw->out, 1);
120
+ sw->keyWritten = 0;
121
+ assure_size(&sw->out, 1);
135
122
  } else {
136
- long size;
137
-
138
- key_check(sw, key);
139
- size = sw->depth * sw->out.indent + 3;
140
- assure_size(&sw->out, size);
141
- maybe_comma(sw);
142
- if (0 < sw->depth) {
143
- fill_indent(&sw->out, sw->depth);
144
- }
145
- if (0 != key) {
146
- oj_dump_cstr(key, strlen(key), 0, 0, &sw->out);
147
- *sw->out.cur++ = ':';
148
- }
123
+ long size;
124
+
125
+ key_check(sw, key);
126
+ size = sw->depth * sw->out.indent + 3;
127
+ assure_size(&sw->out, size);
128
+ maybe_comma(sw);
129
+ if (0 < sw->depth) {
130
+ fill_indent(&sw->out, sw->depth);
131
+ }
132
+ if (0 != key) {
133
+ oj_dump_cstr(key, strlen(key), 0, 0, &sw->out);
134
+ *sw->out.cur++ = ':';
135
+ }
149
136
  }
150
137
  *sw->out.cur++ = '[';
151
138
  push_type(sw, ArrayNew);
152
139
  }
153
140
 
154
- void
155
- oj_str_writer_push_value(StrWriter sw, VALUE val, const char *key) {
156
- Out out = &sw->out;
141
+ void oj_str_writer_push_value(StrWriter sw, VALUE val, const char *key) {
142
+ Out out = &sw->out;
157
143
 
158
144
  if (sw->keyWritten) {
159
- sw->keyWritten = 0;
145
+ sw->keyWritten = 0;
160
146
  } else {
161
- long size;
162
-
163
- key_check(sw, key);
164
- size = sw->depth * out->indent + 3;
165
- assure_size(out, size);
166
- maybe_comma(sw);
167
- if (0 < sw->depth) {
168
- fill_indent(&sw->out, sw->depth);
169
- }
170
- if (0 != key) {
171
- oj_dump_cstr(key, strlen(key), 0, 0, out);
172
- *out->cur++ = ':';
173
- }
147
+ long size;
148
+
149
+ key_check(sw, key);
150
+ size = sw->depth * out->indent + 3;
151
+ assure_size(out, size);
152
+ maybe_comma(sw);
153
+ if (0 < sw->depth) {
154
+ fill_indent(&sw->out, sw->depth);
155
+ }
156
+ if (0 != key) {
157
+ oj_dump_cstr(key, strlen(key), 0, 0, out);
158
+ *out->cur++ = ':';
159
+ }
174
160
  }
175
161
  switch (out->opts->mode) {
176
- case StrictMode: oj_dump_strict_val(val, sw->depth, out); break;
177
- case NullMode: oj_dump_null_val(val, sw->depth, out); break;
178
- case ObjectMode: oj_dump_obj_val(val, sw->depth, out); break;
179
- case CompatMode: oj_dump_compat_val(val, sw->depth, out, Yes == out->opts->to_json); break;
180
- case RailsMode: oj_dump_rails_val(val, sw->depth, out); break;
181
- case CustomMode: oj_dump_custom_val(val, sw->depth, out, true); break;
182
- default: oj_dump_custom_val(val, sw->depth, out, true); break;
162
+ case StrictMode: oj_dump_strict_val(val, sw->depth, out); break;
163
+ case NullMode: oj_dump_null_val(val, sw->depth, out); break;
164
+ case ObjectMode: oj_dump_obj_val(val, sw->depth, out); break;
165
+ case CompatMode: oj_dump_compat_val(val, sw->depth, out, Yes == out->opts->to_json); break;
166
+ case RailsMode: oj_dump_rails_val(val, sw->depth, out); break;
167
+ case CustomMode: oj_dump_custom_val(val, sw->depth, out, true); break;
168
+ default: oj_dump_custom_val(val, sw->depth, out, true); break;
183
169
  }
184
170
  }
185
171
 
186
- void
187
- oj_str_writer_push_json(StrWriter sw, const char *json, const char *key) {
172
+ void oj_str_writer_push_json(StrWriter sw, const char *json, const char *key) {
188
173
  if (sw->keyWritten) {
189
- sw->keyWritten = 0;
174
+ sw->keyWritten = 0;
190
175
  } else {
191
- long size;
192
-
193
- key_check(sw, key);
194
- size = sw->depth * sw->out.indent + 3;
195
- assure_size(&sw->out, size);
196
- maybe_comma(sw);
197
- if (0 < sw->depth) {
198
- fill_indent(&sw->out, sw->depth);
199
- }
200
- if (0 != key) {
201
- oj_dump_cstr(key, strlen(key), 0, 0, &sw->out);
202
- *sw->out.cur++ = ':';
203
- }
176
+ long size;
177
+
178
+ key_check(sw, key);
179
+ size = sw->depth * sw->out.indent + 3;
180
+ assure_size(&sw->out, size);
181
+ maybe_comma(sw);
182
+ if (0 < sw->depth) {
183
+ fill_indent(&sw->out, sw->depth);
184
+ }
185
+ if (0 != key) {
186
+ oj_dump_cstr(key, strlen(key), 0, 0, &sw->out);
187
+ *sw->out.cur++ = ':';
188
+ }
204
189
  }
205
190
  oj_dump_raw(json, strlen(json), &sw->out);
206
191
  }
207
192
 
208
- void
209
- oj_str_writer_pop(StrWriter sw) {
210
- long size;
211
- DumpType type = sw->types[sw->depth];
193
+ void oj_str_writer_pop(StrWriter sw) {
194
+ long size;
195
+ DumpType type = sw->types[sw->depth];
212
196
 
213
197
  if (sw->keyWritten) {
214
- sw->keyWritten = 0;
215
- rb_raise(rb_eStandardError, "Can not pop after writing a key but no value.");
198
+ sw->keyWritten = 0;
199
+ rb_raise(rb_eStandardError, "Can not pop after writing a key but no value.");
216
200
  }
217
201
  sw->depth--;
218
202
  if (0 > sw->depth) {
219
- rb_raise(rb_eStandardError, "Can not pop with no open array or object.");
203
+ rb_raise(rb_eStandardError, "Can not pop with no open array or object.");
220
204
  }
221
205
  size = sw->depth * sw->out.indent + 2;
222
206
  assure_size(&sw->out, size);
223
207
  fill_indent(&sw->out, sw->depth);
224
208
  switch (type) {
225
209
  case ObjectNew:
226
- case ObjectType:
227
- *sw->out.cur++ = '}';
228
- break;
210
+ case ObjectType: *sw->out.cur++ = '}'; break;
229
211
  case ArrayNew:
230
- case ArrayType:
231
- *sw->out.cur++ = ']';
232
- break;
212
+ case ArrayType: *sw->out.cur++ = ']'; break;
233
213
  }
234
214
  if (0 == sw->depth && 0 <= sw->out.indent) {
235
- *sw->out.cur++ = '\n';
215
+ *sw->out.cur++ = '\n';
236
216
  }
237
217
  }
238
218
 
239
- void
240
- oj_str_writer_pop_all(StrWriter sw) {
219
+ void oj_str_writer_pop_all(StrWriter sw) {
241
220
  while (0 < sw->depth) {
242
- oj_str_writer_pop(sw);
221
+ oj_str_writer_pop(sw);
243
222
  }
244
223
  }
245
224
 
246
- static void
247
- str_writer_free(void *ptr) {
248
- StrWriter sw;
225
+ static void str_writer_free(void *ptr) {
226
+ StrWriter sw;
249
227
 
250
228
  if (0 == ptr) {
251
- return;
229
+ return;
252
230
  }
253
231
  sw = (StrWriter)ptr;
254
232
  xfree(sw->out.buf);
@@ -272,16 +250,15 @@ str_writer_free(void *ptr) {
272
250
  * - *io* [_IO_] stream to write to
273
251
  * - *options* [_Hash_] formating options
274
252
  */
275
- static VALUE
276
- str_writer_new(int argc, VALUE *argv, VALUE self) {
277
- StrWriter sw = ALLOC(struct _strWriter);
253
+ static VALUE str_writer_new(int argc, VALUE *argv, VALUE self) {
254
+ StrWriter sw = ALLOC(struct _strWriter);
278
255
 
279
256
  oj_str_writer_init(sw, 0);
280
257
  if (1 == argc) {
281
- oj_parse_options(argv[0], &sw->opts);
258
+ oj_parse_options(argv[0], &sw->opts);
282
259
  }
283
- sw->out.argc = argc - 1;
284
- sw->out.argv = argv + 1;
260
+ sw->out.argc = argc - 1;
261
+ sw->out.argv = argv + 1;
285
262
  sw->out.indent = sw->opts.indent;
286
263
 
287
264
  return Data_Wrap_Struct(oj_string_writer_class, 0, str_writer_free, sw);
@@ -295,9 +272,8 @@ str_writer_new(int argc, VALUE *argv, VALUE self) {
295
272
  * the next push then that new key will be ignored.
296
273
  * - *key* [_String_] the key pending for the next push
297
274
  */
298
- static VALUE
299
- str_writer_push_key(VALUE self, VALUE key) {
300
- StrWriter sw = (StrWriter)DATA_PTR(self);
275
+ static VALUE str_writer_push_key(VALUE self, VALUE key) {
276
+ StrWriter sw = (StrWriter)DATA_PTR(self);
301
277
 
302
278
  rb_check_type(key, T_STRING);
303
279
  oj_str_writer_push_key(sw, StringValuePtr(key));
@@ -312,29 +288,24 @@ str_writer_push_key(VALUE self, VALUE key) {
312
288
  * until a pop() is called.
313
289
  * - *key* [_String_] the key if adding to an object in the JSON document
314
290
  */
315
- static VALUE
316
- str_writer_push_object(int argc, VALUE *argv, VALUE self) {
317
- StrWriter sw = (StrWriter)DATA_PTR(self);
291
+ static VALUE str_writer_push_object(int argc, VALUE *argv, VALUE self) {
292
+ StrWriter sw = (StrWriter)DATA_PTR(self);
318
293
 
319
294
  switch (argc) {
320
- case 0:
321
- oj_str_writer_push_object(sw, 0);
322
- break;
295
+ case 0: oj_str_writer_push_object(sw, 0); break;
323
296
  case 1:
324
- if (Qnil == argv[0]) {
325
- oj_str_writer_push_object(sw, 0);
326
- } else {
327
- rb_check_type(argv[0], T_STRING);
328
- oj_str_writer_push_object(sw, StringValuePtr(argv[0]));
329
- }
330
- break;
331
- default:
332
- rb_raise(rb_eArgError, "Wrong number of argument to 'push_object'.");
333
- break;
297
+ if (Qnil == argv[0]) {
298
+ oj_str_writer_push_object(sw, 0);
299
+ } else {
300
+ rb_check_type(argv[0], T_STRING);
301
+ oj_str_writer_push_object(sw, StringValuePtr(argv[0]));
302
+ }
303
+ break;
304
+ default: rb_raise(rb_eArgError, "Wrong number of argument to 'push_object'."); break;
334
305
  }
335
306
  if (rb_block_given_p()) {
336
- rb_yield(Qnil);
337
- oj_str_writer_pop(sw);
307
+ rb_yield(Qnil);
308
+ oj_str_writer_pop(sw);
338
309
  }
339
310
  return Qnil;
340
311
  }
@@ -346,29 +317,24 @@ str_writer_push_object(int argc, VALUE *argv, VALUE self) {
346
317
  * until a pop() is called.
347
318
  * - *key* [_String_] the key if adding to an object in the JSON document
348
319
  */
349
- static VALUE
350
- str_writer_push_array(int argc, VALUE *argv, VALUE self) {
351
- StrWriter sw = (StrWriter)DATA_PTR(self);
320
+ static VALUE str_writer_push_array(int argc, VALUE *argv, VALUE self) {
321
+ StrWriter sw = (StrWriter)DATA_PTR(self);
352
322
 
353
323
  switch (argc) {
354
- case 0:
355
- oj_str_writer_push_array(sw, 0);
356
- break;
324
+ case 0: oj_str_writer_push_array(sw, 0); break;
357
325
  case 1:
358
- if (Qnil == argv[0]) {
359
- oj_str_writer_push_array(sw, 0);
360
- } else {
361
- rb_check_type(argv[0], T_STRING);
362
- oj_str_writer_push_array(sw, StringValuePtr(argv[0]));
363
- }
364
- break;
365
- default:
366
- rb_raise(rb_eArgError, "Wrong number of argument to 'push_object'.");
367
- break;
326
+ if (Qnil == argv[0]) {
327
+ oj_str_writer_push_array(sw, 0);
328
+ } else {
329
+ rb_check_type(argv[0], T_STRING);
330
+ oj_str_writer_push_array(sw, StringValuePtr(argv[0]));
331
+ }
332
+ break;
333
+ default: rb_raise(rb_eArgError, "Wrong number of argument to 'push_object'."); break;
368
334
  }
369
335
  if (rb_block_given_p()) {
370
- rb_yield(Qnil);
371
- oj_str_writer_pop(sw);
336
+ rb_yield(Qnil);
337
+ oj_str_writer_pop(sw);
372
338
  }
373
339
  return Qnil;
374
340
  }
@@ -380,23 +346,18 @@ str_writer_push_array(int argc, VALUE *argv, VALUE self) {
380
346
  * - *value* [_Object_] value to add to the JSON document
381
347
  * - *key* [_String_] the key if adding to an object in the JSON document
382
348
  */
383
- static VALUE
384
- str_writer_push_value(int argc, VALUE *argv, VALUE self) {
349
+ static VALUE str_writer_push_value(int argc, VALUE *argv, VALUE self) {
385
350
  switch (argc) {
386
- case 1:
387
- oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0);
388
- break;
351
+ case 1: oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0); break;
389
352
  case 2:
390
- if (Qnil == argv[1]) {
391
- oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0);
392
- } else {
393
- rb_check_type(argv[1], T_STRING);
394
- oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, StringValuePtr(argv[1]));
395
- }
396
- break;
397
- default:
398
- rb_raise(rb_eArgError, "Wrong number of argument to 'push_value'.");
399
- break;
353
+ if (Qnil == argv[1]) {
354
+ oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0);
355
+ } else {
356
+ rb_check_type(argv[1], T_STRING);
357
+ oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, StringValuePtr(argv[1]));
358
+ }
359
+ break;
360
+ default: rb_raise(rb_eArgError, "Wrong number of argument to 'push_value'."); break;
400
361
  }
401
362
  return Qnil;
402
363
  }
@@ -410,24 +371,21 @@ str_writer_push_value(int argc, VALUE *argv, VALUE self) {
410
371
  * - *value* [_Object_] value to add to the JSON document
411
372
  * - *key* [_String_] the key if adding to an object in the JSON document
412
373
  */
413
- static VALUE
414
- str_writer_push_json(int argc, VALUE *argv, VALUE self) {
374
+ static VALUE str_writer_push_json(int argc, VALUE *argv, VALUE self) {
415
375
  rb_check_type(argv[0], T_STRING);
416
376
  switch (argc) {
417
- case 1:
418
- oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0);
419
- break;
377
+ case 1: oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0); break;
420
378
  case 2:
421
- if (Qnil == argv[1]) {
422
- oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0);
423
- } else {
424
- rb_check_type(argv[1], T_STRING);
425
- oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), StringValuePtr(argv[1]));
426
- }
427
- break;
428
- default:
429
- rb_raise(rb_eArgError, "Wrong number of argument to 'push_json'.");
430
- break;
379
+ if (Qnil == argv[1]) {
380
+ oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0);
381
+ } else {
382
+ rb_check_type(argv[1], T_STRING);
383
+ oj_str_writer_push_json((StrWriter)DATA_PTR(self),
384
+ StringValuePtr(*argv),
385
+ StringValuePtr(argv[1]));
386
+ }
387
+ break;
388
+ default: rb_raise(rb_eArgError, "Wrong number of argument to 'push_json'."); break;
431
389
  }
432
390
  return Qnil;
433
391
  }
@@ -437,8 +395,7 @@ str_writer_push_json(int argc, VALUE *argv, VALUE self) {
437
395
  * Pops up a level in the JSON document closing the array or object that is
438
396
  * currently open.
439
397
  */
440
- static VALUE
441
- str_writer_pop(VALUE self) {
398
+ static VALUE str_writer_pop(VALUE self) {
442
399
  oj_str_writer_pop((StrWriter)DATA_PTR(self));
443
400
  return Qnil;
444
401
  }
@@ -449,8 +406,7 @@ str_writer_pop(VALUE self) {
449
406
  * Pops all level in the JSON document closing all the array or object that is
450
407
  * currently open.
451
408
  */
452
- static VALUE
453
- str_writer_pop_all(VALUE self) {
409
+ static VALUE str_writer_pop_all(VALUE self) {
454
410
  oj_str_writer_pop_all((StrWriter)DATA_PTR(self));
455
411
 
456
412
  return Qnil;
@@ -461,15 +417,14 @@ str_writer_pop_all(VALUE self) {
461
417
  *
462
418
  * Reset the writer back to the empty state.
463
419
  */
464
- static VALUE
465
- str_writer_reset(VALUE self) {
466
- StrWriter sw = (StrWriter)DATA_PTR(self);
420
+ static VALUE str_writer_reset(VALUE self) {
421
+ StrWriter sw = (StrWriter)DATA_PTR(self);
467
422
 
468
- sw->depth = 0;
469
- *sw->types = '\0';
423
+ sw->depth = 0;
424
+ *sw->types = '\0';
470
425
  sw->keyWritten = 0;
471
- sw->out.cur = sw->out.buf;
472
- *sw->out.cur = '\0';
426
+ sw->out.cur = sw->out.buf;
427
+ *sw->out.cur = '\0';
473
428
 
474
429
  return Qnil;
475
430
  }
@@ -481,10 +436,9 @@ str_writer_reset(VALUE self) {
481
436
  *
482
437
  * *return* [_String_]
483
438
  */
484
- static VALUE
485
- str_writer_to_s(VALUE self) {
486
- StrWriter sw = (StrWriter)DATA_PTR(self);
487
- VALUE rstr = rb_str_new(sw->out.buf, sw->out.cur - sw->out.buf);
439
+ static VALUE str_writer_to_s(VALUE self) {
440
+ StrWriter sw = (StrWriter)DATA_PTR(self);
441
+ VALUE rstr = rb_str_new(sw->out.buf, sw->out.cur - sw->out.buf);
488
442
 
489
443
  return oj_encode(rstr);
490
444
  }
@@ -499,10 +453,9 @@ str_writer_to_s(VALUE self) {
499
453
  *
500
454
  * *return* [_Hash_|_Array_|_String_|_Integer_|_Float_|_True_|_False_|_nil|)
501
455
  */
502
- static VALUE
503
- str_writer_as_json(VALUE self) {
456
+ static VALUE str_writer_as_json(VALUE self) {
504
457
  if (string_writer_optimized) {
505
- return self;
458
+ return self;
506
459
  }
507
460
  return rb_hash_new();
508
461
  }
@@ -516,8 +469,7 @@ str_writer_as_json(VALUE self) {
516
469
  * calling to_s() will return the JSON document. Note tha calling to_s() before
517
470
  * construction is complete will return the document in it's current state.
518
471
  */
519
- void
520
- oj_string_writer_init() {
472
+ void oj_string_writer_init() {
521
473
  oj_string_writer_class = rb_define_class_under(Oj, "StringWriter", rb_cObject);
522
474
  rb_define_module_function(oj_string_writer_class, "new", str_writer_new, -1);
523
475
  rb_define_method(oj_string_writer_class, "push_key", str_writer_push_key, 1);