oj 3.13.21 → 3.13.22

Sign up to get free protection for your applications and to get access to all the features.
data/ext/oj/saj2.c CHANGED
@@ -3,20 +3,10 @@
3
3
  #include "cache.h"
4
4
  #include "oj.h"
5
5
  #include "parser.h"
6
-
7
- typedef struct _delegate {
8
- VALUE handler;
9
- VALUE *keys;
10
- VALUE *tail;
11
- size_t klen;
12
- struct _cache *str_cache;
13
- uint8_t cache_str;
14
- bool cache_keys;
15
- bool thread_safe;
16
- } * Delegate;
6
+ #include "saj2.h"
17
7
 
18
8
  static VALUE get_key(ojParser p) {
19
- Delegate d = (Delegate)p->ctx;
9
+ Saj d = (Saj)p->ctx;
20
10
  const char *key = buf_str(&p->key);
21
11
  size_t len = buf_len(&p->key);
22
12
  volatile VALUE rkey;
@@ -29,7 +19,7 @@ static VALUE get_key(ojParser p) {
29
19
  return rkey;
30
20
  }
31
21
 
32
- static void push_key(Delegate d, VALUE key) {
22
+ static void push_key(Saj d, VALUE key) {
33
23
  if (d->klen <= (size_t)(d->tail - d->keys)) {
34
24
  size_t off = d->tail - d->keys;
35
25
 
@@ -45,15 +35,15 @@ static void noop(ojParser p) {
45
35
  }
46
36
 
47
37
  static void open_object(ojParser p) {
48
- rb_funcall(((Delegate)p->ctx)->handler, oj_hash_start_id, 1, Qnil);
38
+ rb_funcall(((Saj)p->ctx)->handler, oj_hash_start_id, 1, Qnil);
49
39
  }
50
40
 
51
41
  static void open_object_loc(ojParser p) {
52
- rb_funcall(((Delegate)p->ctx)->handler, oj_hash_start_id, 3, Qnil, LONG2FIX(p->line), LONG2FIX(p->cur - p->col));
42
+ rb_funcall(((Saj)p->ctx)->handler, oj_hash_start_id, 3, Qnil, LONG2FIX(p->line), LONG2FIX(p->cur - p->col));
53
43
  }
54
44
 
55
45
  static void open_object_key(ojParser p) {
56
- Delegate d = (Delegate)p->ctx;
46
+ Saj d = (Saj)p->ctx;
57
47
  volatile VALUE key = get_key(p);
58
48
 
59
49
  push_key(d, key);
@@ -61,7 +51,7 @@ static void open_object_key(ojParser p) {
61
51
  }
62
52
 
63
53
  static void open_object_loc_key(ojParser p) {
64
- Delegate d = (Delegate)p->ctx;
54
+ Saj d = (Saj)p->ctx;
65
55
  volatile VALUE key = get_key(p);
66
56
 
67
57
  push_key(d, key);
@@ -69,15 +59,15 @@ static void open_object_loc_key(ojParser p) {
69
59
  }
70
60
 
71
61
  static void open_array(ojParser p) {
72
- rb_funcall(((Delegate)p->ctx)->handler, oj_array_start_id, 1, Qnil);
62
+ rb_funcall(((Saj)p->ctx)->handler, oj_array_start_id, 1, Qnil);
73
63
  }
74
64
 
75
65
  static void open_array_loc(ojParser p) {
76
- rb_funcall(((Delegate)p->ctx)->handler, oj_array_start_id, 3, Qnil, LONG2FIX(p->line), LONG2FIX(p->cur - p->col));
66
+ rb_funcall(((Saj)p->ctx)->handler, oj_array_start_id, 3, Qnil, LONG2FIX(p->line), LONG2FIX(p->cur - p->col));
77
67
  }
78
68
 
79
69
  static void open_array_key(ojParser p) {
80
- Delegate d = (Delegate)p->ctx;
70
+ Saj d = (Saj)p->ctx;
81
71
  volatile VALUE key = get_key(p);
82
72
 
83
73
  push_key(d, key);
@@ -85,7 +75,7 @@ static void open_array_key(ojParser p) {
85
75
  }
86
76
 
87
77
  static void open_array_loc_key(ojParser p) {
88
- Delegate d = (Delegate)p->ctx;
78
+ Saj d = (Saj)p->ctx;
89
79
  volatile VALUE key = get_key(p);
90
80
 
91
81
  push_key(d, key);
@@ -93,7 +83,7 @@ static void open_array_loc_key(ojParser p) {
93
83
  }
94
84
 
95
85
  static void close_object(ojParser p) {
96
- Delegate d = (Delegate)p->ctx;
86
+ Saj d = (Saj)p->ctx;
97
87
  VALUE key = Qnil;
98
88
 
99
89
  if (OBJECT_FUN == p->stack[p->depth]) {
@@ -107,7 +97,7 @@ static void close_object(ojParser p) {
107
97
  }
108
98
 
109
99
  static void close_object_loc(ojParser p) {
110
- Delegate d = (Delegate)p->ctx;
100
+ Saj d = (Saj)p->ctx;
111
101
  VALUE key = Qnil;
112
102
 
113
103
  if (OBJECT_FUN == p->stack[p->depth]) {
@@ -121,7 +111,7 @@ static void close_object_loc(ojParser p) {
121
111
  }
122
112
 
123
113
  static void close_array(ojParser p) {
124
- Delegate d = (Delegate)p->ctx;
114
+ Saj d = (Saj)p->ctx;
125
115
  VALUE key = Qnil;
126
116
 
127
117
  if (OBJECT_FUN == p->stack[p->depth]) {
@@ -135,7 +125,7 @@ static void close_array(ojParser p) {
135
125
  }
136
126
 
137
127
  static void close_array_loc(ojParser p) {
138
- Delegate d = (Delegate)p->ctx;
128
+ Saj d = (Saj)p->ctx;
139
129
  VALUE key = Qnil;
140
130
 
141
131
  if (OBJECT_FUN == p->stack[p->depth]) {
@@ -149,11 +139,11 @@ static void close_array_loc(ojParser p) {
149
139
  }
150
140
 
151
141
  static void add_null(ojParser p) {
152
- rb_funcall(((Delegate)p->ctx)->handler, oj_add_value_id, 2, Qnil, Qnil);
142
+ rb_funcall(((Saj)p->ctx)->handler, oj_add_value_id, 2, Qnil, Qnil);
153
143
  }
154
144
 
155
145
  static void add_null_loc(ojParser p) {
156
- rb_funcall(((Delegate)p->ctx)->handler,
146
+ rb_funcall(((Saj)p->ctx)->handler,
157
147
  oj_add_value_id,
158
148
  4,
159
149
  Qnil,
@@ -163,11 +153,11 @@ static void add_null_loc(ojParser p) {
163
153
  }
164
154
 
165
155
  static void add_null_key(ojParser p) {
166
- rb_funcall(((Delegate)p->ctx)->handler, oj_add_value_id, 2, Qnil, get_key(p));
156
+ rb_funcall(((Saj)p->ctx)->handler, oj_add_value_id, 2, Qnil, get_key(p));
167
157
  }
168
158
 
169
159
  static void add_null_key_loc(ojParser p) {
170
- rb_funcall(((Delegate)p->ctx)->handler,
160
+ rb_funcall(((Saj)p->ctx)->handler,
171
161
  oj_add_value_id,
172
162
  4,
173
163
  Qnil,
@@ -177,11 +167,11 @@ static void add_null_key_loc(ojParser p) {
177
167
  }
178
168
 
179
169
  static void add_true(ojParser p) {
180
- rb_funcall(((Delegate)p->ctx)->handler, oj_add_value_id, 2, Qtrue, Qnil);
170
+ rb_funcall(((Saj)p->ctx)->handler, oj_add_value_id, 2, Qtrue, Qnil);
181
171
  }
182
172
 
183
173
  static void add_true_loc(ojParser p) {
184
- rb_funcall(((Delegate)p->ctx)->handler,
174
+ rb_funcall(((Saj)p->ctx)->handler,
185
175
  oj_add_value_id,
186
176
  4,
187
177
  Qtrue,
@@ -191,11 +181,11 @@ static void add_true_loc(ojParser p) {
191
181
  }
192
182
 
193
183
  static void add_true_key(ojParser p) {
194
- rb_funcall(((Delegate)p->ctx)->handler, oj_add_value_id, 2, Qtrue, get_key(p));
184
+ rb_funcall(((Saj)p->ctx)->handler, oj_add_value_id, 2, Qtrue, get_key(p));
195
185
  }
196
186
 
197
187
  static void add_true_key_loc(ojParser p) {
198
- rb_funcall(((Delegate)p->ctx)->handler,
188
+ rb_funcall(((Saj)p->ctx)->handler,
199
189
  oj_add_value_id,
200
190
  4,
201
191
  Qtrue,
@@ -205,11 +195,11 @@ static void add_true_key_loc(ojParser p) {
205
195
  }
206
196
 
207
197
  static void add_false(ojParser p) {
208
- rb_funcall(((Delegate)p->ctx)->handler, oj_add_value_id, 2, Qfalse, Qnil);
198
+ rb_funcall(((Saj)p->ctx)->handler, oj_add_value_id, 2, Qfalse, Qnil);
209
199
  }
210
200
 
211
201
  static void add_false_loc(ojParser p) {
212
- rb_funcall(((Delegate)p->ctx)->handler,
202
+ rb_funcall(((Saj)p->ctx)->handler,
213
203
  oj_add_value_id,
214
204
  4,
215
205
  Qfalse,
@@ -219,11 +209,11 @@ static void add_false_loc(ojParser p) {
219
209
  }
220
210
 
221
211
  static void add_false_key(ojParser p) {
222
- rb_funcall(((Delegate)p->ctx)->handler, oj_add_value_id, 2, Qfalse, get_key(p));
212
+ rb_funcall(((Saj)p->ctx)->handler, oj_add_value_id, 2, Qfalse, get_key(p));
223
213
  }
224
214
 
225
215
  static void add_false_key_loc(ojParser p) {
226
- rb_funcall(((Delegate)p->ctx)->handler,
216
+ rb_funcall(((Saj)p->ctx)->handler,
227
217
  oj_add_value_id,
228
218
  4,
229
219
  Qfalse,
@@ -233,11 +223,11 @@ static void add_false_key_loc(ojParser p) {
233
223
  }
234
224
 
235
225
  static void add_int(ojParser p) {
236
- rb_funcall(((Delegate)p->ctx)->handler, oj_add_value_id, 2, LONG2NUM(p->num.fixnum), Qnil);
226
+ rb_funcall(((Saj)p->ctx)->handler, oj_add_value_id, 2, LONG2NUM(p->num.fixnum), Qnil);
237
227
  }
238
228
 
239
229
  static void add_int_loc(ojParser p) {
240
- rb_funcall(((Delegate)p->ctx)->handler,
230
+ rb_funcall(((Saj)p->ctx)->handler,
241
231
  oj_add_value_id,
242
232
  4,
243
233
  LONG2NUM(p->num.fixnum),
@@ -247,11 +237,11 @@ static void add_int_loc(ojParser p) {
247
237
  }
248
238
 
249
239
  static void add_int_key(ojParser p) {
250
- rb_funcall(((Delegate)p->ctx)->handler, oj_add_value_id, 2, LONG2NUM(p->num.fixnum), get_key(p));
240
+ rb_funcall(((Saj)p->ctx)->handler, oj_add_value_id, 2, LONG2NUM(p->num.fixnum), get_key(p));
251
241
  }
252
242
 
253
243
  static void add_int_key_loc(ojParser p) {
254
- rb_funcall(((Delegate)p->ctx)->handler,
244
+ rb_funcall(((Saj)p->ctx)->handler,
255
245
  oj_add_value_id,
256
246
  4,
257
247
  LONG2NUM(p->num.fixnum),
@@ -261,11 +251,11 @@ static void add_int_key_loc(ojParser p) {
261
251
  }
262
252
 
263
253
  static void add_float(ojParser p) {
264
- rb_funcall(((Delegate)p->ctx)->handler, oj_add_value_id, 2, rb_float_new(p->num.dub), Qnil);
254
+ rb_funcall(((Saj)p->ctx)->handler, oj_add_value_id, 2, rb_float_new(p->num.dub), Qnil);
265
255
  }
266
256
 
267
257
  static void add_float_loc(ojParser p) {
268
- rb_funcall(((Delegate)p->ctx)->handler,
258
+ rb_funcall(((Saj)p->ctx)->handler,
269
259
  oj_add_value_id,
270
260
  4,
271
261
  rb_float_new(p->num.dub),
@@ -275,11 +265,11 @@ static void add_float_loc(ojParser p) {
275
265
  }
276
266
 
277
267
  static void add_float_key(ojParser p) {
278
- rb_funcall(((Delegate)p->ctx)->handler, oj_add_value_id, 2, rb_float_new(p->num.dub), get_key(p));
268
+ rb_funcall(((Saj)p->ctx)->handler, oj_add_value_id, 2, rb_float_new(p->num.dub), get_key(p));
279
269
  }
280
270
 
281
271
  static void add_float_key_loc(ojParser p) {
282
- rb_funcall(((Delegate)p->ctx)->handler,
272
+ rb_funcall(((Saj)p->ctx)->handler,
283
273
  oj_add_value_id,
284
274
  4,
285
275
  rb_float_new(p->num.dub),
@@ -289,7 +279,7 @@ static void add_float_key_loc(ojParser p) {
289
279
  }
290
280
 
291
281
  static void add_big(ojParser p) {
292
- rb_funcall(((Delegate)p->ctx)->handler,
282
+ rb_funcall(((Saj)p->ctx)->handler,
293
283
  oj_add_value_id,
294
284
  2,
295
285
  rb_funcall(rb_cObject, oj_bigdecimal_id, 1, rb_str_new(buf_str(&p->buf), buf_len(&p->buf))),
@@ -297,7 +287,7 @@ static void add_big(ojParser p) {
297
287
  }
298
288
 
299
289
  static void add_big_loc(ojParser p) {
300
- rb_funcall(((Delegate)p->ctx)->handler,
290
+ rb_funcall(((Saj)p->ctx)->handler,
301
291
  oj_add_value_id,
302
292
  4,
303
293
  rb_funcall(rb_cObject, oj_bigdecimal_id, 1, rb_str_new(buf_str(&p->buf), buf_len(&p->buf))),
@@ -307,7 +297,7 @@ static void add_big_loc(ojParser p) {
307
297
  }
308
298
 
309
299
  static void add_big_key(ojParser p) {
310
- rb_funcall(((Delegate)p->ctx)->handler,
300
+ rb_funcall(((Saj)p->ctx)->handler,
311
301
  oj_add_value_id,
312
302
  2,
313
303
  rb_funcall(rb_cObject, oj_bigdecimal_id, 1, rb_str_new(buf_str(&p->buf), buf_len(&p->buf))),
@@ -315,7 +305,7 @@ static void add_big_key(ojParser p) {
315
305
  }
316
306
 
317
307
  static void add_big_key_loc(ojParser p) {
318
- rb_funcall(((Delegate)p->ctx)->handler,
308
+ rb_funcall(((Saj)p->ctx)->handler,
319
309
  oj_add_value_id,
320
310
  4,
321
311
  rb_funcall(rb_cObject, oj_bigdecimal_id, 1, rb_str_new(buf_str(&p->buf), buf_len(&p->buf))),
@@ -325,7 +315,7 @@ static void add_big_key_loc(ojParser p) {
325
315
  }
326
316
 
327
317
  static void add_str(ojParser p) {
328
- Delegate d = (Delegate)p->ctx;
318
+ Saj d = (Saj)p->ctx;
329
319
  volatile VALUE rstr;
330
320
  const char *str = buf_str(&p->buf);
331
321
  size_t len = buf_len(&p->buf);
@@ -339,7 +329,7 @@ static void add_str(ojParser p) {
339
329
  }
340
330
 
341
331
  static void add_str_loc(ojParser p) {
342
- Delegate d = (Delegate)p->ctx;
332
+ Saj d = (Saj)p->ctx;
343
333
  volatile VALUE rstr;
344
334
  const char *str = buf_str(&p->buf);
345
335
  size_t len = buf_len(&p->buf);
@@ -353,7 +343,7 @@ static void add_str_loc(ojParser p) {
353
343
  }
354
344
 
355
345
  static void add_str_key(ojParser p) {
356
- Delegate d = (Delegate)p->ctx;
346
+ Saj d = (Saj)p->ctx;
357
347
  volatile VALUE rstr;
358
348
  const char *str = buf_str(&p->buf);
359
349
  size_t len = buf_len(&p->buf);
@@ -367,7 +357,7 @@ static void add_str_key(ojParser p) {
367
357
  }
368
358
 
369
359
  static void add_str_key_loc(ojParser p) {
370
- Delegate d = (Delegate)p->ctx;
360
+ Saj d = (Saj)p->ctx;
371
361
  volatile VALUE rstr;
372
362
  const char *str = buf_str(&p->buf);
373
363
  size_t len = buf_len(&p->buf);
@@ -400,7 +390,7 @@ static void reset(ojParser p) {
400
390
  }
401
391
 
402
392
  static VALUE option(ojParser p, const char *key, VALUE value) {
403
- Delegate d = (Delegate)p->ctx;
393
+ Saj d = (Saj)p->ctx;
404
394
 
405
395
  if (0 == strcmp(key, "handler")) {
406
396
  return d->handler;
@@ -537,7 +527,7 @@ static VALUE option(ojParser p, const char *key, VALUE value) {
537
527
 
538
528
  return INT2NUM((int)d->cache_str);
539
529
  }
540
- rb_raise(rb_eArgError, "%s is not an option for the SAJ (Simple API for JSON) delegate", key);
530
+ rb_raise(rb_eArgError, "%s is not an option for the SAJ (Simple API for JSON) saj", key);
541
531
 
542
532
  return Qnil; // Never reached due to the raise but required by the compiler.
543
533
  }
@@ -547,13 +537,13 @@ static VALUE result(ojParser p) {
547
537
  }
548
538
 
549
539
  static void start(ojParser p) {
550
- Delegate d = (Delegate)p->ctx;
540
+ Saj d = (Saj)p->ctx;
551
541
 
552
542
  d->tail = d->keys;
553
543
  }
554
544
 
555
545
  static void dfree(ojParser p) {
556
- Delegate d = (Delegate)p->ctx;
546
+ Saj d = (Saj)p->ctx;
557
547
 
558
548
  if (NULL != d->keys) {
559
549
  xfree(d->keys);
@@ -563,10 +553,10 @@ static void dfree(ojParser p) {
563
553
  }
564
554
 
565
555
  static void mark(ojParser p) {
566
- if (NULL == p->ctx) {
556
+ if (NULL == p || NULL == p->ctx) {
567
557
  return;
568
558
  }
569
- Delegate d = (Delegate)p->ctx;
559
+ Saj d = (Saj)p->ctx;
570
560
  VALUE *kp;
571
561
 
572
562
  cache_mark(d->str_cache);
@@ -584,9 +574,7 @@ static VALUE form_str(const char *str, size_t len) {
584
574
  return rb_str_freeze(rb_utf8_str_new(str, len));
585
575
  }
586
576
 
587
- void oj_set_parser_saj(ojParser p) {
588
- Delegate d = ALLOC(struct _delegate);
589
-
577
+ void oj_init_saj(ojParser p, Saj d) {
590
578
  d->klen = 256;
591
579
  d->keys = ALLOC_N(VALUE, d->klen);
592
580
  d->tail = d->keys;
@@ -600,3 +588,9 @@ void oj_set_parser_saj(ojParser p) {
600
588
  p->mark = mark;
601
589
  p->start = start;
602
590
  }
591
+
592
+ void oj_set_parser_saj(ojParser p) {
593
+ Saj d = ALLOC(struct _saj);
594
+
595
+ oj_init_saj(p, d);
596
+ }
data/ext/oj/saj2.h ADDED
@@ -0,0 +1,23 @@
1
+ // Copyright (c) 2021, Peter Ohler, All rights reserved.
2
+
3
+ #include <ruby.h>
4
+ #include <stdbool.h>
5
+
6
+ struct _cache;
7
+ struct _ojParser;
8
+
9
+ typedef struct _saj {
10
+ VALUE handler;
11
+ VALUE *keys;
12
+ VALUE *tail;
13
+ size_t klen;
14
+ struct _cache *str_cache;
15
+ uint8_t cache_str;
16
+ bool cache_keys;
17
+ bool thread_safe;
18
+ } * Saj;
19
+
20
+ // Initialize the parser with the SAJ delegate. If the SAJ delegate is wrapped
21
+ // then this function is called first and then the parser functions can be
22
+ // replaced.
23
+ extern void oj_init_saj(struct _ojParser *p, Saj d);