oj 3.13.11 → 3.15.0
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 +74 -0
- data/README.md +4 -2
- data/ext/oj/buf.h +11 -6
- data/ext/oj/cache.c +25 -24
- data/ext/oj/cache8.c +10 -9
- data/ext/oj/circarray.c +8 -6
- data/ext/oj/circarray.h +2 -2
- data/ext/oj/code.c +17 -24
- data/ext/oj/code.h +2 -2
- data/ext/oj/compat.c +17 -44
- data/ext/oj/custom.c +70 -141
- data/ext/oj/debug.c +3 -9
- data/ext/oj/dump.c +128 -118
- data/ext/oj/dump.h +12 -8
- data/ext/oj/dump_compat.c +564 -641
- data/ext/oj/dump_leaf.c +17 -63
- data/ext/oj/dump_object.c +70 -199
- data/ext/oj/dump_strict.c +22 -46
- data/ext/oj/encoder.c +1 -1
- data/ext/oj/err.c +2 -13
- data/ext/oj/err.h +9 -12
- data/ext/oj/extconf.rb +14 -5
- data/ext/oj/fast.c +75 -103
- data/ext/oj/intern.c +52 -50
- data/ext/oj/intern.h +4 -8
- data/ext/oj/mem.c +318 -0
- data/ext/oj/mem.h +53 -0
- data/ext/oj/mimic_json.c +75 -47
- data/ext/oj/object.c +49 -66
- data/ext/oj/odd.c +89 -67
- data/ext/oj/odd.h +15 -15
- data/ext/oj/oj.c +140 -99
- data/ext/oj/oj.h +80 -51
- data/ext/oj/parse.c +162 -184
- data/ext/oj/parse.h +7 -10
- data/ext/oj/parser.c +89 -34
- data/ext/oj/parser.h +18 -7
- data/ext/oj/rails.c +82 -146
- data/ext/oj/rails.h +1 -1
- data/ext/oj/reader.c +11 -12
- data/ext/oj/reader.h +4 -2
- data/ext/oj/resolve.c +3 -4
- data/ext/oj/rxclass.c +6 -5
- data/ext/oj/rxclass.h +1 -1
- data/ext/oj/saj.c +20 -31
- data/ext/oj/saj2.c +329 -93
- data/ext/oj/saj2.h +23 -0
- data/ext/oj/scp.c +3 -14
- data/ext/oj/sparse.c +26 -70
- data/ext/oj/stream_writer.c +12 -22
- data/ext/oj/strict.c +20 -52
- data/ext/oj/string_writer.c +21 -21
- data/ext/oj/trace.h +31 -4
- data/ext/oj/usual.c +105 -150
- data/ext/oj/usual.h +68 -0
- data/ext/oj/util.h +1 -1
- data/ext/oj/val_stack.c +1 -1
- data/ext/oj/val_stack.h +8 -7
- data/ext/oj/validate.c +21 -26
- data/ext/oj/wab.c +31 -68
- data/lib/oj/active_support_helper.rb +0 -1
- data/lib/oj/bag.rb +7 -1
- data/lib/oj/easy_hash.rb +4 -5
- data/lib/oj/error.rb +0 -1
- data/lib/oj/json.rb +4 -2
- data/lib/oj/mimic.rb +4 -2
- data/lib/oj/saj.rb +20 -6
- data/lib/oj/state.rb +9 -6
- 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/Options.md +10 -0
- 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 +5 -6
- 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 +20 -34
- 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 +9 -71
- data/test/helper.rb +11 -8
- 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 +4 -4
- 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 +48 -36
- 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 +7 -3
- data/test/mem.rb +13 -12
- data/test/perf.rb +21 -26
- 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 +12 -11
- data/test/perf_parser.rb +42 -48
- data/test/perf_saj.rb +46 -54
- data/test/perf_scp.rb +57 -69
- data/test/perf_simple.rb +41 -39
- data/test/perf_strict.rb +68 -70
- data/test/perf_wab.rb +67 -69
- data/test/prec.rb +3 -3
- 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 +76 -42
- data/test/test_custom.rb +72 -51
- data/test/test_debian.rb +7 -10
- data/test/test_fast.rb +86 -90
- data/test/test_file.rb +41 -30
- data/test/test_gc.rb +16 -5
- data/test/test_generate.rb +5 -5
- data/test/test_hash.rb +4 -4
- data/test/test_integer_range.rb +9 -9
- data/test/test_null.rb +20 -20
- data/test/test_object.rb +85 -96
- data/test/test_parser.rb +6 -22
- data/test/test_parser_debug.rb +27 -0
- data/test/test_parser_saj.rb +115 -23
- data/test/test_parser_usual.rb +6 -6
- data/test/test_rails.rb +2 -2
- data/test/test_saj.rb +10 -8
- data/test/test_scp.rb +37 -39
- data/test/test_strict.rb +30 -32
- data/test/test_various.rb +147 -99
- data/test/test_wab.rb +48 -44
- data/test/test_writer.rb +47 -47
- data/test/tests.rb +13 -4
- data/test/tests_mimic.rb +12 -3
- data/test/tests_mimic_addition.rb +12 -3
- metadata +33 -144
- 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 -16
- data/test/baz.rb +0 -16
- data/test/bug.rb +0 -16
- data/test/zoo.rb +0 -13
data/ext/oj/usual.h
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
// Copyright (c) 2022, Peter Ohler, All rights reserved.
|
2
|
+
|
3
|
+
#include <ruby.h>
|
4
|
+
#include <stdbool.h>
|
5
|
+
#include <stdint.h>
|
6
|
+
|
7
|
+
struct _cache;
|
8
|
+
struct _ojParser;
|
9
|
+
|
10
|
+
// Used to mark the start of each Hash, Array, or Object. The members point at
|
11
|
+
// positions of the start in the value stack and if not an Array into the key
|
12
|
+
// stack.
|
13
|
+
typedef struct _col {
|
14
|
+
long vi; // value stack index
|
15
|
+
long ki; // key stack index if an hash else -1 for an array
|
16
|
+
} *Col;
|
17
|
+
|
18
|
+
typedef union _key {
|
19
|
+
struct {
|
20
|
+
int16_t len;
|
21
|
+
char buf[30];
|
22
|
+
};
|
23
|
+
struct {
|
24
|
+
int16_t xlen; // should be the same as len
|
25
|
+
char *key;
|
26
|
+
};
|
27
|
+
} *Key;
|
28
|
+
|
29
|
+
#define MISS_AUTO 'A'
|
30
|
+
#define MISS_RAISE 'R'
|
31
|
+
#define MISS_IGNORE 'I'
|
32
|
+
|
33
|
+
typedef struct _usual {
|
34
|
+
VALUE *vhead;
|
35
|
+
VALUE *vtail;
|
36
|
+
VALUE *vend;
|
37
|
+
|
38
|
+
Col chead;
|
39
|
+
Col ctail;
|
40
|
+
Col cend;
|
41
|
+
|
42
|
+
Key khead;
|
43
|
+
Key ktail;
|
44
|
+
Key kend;
|
45
|
+
|
46
|
+
VALUE (*get_key)(struct _ojParser *p, Key kp);
|
47
|
+
struct _cache *key_cache; // same as str_cache or sym_cache
|
48
|
+
struct _cache *str_cache;
|
49
|
+
struct _cache *sym_cache;
|
50
|
+
struct _cache *class_cache;
|
51
|
+
struct _cache *attr_cache;
|
52
|
+
|
53
|
+
VALUE array_class;
|
54
|
+
VALUE hash_class;
|
55
|
+
|
56
|
+
char *create_id;
|
57
|
+
uint8_t create_id_len;
|
58
|
+
uint8_t cache_str;
|
59
|
+
uint8_t cache_xrate;
|
60
|
+
uint8_t miss_class;
|
61
|
+
bool cache_keys;
|
62
|
+
bool ignore_json_create;
|
63
|
+
} *Usual;
|
64
|
+
|
65
|
+
// Initialize the parser with the usual delegate. If the usual delegate is
|
66
|
+
// wrapped then this function is called first and then the parser functions
|
67
|
+
// can be replaced.
|
68
|
+
extern void oj_init_usual(struct _ojParser *p, Usual d);
|
data/ext/oj/util.h
CHANGED
data/ext/oj/val_stack.c
CHANGED
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
|
@@ -28,10 +29,10 @@ typedef enum {
|
|
28
29
|
|
29
30
|
typedef struct _val {
|
30
31
|
volatile VALUE val;
|
31
|
-
const char
|
32
|
+
const char *key;
|
32
33
|
char karray[32];
|
33
34
|
volatile VALUE key_val;
|
34
|
-
const char
|
35
|
+
const char *classname;
|
35
36
|
VALUE clas;
|
36
37
|
OddArgs odd_args;
|
37
38
|
uint16_t klen;
|
@@ -39,7 +40,7 @@ typedef struct _val {
|
|
39
40
|
char next; // ValNext
|
40
41
|
char k1; // first original character in the key
|
41
42
|
char kalloc;
|
42
|
-
} *
|
43
|
+
} *Val;
|
43
44
|
|
44
45
|
typedef struct _valStack {
|
45
46
|
struct _val base[STACK_INC];
|
@@ -52,7 +53,7 @@ typedef struct _valStack {
|
|
52
53
|
VALUE mutex;
|
53
54
|
#endif
|
54
55
|
|
55
|
-
} *
|
56
|
+
} *ValStack;
|
56
57
|
|
57
58
|
extern VALUE oj_stack_init(ValStack stack);
|
58
59
|
|
@@ -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/ext/oj/validate.c
CHANGED
@@ -2,50 +2,45 @@
|
|
2
2
|
|
3
3
|
#include "parser.h"
|
4
4
|
|
5
|
-
static void
|
6
|
-
noop(ojParser p) {
|
5
|
+
static void noop(ojParser p) {
|
7
6
|
}
|
8
7
|
|
9
|
-
static VALUE
|
10
|
-
option(ojParser p, const char *key, VALUE value) {
|
8
|
+
static VALUE option(ojParser p, const char *key, VALUE value) {
|
11
9
|
rb_raise(rb_eArgError, "%s is not an option for the validate delegate", key);
|
12
10
|
return Qnil;
|
13
11
|
}
|
14
12
|
|
15
|
-
static VALUE
|
16
|
-
result(ojParser p) {
|
13
|
+
static VALUE result(ojParser p) {
|
17
14
|
return Qnil;
|
18
15
|
}
|
19
16
|
|
20
|
-
static void
|
21
|
-
dfree(ojParser p) {
|
17
|
+
static void dfree(ojParser p) {
|
22
18
|
}
|
23
19
|
|
24
|
-
static void
|
25
|
-
mark(ojParser p) {
|
20
|
+
static void mark(ojParser p) {
|
26
21
|
}
|
27
22
|
|
28
23
|
void oj_set_parser_validator(ojParser p) {
|
29
|
-
p->
|
30
|
-
Funcs end = p->funcs + 3;
|
24
|
+
Funcs end = p->funcs + 3;
|
31
25
|
Funcs f;
|
26
|
+
p->ctx = NULL;
|
32
27
|
|
33
28
|
for (f = p->funcs; f < end; f++) {
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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;
|
45
40
|
}
|
46
41
|
p->option = option;
|
47
42
|
p->result = result;
|
48
|
-
p->free
|
49
|
-
p->mark
|
50
|
-
p->start
|
43
|
+
p->free = dfree;
|
44
|
+
p->mark = mark;
|
45
|
+
p->start = noop;
|
51
46
|
}
|
data/ext/oj/wab.c
CHANGED
@@ -35,7 +35,7 @@ static VALUE uri_http_clas = Qundef;
|
|
35
35
|
|
36
36
|
///// dump functions /////
|
37
37
|
|
38
|
-
static VALUE resolve_wab_uuid_class() {
|
38
|
+
static VALUE resolve_wab_uuid_class(void) {
|
39
39
|
if (Qundef == wab_uuid_clas) {
|
40
40
|
volatile VALUE wab_module;
|
41
41
|
|
@@ -50,7 +50,7 @@ static VALUE resolve_wab_uuid_class() {
|
|
50
50
|
return wab_uuid_clas;
|
51
51
|
}
|
52
52
|
|
53
|
-
static VALUE resolve_uri_class() {
|
53
|
+
static VALUE resolve_uri_class(void) {
|
54
54
|
if (Qundef == uri_clas) {
|
55
55
|
uri_clas = Qnil;
|
56
56
|
if (rb_const_defined_at(rb_cObject, rb_intern("URI"))) {
|
@@ -60,7 +60,7 @@ static VALUE resolve_uri_class() {
|
|
60
60
|
return uri_clas;
|
61
61
|
}
|
62
62
|
|
63
|
-
static VALUE resolve_uri_http_class() {
|
63
|
+
static VALUE resolve_uri_http_class(void) {
|
64
64
|
if (Qundef == uri_http_clas) {
|
65
65
|
volatile VALUE uri_module;
|
66
66
|
|
@@ -76,15 +76,13 @@ static VALUE resolve_uri_http_class() {
|
|
76
76
|
}
|
77
77
|
|
78
78
|
static void raise_wab(VALUE obj) {
|
79
|
-
rb_raise(rb_eTypeError,
|
80
|
-
"Failed to dump %s Object to JSON in wab mode.\n",
|
81
|
-
rb_class2name(rb_obj_class(obj)));
|
79
|
+
rb_raise(rb_eTypeError, "Failed to dump %s Object to JSON in wab mode.\n", rb_class2name(rb_obj_class(obj)));
|
82
80
|
}
|
83
81
|
|
84
82
|
// Removed dependencies on math due to problems with CentOS 5.4.
|
85
83
|
static void dump_float(VALUE obj, int depth, Out out, bool as_ok) {
|
86
84
|
char buf[64];
|
87
|
-
char
|
85
|
+
char *b;
|
88
86
|
double d = rb_num2dbl(obj);
|
89
87
|
int cnt = 0;
|
90
88
|
|
@@ -124,9 +122,9 @@ static void dump_array(VALUE a, int depth, Out out, bool as_ok) {
|
|
124
122
|
*out->cur++ = ']';
|
125
123
|
} else {
|
126
124
|
size = d2 * out->indent + 2;
|
125
|
+
assure_size(out, size * cnt);
|
127
126
|
cnt--;
|
128
127
|
for (i = 0; i <= cnt; i++) {
|
129
|
-
assure_size(out, size);
|
130
128
|
fill_indent(out, d2);
|
131
129
|
oj_dump_wab_val(RARRAY_AREF(a, i), d2, out);
|
132
130
|
if (i < cnt) {
|
@@ -194,20 +192,15 @@ static void dump_time(VALUE obj, Out out) {
|
|
194
192
|
time_t sec;
|
195
193
|
long long nsec;
|
196
194
|
|
197
|
-
#ifdef HAVE_RB_TIME_TIMESPEC
|
198
195
|
if (16 <= sizeof(struct timespec)) {
|
199
196
|
struct timespec ts = rb_time_timespec(obj);
|
200
197
|
|
201
198
|
sec = ts.tv_sec;
|
202
199
|
nsec = ts.tv_nsec;
|
203
200
|
} else {
|
204
|
-
sec =
|
205
|
-
nsec =
|
201
|
+
sec = NUM2LL(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
|
202
|
+
nsec = NUM2LL(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
|
206
203
|
}
|
207
|
-
#else
|
208
|
-
sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
|
209
|
-
nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
|
210
|
-
#endif
|
211
204
|
|
212
205
|
assure_size(out, 36);
|
213
206
|
// 2012-01-05T23:58:07.123456000Z
|
@@ -231,13 +224,13 @@ static void dump_obj(VALUE obj, int depth, Out out, bool as_ok) {
|
|
231
224
|
if (rb_cTime == clas) {
|
232
225
|
dump_time(obj, out);
|
233
226
|
} else if (oj_bigdecimal_class == clas) {
|
234
|
-
volatile VALUE rstr =
|
227
|
+
volatile VALUE rstr = oj_safe_string_convert(obj);
|
235
228
|
|
236
229
|
oj_dump_raw(RSTRING_PTR(rstr), (int)RSTRING_LEN(rstr), out);
|
237
230
|
} else if (resolve_wab_uuid_class() == clas) {
|
238
|
-
oj_dump_str(
|
231
|
+
oj_dump_str(oj_safe_string_convert(obj), depth, out, false);
|
239
232
|
} else if (resolve_uri_http_class() == clas) {
|
240
|
-
oj_dump_str(
|
233
|
+
oj_dump_str(oj_safe_string_convert(obj), depth, out, false);
|
241
234
|
} else {
|
242
235
|
raise_wab(obj);
|
243
236
|
}
|
@@ -271,9 +264,7 @@ static DumpFunc wab_funcs[] = {
|
|
271
264
|
void oj_dump_wab_val(VALUE obj, int depth, Out out) {
|
272
265
|
int type = rb_type(obj);
|
273
266
|
|
274
|
-
|
275
|
-
oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceIn);
|
276
|
-
}
|
267
|
+
TRACE(out->opts->trace, "dump", obj, depth, TraceIn);
|
277
268
|
if (MAX_DEPTH < depth) {
|
278
269
|
rb_raise(rb_eNoMemError, "Too deeply nested.\n");
|
279
270
|
}
|
@@ -282,9 +273,7 @@ void oj_dump_wab_val(VALUE obj, int depth, Out out) {
|
|
282
273
|
|
283
274
|
if (NULL != f) {
|
284
275
|
f(obj, depth, out, false);
|
285
|
-
|
286
|
-
oj_trace("dump", obj, __FILE__, __LINE__, depth, TraceOut);
|
287
|
-
}
|
276
|
+
TRACE(out->opts->trace, "dump", obj, depth, TraceOut);
|
288
277
|
return;
|
289
278
|
}
|
290
279
|
}
|
@@ -308,7 +297,7 @@ static VALUE calc_hash_key(ParseInfo pi, Val parent) {
|
|
308
297
|
#if HAVE_RB_ENC_INTERNED_STR
|
309
298
|
rkey = rb_enc_interned_str(parent->key, parent->klen, oj_utf8_encoding);
|
310
299
|
#else
|
311
|
-
|
300
|
+
rkey = rb_utf8_str_new(parent->key, parent->klen);
|
312
301
|
rkey = rb_str_intern(rkey);
|
313
302
|
OBJ_FREEZE(rkey);
|
314
303
|
#endif
|
@@ -317,15 +306,11 @@ static VALUE calc_hash_key(ParseInfo pi, Val parent) {
|
|
317
306
|
}
|
318
307
|
|
319
308
|
static void hash_end(ParseInfo pi) {
|
320
|
-
|
321
|
-
oj_trace_parse_hash_end(pi, __FILE__, __LINE__);
|
322
|
-
}
|
309
|
+
TRACE_PARSE_HASH_END(pi->options.trace, pi);
|
323
310
|
}
|
324
311
|
|
325
312
|
static void array_end(ParseInfo pi) {
|
326
|
-
|
327
|
-
oj_trace_parse_array_end(pi, __FILE__, __LINE__);
|
328
|
-
}
|
313
|
+
TRACE_PARSE_ARRAY_END(pi->options.trace, pi);
|
329
314
|
}
|
330
315
|
|
331
316
|
static VALUE noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
|
@@ -333,9 +318,7 @@ static VALUE noop_hash_key(ParseInfo pi, const char *key, size_t klen) {
|
|
333
318
|
}
|
334
319
|
|
335
320
|
static void add_value(ParseInfo pi, VALUE val) {
|
336
|
-
|
337
|
-
oj_trace_parse_call("add_value", pi, __FILE__, __LINE__, val);
|
338
|
-
}
|
321
|
+
TRACE_PARSE_CALL(pi->options.trace, "add_value", pi, val);
|
339
322
|
pi->stack.head->val = val;
|
340
323
|
}
|
341
324
|
|
@@ -459,14 +442,14 @@ static VALUE protect_uri(VALUE rstr) {
|
|
459
442
|
static VALUE cstr_to_rstr(ParseInfo pi, const char *str, size_t len) {
|
460
443
|
volatile VALUE v = Qnil;
|
461
444
|
|
462
|
-
if (30 == len && '-' == str[4] && '-' == str[7] && 'T' == str[10] && ':' == str[13] &&
|
463
|
-
'
|
445
|
+
if (30 == len && '-' == str[4] && '-' == str[7] && 'T' == str[10] && ':' == str[13] && ':' == str[16] &&
|
446
|
+
'.' == str[19] && 'Z' == str[29]) {
|
464
447
|
if (Qnil != (v = time_parse(str, (int)len))) {
|
465
448
|
return v;
|
466
449
|
}
|
467
450
|
}
|
468
|
-
if (36 == len && '-' == str[8] && '-' == str[13] && '-' == str[18] && '-' == str[23] &&
|
469
|
-
|
451
|
+
if (36 == len && '-' == str[8] && '-' == str[13] && '-' == str[18] && '-' == str[23] && uuid_check(str, (int)len) &&
|
452
|
+
Qnil != resolve_wab_uuid_class()) {
|
470
453
|
return rb_funcall(wab_uuid_clas, oj_new_id, 1, rb_str_new(str, len));
|
471
454
|
}
|
472
455
|
if (7 < len && 0 == strncasecmp("http://", str, 7)) {
|
@@ -483,9 +466,7 @@ static VALUE cstr_to_rstr(ParseInfo pi, const char *str, size_t len) {
|
|
483
466
|
|
484
467
|
static void add_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
|
485
468
|
pi->stack.head->val = cstr_to_rstr(pi, str, len);
|
486
|
-
|
487
|
-
oj_trace_parse_call("add_string", pi, __FILE__, __LINE__, pi->stack.head->val);
|
488
|
-
}
|
469
|
+
TRACE_PARSE_CALL(pi->options.trace, "add_string", pi, pi->stack.head->val);
|
489
470
|
}
|
490
471
|
|
491
472
|
static void add_num(ParseInfo pi, NumInfo ni) {
|
@@ -493,15 +474,11 @@ static void add_num(ParseInfo pi, NumInfo ni) {
|
|
493
474
|
oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
|
494
475
|
}
|
495
476
|
pi->stack.head->val = oj_num_as_value(ni);
|
496
|
-
|
497
|
-
oj_trace_parse_call("add_number", pi, __FILE__, __LINE__, pi->stack.head->val);
|
498
|
-
}
|
477
|
+
TRACE_PARSE_CALL(pi->options.trace, "add_number", pi, pi->stack.head->val);
|
499
478
|
}
|
500
479
|
|
501
480
|
static VALUE start_hash(ParseInfo pi) {
|
502
|
-
|
503
|
-
oj_trace_parse_in("start_hash", pi, __FILE__, __LINE__);
|
504
|
-
}
|
481
|
+
TRACE_PARSE_IN(pi->options.trace, "start_hash", pi);
|
505
482
|
if (Qnil != pi->options.hash_class) {
|
506
483
|
return rb_class_new_instance(0, NULL, pi->options.hash_class);
|
507
484
|
}
|
@@ -512,9 +489,7 @@ static void hash_set_cstr(ParseInfo pi, Val parent, const char *str, size_t len,
|
|
512
489
|
volatile VALUE rval = cstr_to_rstr(pi, str, len);
|
513
490
|
|
514
491
|
rb_hash_aset(stack_peek(&pi->stack)->val, calc_hash_key(pi, parent), rval);
|
515
|
-
|
516
|
-
oj_trace_parse_call("set_string", pi, __FILE__, __LINE__, rval);
|
517
|
-
}
|
492
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_string", pi, rval);
|
518
493
|
}
|
519
494
|
|
520
495
|
static void hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
|
@@ -525,22 +500,16 @@ static void hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
|
|
525
500
|
}
|
526
501
|
rval = oj_num_as_value(ni);
|
527
502
|
rb_hash_aset(stack_peek(&pi->stack)->val, calc_hash_key(pi, parent), rval);
|
528
|
-
|
529
|
-
oj_trace_parse_call("set_number", pi, __FILE__, __LINE__, rval);
|
530
|
-
}
|
503
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_number", pi, rval);
|
531
504
|
}
|
532
505
|
|
533
506
|
static void hash_set_value(ParseInfo pi, Val parent, VALUE value) {
|
534
507
|
rb_hash_aset(stack_peek(&pi->stack)->val, calc_hash_key(pi, parent), value);
|
535
|
-
|
536
|
-
oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, value);
|
537
|
-
}
|
508
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_value", pi, value);
|
538
509
|
}
|
539
510
|
|
540
511
|
static VALUE start_array(ParseInfo pi) {
|
541
|
-
|
542
|
-
oj_trace_parse_in("start_array", pi, __FILE__, __LINE__);
|
543
|
-
}
|
512
|
+
TRACE_PARSE_IN(pi->options.trace, "start_array", pi);
|
544
513
|
return rb_ary_new();
|
545
514
|
}
|
546
515
|
|
@@ -548,9 +517,7 @@ static void array_append_cstr(ParseInfo pi, const char *str, size_t len, const c
|
|
548
517
|
volatile VALUE rval = cstr_to_rstr(pi, str, len);
|
549
518
|
|
550
519
|
rb_ary_push(stack_peek(&pi->stack)->val, rval);
|
551
|
-
|
552
|
-
oj_trace_parse_call("set_value", pi, __FILE__, __LINE__, rval);
|
553
|
-
}
|
520
|
+
TRACE_PARSE_CALL(pi->options.trace, "set_value", pi, rval);
|
554
521
|
}
|
555
522
|
|
556
523
|
static void array_append_num(ParseInfo pi, NumInfo ni) {
|
@@ -561,16 +528,12 @@ static void array_append_num(ParseInfo pi, NumInfo ni) {
|
|
561
528
|
}
|
562
529
|
rval = oj_num_as_value(ni);
|
563
530
|
rb_ary_push(stack_peek(&pi->stack)->val, rval);
|
564
|
-
|
565
|
-
oj_trace_parse_call("append_number", pi, __FILE__, __LINE__, rval);
|
566
|
-
}
|
531
|
+
TRACE_PARSE_CALL(pi->options.trace, "append_number", pi, rval);
|
567
532
|
}
|
568
533
|
|
569
534
|
static void array_append_value(ParseInfo pi, VALUE value) {
|
570
535
|
rb_ary_push(stack_peek(&pi->stack)->val, value);
|
571
|
-
|
572
|
-
oj_trace_parse_call("append_value", pi, __FILE__, __LINE__, value);
|
573
|
-
}
|
536
|
+
TRACE_PARSE_CALL(pi->options.trace, "append_value", pi, value);
|
574
537
|
}
|
575
538
|
|
576
539
|
void oj_set_wab_callbacks(ParseInfo pi) {
|
data/lib/oj/bag.rb
CHANGED
@@ -15,7 +15,7 @@ module Oj
|
|
15
15
|
# @example Oj::Bag.new(:@x => 42, :@y => 57)
|
16
16
|
# @param [Hash] args instance variable symbols and their values
|
17
17
|
def initialize(args = {})
|
18
|
-
args.each do |k,v|
|
18
|
+
args.each do |k, v|
|
19
19
|
self.instance_variable_set(k, v)
|
20
20
|
end
|
21
21
|
end
|
@@ -26,6 +26,7 @@ module Oj
|
|
26
26
|
# variable reader, otherwise false.
|
27
27
|
def respond_to?(m)
|
28
28
|
return true if super
|
29
|
+
|
29
30
|
instance_variables.include?(:"@#{m}")
|
30
31
|
end
|
31
32
|
|
@@ -37,8 +38,10 @@ module Oj
|
|
37
38
|
# @raise [NoMethodError] if the instance variable is not defined.
|
38
39
|
def method_missing(m, *args, &block)
|
39
40
|
raise ArgumentError.new("wrong number of arguments (#{args.size} for 0) to method #{m}") unless args.nil? or args.empty?
|
41
|
+
|
40
42
|
at_m = :"@#{m}"
|
41
43
|
raise NoMethodError.new("undefined method #{m}", m) unless instance_variable_defined?(at_m)
|
44
|
+
|
42
45
|
instance_variable_get(at_m)
|
43
46
|
end
|
44
47
|
|
@@ -47,9 +50,11 @@ module Oj
|
|
47
50
|
# @return [Boolean] true if each variable and value are the same, otherwise false.
|
48
51
|
def eql?(other)
|
49
52
|
return false if (other.nil? or self.class != other.class)
|
53
|
+
|
50
54
|
ova = other.instance_variables
|
51
55
|
iv = instance_variables
|
52
56
|
return false if ova.size != iv.size
|
57
|
+
|
53
58
|
iv.all? { |vid| instance_variable_get(vid) != other.instance_variable_get(vid) }
|
54
59
|
end
|
55
60
|
alias == eql?
|
@@ -65,6 +70,7 @@ module Oj
|
|
65
70
|
classname = classname.to_s unless classname.is_a?(String)
|
66
71
|
tokens = classname.split('::').map(&:to_sym)
|
67
72
|
raise NameError.new("Invalid classname '#{classname}") if tokens.empty?
|
73
|
+
|
68
74
|
m = Object
|
69
75
|
tokens[0..-2].each do |sym|
|
70
76
|
if m.const_defined?(sym)
|
data/lib/oj/easy_hash.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module Oj
|
3
2
|
|
4
3
|
# A Hash subclass that normalizes the hash keys to allow lookup by the
|
@@ -6,10 +5,6 @@ module Oj
|
|
6
5
|
# that match the keys.
|
7
6
|
class EasyHash < Hash
|
8
7
|
|
9
|
-
# Initializes the instance to an empty Hash.
|
10
|
-
def initialize()
|
11
|
-
end
|
12
|
-
|
13
8
|
# Replaces the Object.respond_to?() method.
|
14
9
|
# @param [Symbol] m method symbol
|
15
10
|
# @param [Boolean] include_all whether to include private and protected methods in the search
|
@@ -19,12 +14,14 @@ module Oj
|
|
19
14
|
return true if super
|
20
15
|
return true if has_key?(m)
|
21
16
|
return true if has_key?(m.to_s)
|
17
|
+
|
22
18
|
has_key?(m.to_sym)
|
23
19
|
end
|
24
20
|
|
25
21
|
def [](key)
|
26
22
|
return fetch(key, nil) if has_key?(key)
|
27
23
|
return fetch(key.to_s, nil) if has_key?(key.to_s)
|
24
|
+
|
28
25
|
fetch(key.to_sym, nil)
|
29
26
|
end
|
30
27
|
|
@@ -36,9 +33,11 @@ module Oj
|
|
36
33
|
def method_missing(m, *args, &block)
|
37
34
|
if m.to_s.end_with?('=')
|
38
35
|
raise ArgumentError.new("wrong number of arguments (#{args.size} for 1 with #{m}) to method #{m}") if args.nil? or 1 != args.length
|
36
|
+
|
39
37
|
m = m[0..-2]
|
40
38
|
return store(m.to_s, args[0]) if has_key?(m.to_s)
|
41
39
|
return store(m.to_sym, args[0]) if has_key?(m.to_sym)
|
40
|
+
|
42
41
|
return store(m, args[0])
|
43
42
|
else
|
44
43
|
raise ArgumentError.new("wrong number of arguments (#{args.size} for 0 with #{m}) to method #{m}") unless args.nil? or args.empty?
|
data/lib/oj/error.rb
CHANGED
data/lib/oj/json.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
require 'ostruct'
|
3
2
|
require 'oj/state'
|
4
3
|
|
@@ -51,7 +50,7 @@ module JSON
|
|
51
50
|
|
52
51
|
def self.dump_default_options=(h)
|
53
52
|
m = Oj::MimicDumpOption.new
|
54
|
-
h.each do |k,v|
|
53
|
+
h.each do |k, v|
|
55
54
|
m[k] = v
|
56
55
|
end
|
57
56
|
end
|
@@ -76,16 +75,19 @@ module JSON
|
|
76
75
|
class Parser
|
77
76
|
def initialize(src)
|
78
77
|
raise TypeError.new("already initialized") unless @source.nil?
|
78
|
+
|
79
79
|
@source = src
|
80
80
|
end
|
81
81
|
|
82
82
|
def source()
|
83
83
|
raise TypeError.new("already initialized") if @source.nil?
|
84
|
+
|
84
85
|
@source
|
85
86
|
end
|
86
87
|
|
87
88
|
def parse()
|
88
89
|
raise TypeError.new("already initialized") if @source.nil?
|
90
|
+
|
89
91
|
JSON.parse(@source)
|
90
92
|
end
|
91
93
|
|
data/lib/oj/mimic.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
require 'bigdecimal'
|
3
2
|
begin
|
4
3
|
require 'ostruct'
|
@@ -64,6 +63,8 @@ module Oj
|
|
64
63
|
self.store(:allow_nan, true)
|
65
64
|
self.store(:quirks_mode, oo[:quirks_mode])
|
66
65
|
self.store(:ascii_only, (:ascii == oo[:escape_mode]))
|
66
|
+
|
67
|
+
super
|
67
68
|
end
|
68
69
|
|
69
70
|
def []=(key, value)
|
@@ -102,6 +103,7 @@ module Oj
|
|
102
103
|
def as_json(*)
|
103
104
|
name = self.class.name.to_s
|
104
105
|
raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
|
106
|
+
|
105
107
|
{ JSON.create_id => name, 't' => table }
|
106
108
|
end
|
107
109
|
end
|
@@ -232,6 +234,7 @@ module Oj
|
|
232
234
|
def as_json(*)
|
233
235
|
name = self.class.name.to_s
|
234
236
|
raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
|
237
|
+
|
235
238
|
{ JSON.create_id => name, 'v' => values }
|
236
239
|
end
|
237
240
|
end
|
@@ -273,7 +276,6 @@ module Oj
|
|
273
276
|
end
|
274
277
|
end
|
275
278
|
end
|
276
|
-
|
277
279
|
end # self.mimic_loaded
|
278
280
|
|
279
281
|
end # Oj
|