oj 3.14.1 → 3.14.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/ext/oj/buf.h +6 -5
- data/ext/oj/cache.c +11 -10
- data/ext/oj/cache8.c +3 -2
- data/ext/oj/circarray.c +6 -5
- data/ext/oj/compat.c +2 -1
- data/ext/oj/custom.c +3 -2
- data/ext/oj/dump.c +4 -3
- data/ext/oj/dump_object.c +3 -2
- data/ext/oj/fast.c +11 -10
- data/ext/oj/intern.c +7 -5
- data/ext/oj/mem.c +324 -0
- data/ext/oj/mem.h +53 -0
- data/ext/oj/mimic_json.c +3 -2
- data/ext/oj/object.c +2 -2
- data/ext/oj/odd.c +7 -6
- data/ext/oj/oj.c +12 -5
- data/ext/oj/parse.c +14 -12
- data/ext/oj/parser.c +6 -6
- data/ext/oj/rails.c +9 -8
- data/ext/oj/reader.c +3 -2
- data/ext/oj/reader.h +3 -1
- data/ext/oj/rxclass.c +5 -4
- data/ext/oj/saj.c +6 -5
- data/ext/oj/saj2.c +6 -5
- data/ext/oj/sparse.c +5 -4
- data/ext/oj/stream_writer.c +5 -4
- data/ext/oj/string_writer.c +7 -6
- data/ext/oj/usual.c +28 -27
- data/ext/oj/val_stack.h +4 -3
- data/lib/oj/version.rb +1 -1
- data/test/foo.rb +48 -3
- data/test/perf_parser.rb +1 -0
- metadata +5 -3
data/ext/oj/parser.c
CHANGED
@@ -1148,7 +1148,7 @@ static void parser_free(void *ptr) {
|
|
1148
1148
|
if (NULL != p->free) {
|
1149
1149
|
p->free(p);
|
1150
1150
|
}
|
1151
|
-
|
1151
|
+
OJ_R_FREE(ptr);
|
1152
1152
|
}
|
1153
1153
|
|
1154
1154
|
static void parser_mark(void *ptr) {
|
@@ -1205,7 +1205,7 @@ static int opt_cb(VALUE rkey, VALUE value, VALUE ptr) {
|
|
1205
1205
|
* Oj::Parser.new(:usual, cache_keys: true).
|
1206
1206
|
*/
|
1207
1207
|
static VALUE parser_new(int argc, VALUE *argv, VALUE self) {
|
1208
|
-
ojParser p =
|
1208
|
+
ojParser p = OJ_R_ALLOC(struct _ojParser);
|
1209
1209
|
|
1210
1210
|
#if HAVE_RB_EXT_RACTOR_SAFE
|
1211
1211
|
// This doesn't seem to do anything.
|
@@ -1264,7 +1264,7 @@ static VALUE parser_new(int argc, VALUE *argv, VALUE self) {
|
|
1264
1264
|
// used. Optionally oj_parser_set_options can be called if the options are not
|
1265
1265
|
// set directly.
|
1266
1266
|
VALUE oj_parser_new(void) {
|
1267
|
-
ojParser p =
|
1267
|
+
ojParser p = OJ_R_ALLOC(struct _ojParser);
|
1268
1268
|
|
1269
1269
|
#if HAVE_RB_EXT_RACTOR_SAFE
|
1270
1270
|
// This doesn't seem to do anything.
|
@@ -1499,7 +1499,7 @@ static VALUE usual_parser = Qundef;
|
|
1499
1499
|
*/
|
1500
1500
|
static VALUE parser_usual(VALUE self) {
|
1501
1501
|
if (Qundef == usual_parser) {
|
1502
|
-
ojParser p =
|
1502
|
+
ojParser p = OJ_R_ALLOC(struct _ojParser);
|
1503
1503
|
|
1504
1504
|
memset(p, 0, sizeof(struct _ojParser));
|
1505
1505
|
buf_init(&p->key);
|
@@ -1522,7 +1522,7 @@ static VALUE saj_parser = Qundef;
|
|
1522
1522
|
*/
|
1523
1523
|
static VALUE parser_saj(VALUE self) {
|
1524
1524
|
if (Qundef == saj_parser) {
|
1525
|
-
ojParser p =
|
1525
|
+
ojParser p = OJ_R_ALLOC(struct _ojParser);
|
1526
1526
|
|
1527
1527
|
memset(p, 0, sizeof(struct _ojParser));
|
1528
1528
|
buf_init(&p->key);
|
@@ -1544,7 +1544,7 @@ static VALUE validate_parser = Qundef;
|
|
1544
1544
|
*/
|
1545
1545
|
static VALUE parser_validate(VALUE self) {
|
1546
1546
|
if (Qundef == validate_parser) {
|
1547
|
-
ojParser p =
|
1547
|
+
ojParser p = OJ_R_ALLOC(struct _ojParser);
|
1548
1548
|
|
1549
1549
|
memset(p, 0, sizeof(struct _ojParser));
|
1550
1550
|
buf_init(&p->key);
|
data/ext/oj/rails.c
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
#include "rails.h"
|
5
5
|
|
6
|
+
#include "mem.h"
|
6
7
|
#include "code.h"
|
7
8
|
#include "encode.h"
|
8
9
|
#include "trace.h"
|
@@ -76,7 +77,7 @@ static ROptTable copy_opts(ROptTable src, ROptTable dest) {
|
|
76
77
|
if (NULL == src->table) {
|
77
78
|
dest->table = NULL;
|
78
79
|
} else {
|
79
|
-
dest->table =
|
80
|
+
dest->table = OJ_R_ALLOC_N(struct _rOpt, dest->alen);
|
80
81
|
memcpy(dest->table, src->table, sizeof(struct _rOpt) * dest->alen);
|
81
82
|
}
|
82
83
|
return NULL;
|
@@ -373,7 +374,7 @@ static StrLen columns_array(VALUE rcols, int *ccnt) {
|
|
373
374
|
int cnt = (int)RARRAY_LEN(rcols);
|
374
375
|
|
375
376
|
*ccnt = cnt;
|
376
|
-
cols =
|
377
|
+
cols = OJ_R_ALLOC_N(struct _strLen, cnt);
|
377
378
|
for (i = 0, cp = cols; i < cnt; i++, cp++) {
|
378
379
|
v = RARRAY_AREF(rcols, i);
|
379
380
|
if (T_STRING != rb_type(v)) {
|
@@ -481,7 +482,7 @@ static void dump_activerecord_result(VALUE obj, int depth, Out out, bool as_ok)
|
|
481
482
|
*out->cur++ = ',';
|
482
483
|
}
|
483
484
|
}
|
484
|
-
|
485
|
+
OJ_R_FREE(cols);
|
485
486
|
size = depth * out->indent + 1;
|
486
487
|
assure_size(out, size);
|
487
488
|
if (out->opts->dump_opts.use) {
|
@@ -583,11 +584,11 @@ static ROpt create_opt(ROptTable rot, VALUE clas) {
|
|
583
584
|
rot->len++;
|
584
585
|
if (NULL == rot->table) {
|
585
586
|
rot->alen = 256;
|
586
|
-
rot->table =
|
587
|
+
rot->table = OJ_R_ALLOC_N(struct _rOpt, rot->alen);
|
587
588
|
memset(rot->table, 0, sizeof(struct _rOpt) * rot->alen);
|
588
589
|
} else if (rot->alen <= rot->len) {
|
589
590
|
rot->alen *= 2;
|
590
|
-
|
591
|
+
OJ_R_REALLOC_N(rot->table, struct _rOpt, rot->alen);
|
591
592
|
memset(rot->table + olen, 0, sizeof(struct _rOpt) * olen);
|
592
593
|
}
|
593
594
|
if (0 == olen) {
|
@@ -640,9 +641,9 @@ static void encoder_free(void *ptr) {
|
|
640
641
|
Encoder e = (Encoder)ptr;
|
641
642
|
|
642
643
|
if (NULL != e->ropts.table) {
|
643
|
-
|
644
|
+
OJ_R_FREE(e->ropts.table);
|
644
645
|
}
|
645
|
-
|
646
|
+
OJ_R_FREE(ptr);
|
646
647
|
}
|
647
648
|
}
|
648
649
|
|
@@ -663,7 +664,7 @@ static void encoder_mark(void *ptr) {
|
|
663
664
|
* - *options* [_Hash_] formatting options
|
664
665
|
*/
|
665
666
|
static VALUE encoder_new(int argc, VALUE *argv, VALUE self) {
|
666
|
-
Encoder e =
|
667
|
+
Encoder e = OJ_R_ALLOC(struct _encoder);
|
667
668
|
|
668
669
|
e->opts = oj_default_options;
|
669
670
|
e->arg = Qnil;
|
data/ext/oj/reader.c
CHANGED
@@ -14,6 +14,7 @@
|
|
14
14
|
#include <time.h>
|
15
15
|
#include <unistd.h>
|
16
16
|
|
17
|
+
#include "mem.h"
|
17
18
|
#include "oj.h"
|
18
19
|
#include "reader.h"
|
19
20
|
#include "ruby.h"
|
@@ -107,10 +108,10 @@ int oj_reader_read(Reader reader) {
|
|
107
108
|
size_t size = reader->end - reader->head + BUF_PAD;
|
108
109
|
|
109
110
|
if (reader->head == reader->base) {
|
110
|
-
reader->head =
|
111
|
+
reader->head = OJ_R_ALLOC_N(char, size * 2);
|
111
112
|
memcpy((char *)reader->head, old, size);
|
112
113
|
} else {
|
113
|
-
|
114
|
+
OJ_R_REALLOC_N(reader->head, char, size * 2);
|
114
115
|
}
|
115
116
|
reader->free_head = 1;
|
116
117
|
reader->end = reader->head + size * 2 - BUF_PAD;
|
data/ext/oj/reader.h
CHANGED
@@ -4,6 +4,8 @@
|
|
4
4
|
#ifndef OJ_READER_H
|
5
5
|
#define OJ_READER_H
|
6
6
|
|
7
|
+
#include "mem.h"
|
8
|
+
|
7
9
|
typedef struct _reader {
|
8
10
|
char base[0x00001000];
|
9
11
|
char *head;
|
@@ -114,7 +116,7 @@ static inline int reader_expect(Reader reader, const char *s) {
|
|
114
116
|
|
115
117
|
static inline void reader_cleanup(Reader reader) {
|
116
118
|
if (reader->free_head && 0 != reader->head) {
|
117
|
-
|
119
|
+
OJ_R_FREE((char *)reader->head);
|
118
120
|
reader->head = 0;
|
119
121
|
reader->free_head = 0;
|
120
122
|
}
|
data/ext/oj/rxclass.c
CHANGED
@@ -10,6 +10,7 @@
|
|
10
10
|
#include <regex.h>
|
11
11
|
#endif
|
12
12
|
|
13
|
+
#include "mem.h"
|
13
14
|
#include "rxclass.h"
|
14
15
|
|
15
16
|
typedef struct _rxC {
|
@@ -37,13 +38,13 @@ void oj_rxclass_cleanup(RxClass rc) {
|
|
37
38
|
if (Qnil == rxc->rrx) {
|
38
39
|
regfree(&rxc->rx);
|
39
40
|
}
|
40
|
-
|
41
|
+
OJ_R_FREE(rxc);
|
41
42
|
#endif
|
42
43
|
}
|
43
44
|
}
|
44
45
|
|
45
46
|
void oj_rxclass_rappend(RxClass rc, VALUE rx, VALUE clas) {
|
46
|
-
RxC rxc =
|
47
|
+
RxC rxc = OJ_R_ALLOC_N(struct _rxC, 1);
|
47
48
|
|
48
49
|
memset(rxc, 0, sizeof(struct _rxC));
|
49
50
|
rxc->rrx = rx;
|
@@ -70,7 +71,7 @@ int oj_rxclass_append(RxClass rc, const char *expr, VALUE clas) {
|
|
70
71
|
(unsigned long)sizeof(rxc->src));
|
71
72
|
return EINVAL;
|
72
73
|
}
|
73
|
-
rxc =
|
74
|
+
rxc = OJ_R_ALLOC_N(struct _rxC, 1);
|
74
75
|
rxc->next = 0;
|
75
76
|
rxc->clas = clas;
|
76
77
|
|
@@ -80,7 +81,7 @@ int oj_rxclass_append(RxClass rc, const char *expr, VALUE clas) {
|
|
80
81
|
rxc->rrx = Qnil;
|
81
82
|
if (0 != (err = regcomp(&rxc->rx, expr, flags))) {
|
82
83
|
regerror(err, &rxc->rx, rc->err, sizeof(rc->err));
|
83
|
-
|
84
|
+
OJ_FREE(rxc);
|
84
85
|
return err;
|
85
86
|
}
|
86
87
|
#endif
|
data/ext/oj/saj.c
CHANGED
@@ -14,6 +14,7 @@
|
|
14
14
|
// Workaround in case INFINITY is not defined in math.h or if the OS is CentOS
|
15
15
|
#define OJ_INFINITY (1.0 / 0.0)
|
16
16
|
|
17
|
+
#include "mem.h"
|
17
18
|
#include "encode.h"
|
18
19
|
#include "oj.h"
|
19
20
|
|
@@ -631,7 +632,7 @@ oj_saj_parse(int argc, VALUE *argv, VALUE self) {
|
|
631
632
|
if (rb_type(input) == T_STRING) {
|
632
633
|
// the json string gets modified so make a copy of it
|
633
634
|
len = RSTRING_LEN(input) + 1;
|
634
|
-
json =
|
635
|
+
json = OJ_R_ALLOC_N(char, len);
|
635
636
|
strcpy(json, StringValuePtr(input));
|
636
637
|
} else {
|
637
638
|
VALUE clas = rb_obj_class(input);
|
@@ -640,7 +641,7 @@ oj_saj_parse(int argc, VALUE *argv, VALUE self) {
|
|
640
641
|
if (oj_stringio_class == clas) {
|
641
642
|
s = rb_funcall2(input, oj_string_id, 0, 0);
|
642
643
|
len = RSTRING_LEN(s) + 1;
|
643
|
-
json =
|
644
|
+
json = OJ_R_ALLOC_N(char, len);
|
644
645
|
strcpy(json, rb_string_value_cstr((VALUE *)&s));
|
645
646
|
#if !IS_WINDOWS
|
646
647
|
} else if (rb_cFile == clas && 0 == FIX2INT(rb_funcall(input, oj_pos_id, 0))) {
|
@@ -649,7 +650,7 @@ oj_saj_parse(int argc, VALUE *argv, VALUE self) {
|
|
649
650
|
|
650
651
|
len = lseek(fd, 0, SEEK_END);
|
651
652
|
lseek(fd, 0, SEEK_SET);
|
652
|
-
json =
|
653
|
+
json = OJ_R_ALLOC_N(char, len + 1);
|
653
654
|
if (0 >= (cnt = read(fd, json, len)) || cnt != (ssize_t)len) {
|
654
655
|
rb_raise(rb_eIOError, "failed to read from IO Object.");
|
655
656
|
}
|
@@ -658,14 +659,14 @@ oj_saj_parse(int argc, VALUE *argv, VALUE self) {
|
|
658
659
|
} else if (rb_respond_to(input, oj_read_id)) {
|
659
660
|
s = rb_funcall2(input, oj_read_id, 0, 0);
|
660
661
|
len = RSTRING_LEN(s) + 1;
|
661
|
-
json =
|
662
|
+
json = OJ_R_ALLOC_N(char, len);
|
662
663
|
strcpy(json, rb_string_value_cstr((VALUE *)&s));
|
663
664
|
} else {
|
664
665
|
rb_raise(rb_eArgError, "saj_parse() expected a String or IO Object.");
|
665
666
|
}
|
666
667
|
}
|
667
668
|
saj_parse(*argv, json);
|
668
|
-
|
669
|
+
OJ_R_FREE(json);
|
669
670
|
|
670
671
|
return Qnil;
|
671
672
|
}
|
data/ext/oj/saj2.c
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
// Copyright (c) 2021, Peter Ohler, All rights reserved.
|
2
2
|
|
3
|
+
#include "mem.h"
|
3
4
|
#include "cache.h"
|
4
5
|
#include "oj.h"
|
5
6
|
#include "parser.h"
|
@@ -24,7 +25,7 @@ static void push_key(Saj d, VALUE key) {
|
|
24
25
|
size_t off = d->tail - d->keys;
|
25
26
|
|
26
27
|
d->klen += d->klen / 2;
|
27
|
-
|
28
|
+
OJ_R_REALLOC_N(d->keys, VALUE, d->klen);
|
28
29
|
d->tail = d->keys + off;
|
29
30
|
}
|
30
31
|
*d->tail = key;
|
@@ -546,10 +547,10 @@ static void dfree(ojParser p) {
|
|
546
547
|
Saj d = (Saj)p->ctx;
|
547
548
|
|
548
549
|
if (NULL != d->keys) {
|
549
|
-
|
550
|
+
OJ_R_FREE(d->keys);
|
550
551
|
}
|
551
552
|
cache_free(d->str_cache);
|
552
|
-
|
553
|
+
OJ_R_FREE(p->ctx);
|
553
554
|
}
|
554
555
|
|
555
556
|
static void mark(ojParser p) {
|
@@ -576,7 +577,7 @@ static VALUE form_str(const char *str, size_t len) {
|
|
576
577
|
|
577
578
|
void oj_init_saj(ojParser p, Saj d) {
|
578
579
|
d->klen = 256;
|
579
|
-
d->keys =
|
580
|
+
d->keys = OJ_R_ALLOC_N(VALUE, d->klen);
|
580
581
|
d->tail = d->keys;
|
581
582
|
d->handler = Qnil;
|
582
583
|
d->str_cache = cache_create(0, form_str, true, false);
|
@@ -594,7 +595,7 @@ void oj_init_saj(ojParser p, Saj d) {
|
|
594
595
|
}
|
595
596
|
|
596
597
|
void oj_set_parser_saj(ojParser p) {
|
597
|
-
Saj d =
|
598
|
+
Saj d = OJ_R_ALLOC(struct _saj);
|
598
599
|
|
599
600
|
oj_init_saj(p, d);
|
600
601
|
}
|
data/ext/oj/sparse.c
CHANGED
@@ -7,6 +7,7 @@
|
|
7
7
|
#include <string.h>
|
8
8
|
#include <unistd.h>
|
9
9
|
|
10
|
+
#include "mem.h"
|
10
11
|
#include "buf.h"
|
11
12
|
#include "encode.h"
|
12
13
|
#include "intern.h" // for oj_strndup()
|
@@ -71,7 +72,7 @@ static void add_value(ParseInfo pi, VALUE rval) {
|
|
71
72
|
case NEXT_HASH_VALUE:
|
72
73
|
pi->hash_set_value(pi, parent, rval);
|
73
74
|
if (parent->kalloc) {
|
74
|
-
|
75
|
+
OJ_R_FREE((char *)parent->key);
|
75
76
|
}
|
76
77
|
parent->key = 0;
|
77
78
|
parent->kalloc = 0;
|
@@ -110,7 +111,7 @@ static void add_num_value(ParseInfo pi, NumInfo ni) {
|
|
110
111
|
case NEXT_HASH_VALUE:
|
111
112
|
pi->hash_set_num(pi, parent, ni);
|
112
113
|
if (parent->kalloc) {
|
113
|
-
|
114
|
+
OJ_R_FREE((char *)parent->key);
|
114
115
|
}
|
115
116
|
parent->key = 0;
|
116
117
|
parent->kalloc = 0;
|
@@ -315,7 +316,7 @@ static void read_escaped_str(ParseInfo pi) {
|
|
315
316
|
case NEXT_HASH_VALUE:
|
316
317
|
pi->hash_set_cstr(pi, parent, buf.head, buf_len(&buf), pi->rd.str);
|
317
318
|
if (parent->kalloc) {
|
318
|
-
|
319
|
+
OJ_R_FREE((char *)parent->key);
|
319
320
|
}
|
320
321
|
parent->key = 0;
|
321
322
|
parent->kalloc = 0;
|
@@ -386,7 +387,7 @@ static void read_str(ParseInfo pi) {
|
|
386
387
|
case NEXT_HASH_VALUE:
|
387
388
|
pi->hash_set_cstr(pi, parent, pi->rd.str, pi->rd.tail - pi->rd.str - 1, pi->rd.str);
|
388
389
|
if (parent->kalloc) {
|
389
|
-
|
390
|
+
OJ_R_FREE((char *)parent->key);
|
390
391
|
}
|
391
392
|
parent->key = 0;
|
392
393
|
parent->kalloc = 0;
|
data/ext/oj/stream_writer.c
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
#include <errno.h>
|
5
5
|
#include <ruby.h>
|
6
6
|
|
7
|
+
#include "mem.h"
|
7
8
|
#include "encode.h"
|
8
9
|
|
9
10
|
extern VALUE Oj;
|
@@ -15,9 +16,9 @@ static void stream_writer_free(void *ptr) {
|
|
15
16
|
return;
|
16
17
|
}
|
17
18
|
sw = (StreamWriter)ptr;
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
OJ_R_FREE(sw->sw.out.buf);
|
20
|
+
OJ_R_FREE(sw->sw.types);
|
21
|
+
OJ_R_FREE(ptr);
|
21
22
|
}
|
22
23
|
|
23
24
|
static void stream_writer_reset_buf(StreamWriter sw) {
|
@@ -91,7 +92,7 @@ static VALUE stream_writer_new(int argc, VALUE *argv, VALUE self) {
|
|
91
92
|
} else {
|
92
93
|
rb_raise(rb_eArgError, "expected an IO Object.");
|
93
94
|
}
|
94
|
-
sw =
|
95
|
+
sw = OJ_R_ALLOC(struct _streamWriter);
|
95
96
|
if (2 == argc && T_HASH == rb_type(argv[1])) {
|
96
97
|
volatile VALUE v;
|
97
98
|
int buf_size = 0;
|
data/ext/oj/string_writer.c
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
// Copyright (c) 2012, 2017 Peter Ohler. All rights reserved.
|
2
2
|
// Licensed under the MIT License. See LICENSE file in the project root for license details.
|
3
3
|
|
4
|
+
#include "mem.h"
|
4
5
|
#include "dump.h"
|
5
6
|
#include "encode.h"
|
6
7
|
|
@@ -20,7 +21,7 @@ static void push_type(StrWriter sw, DumpType type) {
|
|
20
21
|
if (sw->types_end <= sw->types + sw->depth + 1) {
|
21
22
|
size_t size = (sw->types_end - sw->types) * 2;
|
22
23
|
|
23
|
-
|
24
|
+
OJ_R_REALLOC_N(sw->types, char, size);
|
24
25
|
sw->types_end = sw->types + size;
|
25
26
|
}
|
26
27
|
sw->depth++;
|
@@ -43,7 +44,7 @@ static void maybe_comma(StrWriter sw) {
|
|
43
44
|
void oj_str_writer_init(StrWriter sw, int buf_size) {
|
44
45
|
sw->opts = oj_default_options;
|
45
46
|
sw->depth = 0;
|
46
|
-
sw->types =
|
47
|
+
sw->types = OJ_R_ALLOC_N(char, 256);
|
47
48
|
sw->types_end = sw->types + 256;
|
48
49
|
*sw->types = '\0';
|
49
50
|
sw->keyWritten = 0;
|
@@ -55,7 +56,7 @@ void oj_str_writer_init(StrWriter sw, int buf_size) {
|
|
55
56
|
}
|
56
57
|
// Must be allocated. Using the out.stack_buffer results in double frees
|
57
58
|
// and I haven't figured out why yet.
|
58
|
-
sw->out.buf =
|
59
|
+
sw->out.buf = OJ_R_ALLOC_N(char, buf_size);
|
59
60
|
sw->out.cur = sw->out.buf;
|
60
61
|
sw->out.end = sw->out.buf + buf_size - BUFFER_EXTRA;
|
61
62
|
sw->out.allocated = true;
|
@@ -235,8 +236,8 @@ static void str_writer_free(void *ptr) {
|
|
235
236
|
|
236
237
|
oj_out_free(&sw->out);
|
237
238
|
|
238
|
-
|
239
|
-
|
239
|
+
OJ_R_FREE(sw->types);
|
240
|
+
OJ_R_FREE(ptr);
|
240
241
|
}
|
241
242
|
|
242
243
|
/* Document-method: new
|
@@ -256,7 +257,7 @@ static void str_writer_free(void *ptr) {
|
|
256
257
|
* - *options* [_Hash_] formatting options
|
257
258
|
*/
|
258
259
|
static VALUE str_writer_new(int argc, VALUE *argv, VALUE self) {
|
259
|
-
StrWriter sw =
|
260
|
+
StrWriter sw = OJ_R_ALLOC(struct _strWriter);
|
260
261
|
|
261
262
|
oj_str_writer_init(sw, 0);
|
262
263
|
if (1 == argc) {
|
data/ext/oj/usual.c
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
// Copyright (c) 2021, Peter Ohler, All rights reserved.
|
2
2
|
|
3
|
+
#include "mem.h"
|
3
4
|
#include "cache.h"
|
4
5
|
#include "oj.h"
|
5
6
|
#include "parser.h"
|
@@ -34,7 +35,7 @@ static ID ltlt_id = 0;
|
|
34
35
|
static ID hset_id = 0;
|
35
36
|
|
36
37
|
static char *str_dup(const char *s, size_t len) {
|
37
|
-
char *d =
|
38
|
+
char *d = OJ_R_ALLOC_N(char, len + 1);
|
38
39
|
|
39
40
|
memcpy(d, s, len);
|
40
41
|
d[len] = '\0';
|
@@ -54,7 +55,7 @@ static VALUE form_attr(const char *str, size_t len) {
|
|
54
55
|
char buf[256];
|
55
56
|
|
56
57
|
if (sizeof(buf) - 2 <= len) {
|
57
|
-
char *b =
|
58
|
+
char *b = OJ_R_ALLOC_N(char, len + 2);
|
58
59
|
ID id;
|
59
60
|
|
60
61
|
*b = '@';
|
@@ -62,7 +63,7 @@ static VALUE form_attr(const char *str, size_t len) {
|
|
62
63
|
b[len + 1] = '\0';
|
63
64
|
|
64
65
|
id = rb_intern3(buf, len + 1, oj_utf8_encoding);
|
65
|
-
|
66
|
+
OJ_R_FREE(b);
|
66
67
|
return id;
|
67
68
|
}
|
68
69
|
*buf = '@';
|
@@ -130,7 +131,7 @@ static void assure_cstack(Usual d) {
|
|
130
131
|
long pos = d->ctail - d->chead;
|
131
132
|
|
132
133
|
cap *= 2;
|
133
|
-
|
134
|
+
OJ_R_REALLOC_N(d->chead, struct _col, cap);
|
134
135
|
d->ctail = d->chead + pos;
|
135
136
|
d->cend = d->chead + cap;
|
136
137
|
}
|
@@ -144,7 +145,7 @@ static void push(ojParser p, VALUE v) {
|
|
144
145
|
long pos = d->vtail - d->vhead;
|
145
146
|
|
146
147
|
cap *= 2;
|
147
|
-
|
148
|
+
OJ_R_REALLOC_N(d->vhead, VALUE, cap);
|
148
149
|
d->vtail = d->vhead + pos;
|
149
150
|
d->vend = d->vhead + cap;
|
150
151
|
}
|
@@ -194,7 +195,7 @@ static void push_key(ojParser p) {
|
|
194
195
|
long pos = d->ktail - d->khead;
|
195
196
|
|
196
197
|
cap *= 2;
|
197
|
-
|
198
|
+
OJ_R_REALLOC_N(d->khead, union _key, cap);
|
198
199
|
d->ktail = d->khead + pos;
|
199
200
|
d->kend = d->khead + cap;
|
200
201
|
}
|
@@ -216,7 +217,7 @@ static void push2(ojParser p, VALUE v) {
|
|
216
217
|
long pos = d->vtail - d->vhead;
|
217
218
|
|
218
219
|
cap *= 2;
|
219
|
-
|
220
|
+
OJ_R_REALLOC_N(d->vhead, VALUE, cap);
|
220
221
|
d->vtail = d->vhead + pos;
|
221
222
|
d->vend = d->vhead + cap;
|
222
223
|
}
|
@@ -283,7 +284,7 @@ static void close_object(ojParser p) {
|
|
283
284
|
for (vp = head; kp < d->ktail; kp++, vp += 2) {
|
284
285
|
*vp = d->get_key(p, kp);
|
285
286
|
if (sizeof(kp->buf) <= (size_t)kp->len) {
|
286
|
-
|
287
|
+
OJ_R_FREE(kp->key);
|
287
288
|
}
|
288
289
|
}
|
289
290
|
rb_hash_bulk_insert(d->vtail - head, head, obj);
|
@@ -291,7 +292,7 @@ static void close_object(ojParser p) {
|
|
291
292
|
for (vp = head; kp < d->ktail; kp++, vp += 2) {
|
292
293
|
rb_hash_aset(obj, d->get_key(p, kp), *(vp + 1));
|
293
294
|
if (sizeof(kp->buf) <= (size_t)kp->len) {
|
294
|
-
|
295
|
+
OJ_R_FREE(kp->key);
|
295
296
|
}
|
296
297
|
}
|
297
298
|
#endif
|
@@ -315,7 +316,7 @@ static void close_object_class(ojParser p) {
|
|
315
316
|
for (vp = head; kp < d->ktail; kp++, vp += 2) {
|
316
317
|
rb_funcall(obj, hset_id, 2, d->get_key(p, kp), *(vp + 1));
|
317
318
|
if (sizeof(kp->buf) <= (size_t)kp->len) {
|
318
|
-
|
319
|
+
OJ_R_FREE(kp->key);
|
319
320
|
}
|
320
321
|
}
|
321
322
|
d->ktail = d->khead + c->ki;
|
@@ -343,7 +344,7 @@ static void close_object_create(ojParser p) {
|
|
343
344
|
for (vp = head; kp < d->ktail; kp++, vp += 2) {
|
344
345
|
*vp = d->get_key(p, kp);
|
345
346
|
if (sizeof(kp->buf) <= (size_t)kp->len) {
|
346
|
-
|
347
|
+
OJ_R_FREE(kp->key);
|
347
348
|
}
|
348
349
|
}
|
349
350
|
rb_hash_bulk_insert(d->vtail - head, head, obj);
|
@@ -351,7 +352,7 @@ static void close_object_create(ojParser p) {
|
|
351
352
|
for (vp = head; kp < d->ktail; kp++, vp += 2) {
|
352
353
|
rb_hash_aset(obj, d->get_key(p, kp), *(vp + 1));
|
353
354
|
if (sizeof(kp->buf) <= (size_t)kp->len) {
|
354
|
-
|
355
|
+
OJ_R_FREE(kp->key);
|
355
356
|
}
|
356
357
|
}
|
357
358
|
#endif
|
@@ -360,7 +361,7 @@ static void close_object_create(ojParser p) {
|
|
360
361
|
for (vp = head; kp < d->ktail; kp++, vp += 2) {
|
361
362
|
rb_funcall(obj, hset_id, 2, d->get_key(p, kp), *(vp + 1));
|
362
363
|
if (sizeof(kp->buf) <= (size_t)kp->len) {
|
363
|
-
|
364
|
+
OJ_R_FREE(kp->key);
|
364
365
|
}
|
365
366
|
}
|
366
367
|
}
|
@@ -375,7 +376,7 @@ static void close_object_create(ojParser p) {
|
|
375
376
|
for (vp = head; kp < d->ktail; kp++, vp += 2) {
|
376
377
|
*vp = d->get_key(p, kp);
|
377
378
|
if (sizeof(kp->buf) <= (size_t)kp->len) {
|
378
|
-
|
379
|
+
OJ_R_FREE(kp->key);
|
379
380
|
}
|
380
381
|
}
|
381
382
|
rb_hash_bulk_insert(d->vtail - head, head, arg);
|
@@ -383,7 +384,7 @@ static void close_object_create(ojParser p) {
|
|
383
384
|
for (vp = head; kp < d->ktail; kp++, vp += 2) {
|
384
385
|
rb_hash_aset(arg, d->get_key(p, kp), *(vp + 1));
|
385
386
|
if (sizeof(kp->buf) <= (size_t)kp->len) {
|
386
|
-
|
387
|
+
OJ_R_FREE(kp->key);
|
387
388
|
}
|
388
389
|
}
|
389
390
|
#endif
|
@@ -393,7 +394,7 @@ static void close_object_create(ojParser p) {
|
|
393
394
|
for (vp = head; kp < d->ktail; kp++, vp += 2) {
|
394
395
|
rb_ivar_set(obj, get_attr_id(p, kp), *(vp + 1));
|
395
396
|
if (sizeof(kp->buf) <= (size_t)kp->len) {
|
396
|
-
|
397
|
+
OJ_R_FREE(kp->key);
|
397
398
|
}
|
398
399
|
}
|
399
400
|
}
|
@@ -621,11 +622,11 @@ static void dfree(ojParser p) {
|
|
621
622
|
if (NULL != d->class_cache) {
|
622
623
|
cache_free(d->class_cache);
|
623
624
|
}
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
625
|
+
OJ_R_FREE(d->vhead);
|
626
|
+
OJ_R_FREE(d->chead);
|
627
|
+
OJ_R_FREE(d->khead);
|
628
|
+
OJ_R_FREE(d->create_id);
|
629
|
+
OJ_R_FREE(p->ctx);
|
629
630
|
p->ctx = NULL;
|
630
631
|
}
|
631
632
|
|
@@ -777,14 +778,14 @@ static VALUE opt_capacity_set(ojParser p, VALUE value) {
|
|
777
778
|
if (d->vend - d->vhead < cap) {
|
778
779
|
long pos = d->vtail - d->vhead;
|
779
780
|
|
780
|
-
|
781
|
+
OJ_R_REALLOC_N(d->vhead, VALUE, cap);
|
781
782
|
d->vtail = d->vhead + pos;
|
782
783
|
d->vend = d->vhead + cap;
|
783
784
|
}
|
784
785
|
if (d->kend - d->khead < cap) {
|
785
786
|
long pos = d->ktail - d->khead;
|
786
787
|
|
787
|
-
|
788
|
+
OJ_R_REALLOC_N(d->khead, union _key, cap);
|
788
789
|
d->ktail = d->khead + pos;
|
789
790
|
d->kend = d->khead + cap;
|
790
791
|
}
|
@@ -1111,16 +1112,16 @@ static VALUE option(ojParser p, const char *key, VALUE value) {
|
|
1111
1112
|
void oj_init_usual(ojParser p, Usual d) {
|
1112
1113
|
int cap = 4096;
|
1113
1114
|
|
1114
|
-
d->vhead =
|
1115
|
+
d->vhead = OJ_R_ALLOC_N(VALUE, cap);
|
1115
1116
|
d->vend = d->vhead + cap;
|
1116
1117
|
d->vtail = d->vhead;
|
1117
1118
|
|
1118
|
-
d->khead =
|
1119
|
+
d->khead = OJ_R_ALLOC_N(union _key, cap);
|
1119
1120
|
d->kend = d->khead + cap;
|
1120
1121
|
d->ktail = d->khead;
|
1121
1122
|
|
1122
1123
|
cap = 256;
|
1123
|
-
d->chead =
|
1124
|
+
d->chead = OJ_R_ALLOC_N(struct _col, cap);
|
1124
1125
|
d->cend = d->chead + cap;
|
1125
1126
|
d->ctail = d->chead;
|
1126
1127
|
|
@@ -1201,7 +1202,7 @@ void oj_init_usual(ojParser p, Usual d) {
|
|
1201
1202
|
}
|
1202
1203
|
|
1203
1204
|
void oj_set_parser_usual(ojParser p) {
|
1204
|
-
Usual d =
|
1205
|
+
Usual d = OJ_R_ALLOC(struct _usual);
|
1205
1206
|
|
1206
1207
|
oj_init_usual(p, d);
|
1207
1208
|
}
|
data/ext/oj/val_stack.h
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
|
7
7
|
#include <stdint.h>
|
8
8
|
|
9
|
+
#include "mem.h"
|
9
10
|
#include "odd.h"
|
10
11
|
#include "ruby.h"
|
11
12
|
#ifdef HAVE_PTHREAD_MUTEX_INIT
|
@@ -62,7 +63,7 @@ inline static int stack_empty(ValStack stack) {
|
|
62
63
|
|
63
64
|
inline static void stack_cleanup(ValStack stack) {
|
64
65
|
if (stack->base != stack->head) {
|
65
|
-
|
66
|
+
OJ_R_FREE(stack->head);
|
66
67
|
stack->head = NULL;
|
67
68
|
}
|
68
69
|
}
|
@@ -76,10 +77,10 @@ inline static void stack_push(ValStack stack, VALUE val, ValNext next) {
|
|
76
77
|
// A realloc can trigger a GC so make sure it happens outside the lock
|
77
78
|
// but lock before changing pointers.
|
78
79
|
if (stack->base == stack->head) {
|
79
|
-
head =
|
80
|
+
head = OJ_R_ALLOC_N(struct _val, len + STACK_INC);
|
80
81
|
memcpy(head, stack->base, sizeof(struct _val) * len);
|
81
82
|
} else {
|
82
|
-
|
83
|
+
OJ_R_REALLOC_N(head, struct _val, len + STACK_INC);
|
83
84
|
}
|
84
85
|
#ifdef HAVE_PTHREAD_MUTEX_INIT
|
85
86
|
pthread_mutex_lock(&stack->mutex);
|
data/lib/oj/version.rb
CHANGED