oj 3.14.1 → 3.14.2
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.
- 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