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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1421 -0
- data/README.md +20 -5
- data/RELEASE_NOTES.md +61 -0
- data/ext/oj/buf.h +48 -38
- data/ext/oj/cache.c +329 -0
- data/ext/oj/cache.h +22 -0
- data/ext/oj/cache8.c +60 -62
- data/ext/oj/cache8.h +8 -7
- data/ext/oj/circarray.c +35 -35
- data/ext/oj/circarray.h +11 -9
- data/ext/oj/code.c +156 -174
- data/ext/oj/code.h +19 -18
- data/ext/oj/compat.c +140 -197
- data/ext/oj/custom.c +737 -879
- data/ext/oj/debug.c +126 -0
- data/ext/oj/dump.c +830 -835
- data/ext/oj/dump.h +65 -53
- data/ext/oj/dump_compat.c +566 -642
- data/ext/oj/dump_leaf.c +95 -182
- data/ext/oj/dump_object.c +518 -659
- data/ext/oj/dump_strict.c +301 -334
- data/ext/oj/encode.h +3 -4
- data/ext/oj/encoder.c +43 -0
- data/ext/oj/err.c +27 -24
- data/ext/oj/err.h +38 -13
- data/ext/oj/extconf.rb +23 -7
- data/ext/oj/fast.c +1043 -1073
- data/ext/oj/intern.c +313 -0
- data/ext/oj/intern.h +22 -0
- data/ext/oj/mem.c +318 -0
- data/ext/oj/mem.h +53 -0
- data/ext/oj/mimic_json.c +449 -423
- data/ext/oj/object.c +530 -576
- data/ext/oj/odd.c +155 -138
- data/ext/oj/odd.h +24 -22
- data/ext/oj/oj.c +1331 -993
- data/ext/oj/oj.h +306 -292
- data/ext/oj/parse.c +934 -938
- data/ext/oj/parse.h +73 -70
- data/ext/oj/parser.c +1600 -0
- data/ext/oj/parser.h +101 -0
- data/ext/oj/rails.c +795 -845
- data/ext/oj/rails.h +7 -7
- data/ext/oj/reader.c +132 -140
- data/ext/oj/reader.h +67 -78
- data/ext/oj/resolve.c +40 -59
- data/ext/oj/resolve.h +3 -2
- data/ext/oj/rxclass.c +67 -67
- data/ext/oj/rxclass.h +11 -9
- data/ext/oj/saj.c +441 -480
- data/ext/oj/saj2.c +584 -0
- data/ext/oj/saj2.h +23 -0
- data/ext/oj/scp.c +78 -111
- data/ext/oj/sparse.c +726 -730
- data/ext/oj/stream_writer.c +146 -165
- data/ext/oj/strict.c +103 -123
- data/ext/oj/string_writer.c +241 -253
- data/ext/oj/trace.c +29 -33
- data/ext/oj/trace.h +41 -11
- data/ext/oj/usual.c +1218 -0
- data/ext/oj/usual.h +69 -0
- data/ext/oj/util.c +103 -103
- data/ext/oj/util.h +3 -2
- data/ext/oj/val_stack.c +60 -49
- data/ext/oj/val_stack.h +79 -85
- data/ext/oj/validate.c +46 -0
- data/ext/oj/wab.c +307 -350
- data/lib/oj/active_support_helper.rb +1 -3
- data/lib/oj/bag.rb +8 -1
- data/lib/oj/easy_hash.rb +9 -9
- data/lib/oj/error.rb +1 -2
- data/lib/oj/json.rb +162 -150
- data/lib/oj/mimic.rb +9 -19
- data/lib/oj/saj.rb +20 -6
- data/lib/oj/schandler.rb +5 -4
- data/lib/oj/state.rb +12 -8
- data/lib/oj/version.rb +1 -2
- data/lib/oj.rb +2 -0
- data/pages/Compatibility.md +1 -1
- data/pages/InstallOptions.md +20 -0
- data/pages/JsonGem.md +15 -0
- data/pages/Modes.md +8 -3
- data/pages/Options.md +43 -5
- data/pages/Parser.md +309 -0
- data/pages/Rails.md +14 -2
- data/test/_test_active.rb +8 -9
- data/test/_test_active_mimic.rb +7 -8
- data/test/_test_mimic_rails.rb +17 -20
- data/test/activerecord/result_test.rb +12 -8
- data/test/activesupport6/encoding_test.rb +63 -28
- data/test/{activesupport5 → activesupport7}/abstract_unit.rb +16 -12
- data/test/{activesupport5 → activesupport7}/decoding_test.rb +2 -10
- data/test/{activesupport5 → activesupport7}/encoding_test.rb +86 -50
- data/test/{activesupport5 → activesupport7}/encoding_test_cases.rb +6 -0
- data/test/{activesupport5 → activesupport7}/time_zone_test_helpers.rb +8 -0
- data/test/files.rb +15 -15
- data/test/foo.rb +17 -43
- data/test/helper.rb +16 -3
- data/test/isolated/shared.rb +3 -2
- data/test/json_gem/json_addition_test.rb +2 -2
- data/test/json_gem/json_common_interface_test.rb +8 -6
- data/test/json_gem/json_encoding_test.rb +0 -0
- data/test/json_gem/json_ext_parser_test.rb +1 -0
- data/test/json_gem/json_fixtures_test.rb +3 -2
- data/test/json_gem/json_generator_test.rb +71 -41
- data/test/json_gem/json_generic_object_test.rb +11 -11
- data/test/json_gem/json_parser_test.rb +54 -47
- data/test/json_gem/json_string_matching_test.rb +9 -9
- data/test/json_gem/test_helper.rb +12 -0
- data/test/mem.rb +34 -0
- data/test/perf.rb +22 -27
- data/test/perf_compat.rb +31 -33
- data/test/perf_dump.rb +50 -0
- data/test/perf_fast.rb +80 -82
- data/test/perf_file.rb +27 -29
- data/test/perf_object.rb +65 -69
- data/test/perf_once.rb +59 -0
- data/test/perf_parser.rb +183 -0
- data/test/perf_saj.rb +46 -54
- data/test/perf_scp.rb +58 -69
- data/test/perf_simple.rb +41 -39
- data/test/perf_strict.rb +74 -82
- data/test/perf_wab.rb +67 -69
- data/test/prec.rb +5 -5
- data/test/sample/change.rb +0 -1
- data/test/sample/dir.rb +0 -1
- data/test/sample/doc.rb +0 -1
- data/test/sample/file.rb +0 -1
- data/test/sample/group.rb +0 -1
- data/test/sample/hasprops.rb +0 -1
- data/test/sample/layer.rb +0 -1
- data/test/sample/rect.rb +0 -1
- data/test/sample/shape.rb +0 -1
- data/test/sample/text.rb +0 -1
- data/test/sample.rb +16 -16
- data/test/sample_json.rb +8 -8
- data/test/test_compat.rb +97 -45
- data/test/test_custom.rb +73 -51
- data/test/test_debian.rb +7 -10
- data/test/test_fast.rb +135 -79
- data/test/test_file.rb +41 -30
- data/test/test_gc.rb +16 -5
- data/test/test_generate.rb +21 -0
- data/test/test_hash.rb +15 -5
- data/test/test_integer_range.rb +9 -9
- data/test/test_null.rb +20 -20
- data/test/test_object.rb +99 -96
- data/test/test_parser.rb +11 -0
- data/test/test_parser_debug.rb +27 -0
- data/test/test_parser_saj.rb +337 -0
- data/test/test_parser_usual.rb +251 -0
- data/test/test_rails.rb +2 -2
- data/test/test_saj.rb +10 -8
- data/test/test_scp.rb +38 -40
- data/test/test_strict.rb +40 -32
- data/test/test_various.rb +165 -84
- data/test/test_wab.rb +48 -44
- data/test/test_writer.rb +47 -47
- data/test/tests.rb +13 -5
- data/test/tests_mimic.rb +12 -3
- data/test/tests_mimic_addition.rb +12 -3
- metadata +75 -127
- data/ext/oj/hash.c +0 -135
- data/ext/oj/hash.h +0 -18
- data/ext/oj/hash_test.c +0 -484
- data/test/activesupport4/decoding_test.rb +0 -108
- data/test/activesupport4/encoding_test.rb +0 -531
- data/test/activesupport4/test_helper.rb +0 -41
- data/test/activesupport5/test_helper.rb +0 -72
- data/test/bar.rb +0 -35
- data/test/baz.rb +0 -16
- 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
|
16
|
+
#define STACK_INC 64
|
14
17
|
|
15
18
|
typedef enum {
|
16
|
-
NEXT_NONE
|
17
|
-
NEXT_ARRAY_NEW
|
18
|
-
NEXT_ARRAY_ELEMENT
|
19
|
-
NEXT_ARRAY_COMMA
|
20
|
-
NEXT_HASH_NEW
|
21
|
-
NEXT_HASH_KEY
|
22
|
-
NEXT_HASH_COLON
|
23
|
-
NEXT_HASH_VALUE
|
24
|
-
NEXT_HASH_COMMA
|
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
|
29
|
-
const char
|
30
|
-
char
|
31
|
-
volatile VALUE
|
32
|
-
const char
|
33
|
-
VALUE
|
34
|
-
OddArgs
|
35
|
-
uint16_t
|
36
|
-
uint16_t
|
37
|
-
char
|
38
|
-
char
|
39
|
-
char
|
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
|
44
|
-
Val
|
45
|
-
Val
|
46
|
-
Val
|
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
|
51
|
+
pthread_mutex_t mutex;
|
49
52
|
#else
|
50
|
-
VALUE
|
53
|
+
VALUE mutex;
|
51
54
|
#endif
|
52
55
|
|
53
56
|
} *ValStack;
|
54
57
|
|
55
|
-
extern VALUE
|
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
|
-
|
66
|
-
|
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
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
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
|
-
|
86
|
+
pthread_mutex_lock(&stack->mutex);
|
87
87
|
#else
|
88
|
-
|
88
|
+
rb_mutex_lock(stack->mutex);
|
89
89
|
#endif
|
90
|
-
|
91
|
-
|
92
|
-
|
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
|
-
|
94
|
+
pthread_mutex_unlock(&stack->mutex);
|
95
95
|
#else
|
96
|
-
|
96
|
+
rb_mutex_unlock(stack->mutex);
|
97
97
|
#endif
|
98
98
|
}
|
99
|
-
stack->tail->val
|
100
|
-
stack->tail->next
|
99
|
+
stack->tail->val = val;
|
100
|
+
stack->tail->next = next;
|
101
101
|
stack->tail->classname = NULL;
|
102
|
-
stack->tail->clas
|
103
|
-
stack->tail->odd_args
|
104
|
-
stack->tail->key
|
105
|
-
stack->tail->key_val
|
106
|
-
stack->tail->clen
|
107
|
-
stack->tail->klen
|
108
|
-
stack->tail->kalloc
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
150
|
-
|
143
|
+
stack->tail--;
|
144
|
+
return stack->tail;
|
151
145
|
}
|
152
146
|
return 0;
|
153
147
|
}
|
154
148
|
|
155
|
-
extern const char*
|
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
|
+
}
|