msgpack 1.5.1 → 1.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog +55 -0
- data/README.md +30 -1
- data/ext/java/org/msgpack/jruby/Buffer.java +3 -3
- data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +11 -20
- data/ext/java/org/msgpack/jruby/ExtensionValue.java +1 -1
- data/ext/java/org/msgpack/jruby/Factory.java +11 -50
- data/ext/java/org/msgpack/jruby/Packer.java +9 -24
- data/ext/java/org/msgpack/jruby/Unpacker.java +15 -32
- data/ext/msgpack/buffer.c +54 -69
- data/ext/msgpack/buffer.h +16 -18
- data/ext/msgpack/buffer_class.c +138 -37
- data/ext/msgpack/buffer_class.h +1 -0
- data/ext/msgpack/compat.h +0 -99
- data/ext/msgpack/extconf.rb +25 -39
- data/ext/msgpack/factory_class.c +75 -86
- data/ext/msgpack/packer.c +12 -39
- data/ext/msgpack/packer.h +1 -11
- data/ext/msgpack/packer_class.c +73 -99
- data/ext/msgpack/packer_class.h +11 -0
- data/ext/msgpack/packer_ext_registry.c +31 -28
- data/ext/msgpack/packer_ext_registry.h +10 -14
- data/ext/msgpack/rbinit.c +1 -1
- data/ext/msgpack/rmem.c +3 -4
- data/ext/msgpack/sysdep.h +5 -2
- data/ext/msgpack/unpacker.c +66 -94
- data/ext/msgpack/unpacker.h +13 -12
- data/ext/msgpack/unpacker_class.c +64 -80
- data/ext/msgpack/unpacker_class.h +11 -0
- data/ext/msgpack/unpacker_ext_registry.c +4 -16
- data/ext/msgpack/unpacker_ext_registry.h +3 -7
- data/lib/msgpack/buffer.rb +9 -0
- data/lib/msgpack/factory.rb +90 -63
- data/lib/msgpack/packer.rb +10 -1
- data/lib/msgpack/unpacker.rb +14 -1
- data/lib/msgpack/version.rb +1 -1
- data/lib/msgpack.rb +1 -0
- data/msgpack.gemspec +7 -3
- metadata +33 -56
- data/.github/workflows/ci.yaml +0 -57
- data/.gitignore +0 -23
- data/.rubocop.yml +0 -36
- data/Gemfile +0 -9
- data/Rakefile +0 -70
- data/appveyor.yml +0 -18
- data/bench/pack.rb +0 -23
- data/bench/pack_log.rb +0 -33
- data/bench/pack_log_long.rb +0 -65
- data/bench/pack_symbols.rb +0 -28
- data/bench/run.sh +0 -14
- data/bench/run_long.sh +0 -35
- data/bench/run_symbols.sh +0 -26
- data/bench/unpack.rb +0 -21
- data/bench/unpack_log.rb +0 -34
- data/bench/unpack_log_long.rb +0 -67
- data/doclib/msgpack/buffer.rb +0 -193
- data/doclib/msgpack/core_ext.rb +0 -101
- data/doclib/msgpack/error.rb +0 -19
- data/doclib/msgpack/extension_value.rb +0 -9
- data/doclib/msgpack/factory.rb +0 -145
- data/doclib/msgpack/packer.rb +0 -209
- data/doclib/msgpack/time.rb +0 -22
- data/doclib/msgpack/timestamp.rb +0 -44
- data/doclib/msgpack/unpacker.rb +0 -183
- data/doclib/msgpack.rb +0 -87
- data/msgpack.org.md +0 -46
- data/spec/bigint_spec.rb +0 -26
- data/spec/cases.json +0 -1
- data/spec/cases.msg +0 -0
- data/spec/cases_compact.msg +0 -0
- data/spec/cases_spec.rb +0 -39
- data/spec/cruby/buffer_io_spec.rb +0 -255
- data/spec/cruby/buffer_packer.rb +0 -29
- data/spec/cruby/buffer_spec.rb +0 -575
- data/spec/cruby/buffer_unpacker.rb +0 -19
- data/spec/cruby/unpacker_spec.rb +0 -70
- data/spec/ext_value_spec.rb +0 -99
- data/spec/exttypes.rb +0 -51
- data/spec/factory_spec.rb +0 -654
- data/spec/format_spec.rb +0 -301
- data/spec/jruby/benchmarks/shootout_bm.rb +0 -73
- data/spec/jruby/benchmarks/symbolize_keys_bm.rb +0 -25
- data/spec/jruby/unpacker_spec.rb +0 -186
- data/spec/msgpack_spec.rb +0 -214
- data/spec/pack_spec.rb +0 -61
- data/spec/packer_spec.rb +0 -575
- data/spec/random_compat.rb +0 -24
- data/spec/spec_helper.rb +0 -65
- data/spec/timestamp_spec.rb +0 -159
- data/spec/unpack_spec.rb +0 -57
- data/spec/unpacker_spec.rb +0 -847
data/ext/msgpack/unpacker.c
CHANGED
@@ -19,53 +19,48 @@
|
|
19
19
|
#include "unpacker.h"
|
20
20
|
#include "rmem.h"
|
21
21
|
#include "extension_value_class.h"
|
22
|
+
#include <assert.h>
|
22
23
|
|
23
|
-
#if !defined(
|
24
|
-
|
25
|
-
#define UNPACKER_STACK_RMEM
|
24
|
+
#if !defined(HAVE_RB_PROC_CALL_WITH_BLOCK)
|
25
|
+
#define rb_proc_call_with_block(recv, argc, argv, block) rb_funcallv(recv, rb_intern("call"), argc, argv)
|
26
26
|
#endif
|
27
27
|
|
28
28
|
static int RAW_TYPE_STRING = 256;
|
29
29
|
static int RAW_TYPE_BINARY = 257;
|
30
30
|
|
31
|
-
static ID s_call;
|
32
|
-
|
33
|
-
#ifdef UNPACKER_STACK_RMEM
|
34
31
|
static msgpack_rmem_t s_stack_rmem;
|
35
|
-
#endif
|
36
32
|
|
37
|
-
|
33
|
+
#if !defined(HAVE_RB_HASH_NEW_CAPA)
|
34
|
+
static inline VALUE rb_hash_new_capa(long capa)
|
38
35
|
{
|
39
|
-
|
40
|
-
|
36
|
+
return rb_hash_new();
|
37
|
+
}
|
41
38
|
#endif
|
42
39
|
|
43
|
-
|
40
|
+
void msgpack_unpacker_static_init(void)
|
41
|
+
{
|
42
|
+
assert(sizeof(msgpack_unpacker_stack_entry_t) * MSGPACK_UNPACKER_STACK_CAPACITY <= MSGPACK_RMEM_PAGE_SIZE);
|
43
|
+
|
44
|
+
msgpack_rmem_init(&s_stack_rmem);
|
44
45
|
}
|
45
46
|
|
46
|
-
void msgpack_unpacker_static_destroy()
|
47
|
+
void msgpack_unpacker_static_destroy(void)
|
47
48
|
{
|
48
|
-
#ifdef UNPACKER_STACK_RMEM
|
49
49
|
msgpack_rmem_destroy(&s_stack_rmem);
|
50
|
-
#endif
|
51
50
|
}
|
52
51
|
|
53
52
|
#define HEAD_BYTE_REQUIRED 0xc1
|
54
53
|
|
55
54
|
static inline msgpack_unpacker_stack_t* _msgpack_unpacker_new_stack(void) {
|
56
|
-
|
57
|
-
|
55
|
+
msgpack_unpacker_stack_t *stack = ZALLOC(msgpack_unpacker_stack_t);
|
56
|
+
stack->capacity = MSGPACK_UNPACKER_STACK_CAPACITY;
|
57
|
+
stack->data = msgpack_rmem_alloc(&s_stack_rmem);
|
58
58
|
/*memset(uk->stack, 0, MSGPACK_UNPACKER_STACK_CAPACITY);*/
|
59
|
-
|
60
|
-
/*uk->stack = calloc(MSGPACK_UNPACKER_STACK_CAPACITY, sizeof(msgpack_unpacker_stack_t));*/
|
61
|
-
return xmalloc(MSGPACK_UNPACKER_STACK_CAPACITY * sizeof(msgpack_unpacker_stack_t));
|
62
|
-
#endif
|
59
|
+
return stack;
|
63
60
|
}
|
64
61
|
|
65
|
-
msgpack_unpacker_t*
|
62
|
+
void _msgpack_unpacker_init(msgpack_unpacker_t* uk)
|
66
63
|
{
|
67
|
-
msgpack_unpacker_t* uk = ZALLOC_N(msgpack_unpacker_t, 1);
|
68
|
-
|
69
64
|
msgpack_buffer_init(UNPACKER_BUFFER_(uk));
|
70
65
|
|
71
66
|
uk->head_byte = HEAD_BYTE_REQUIRED;
|
@@ -74,17 +69,13 @@ msgpack_unpacker_t* _msgpack_unpacker_new(void)
|
|
74
69
|
uk->reading_raw = Qnil;
|
75
70
|
|
76
71
|
uk->stack = _msgpack_unpacker_new_stack();
|
77
|
-
uk->stack_capacity = MSGPACK_UNPACKER_STACK_CAPACITY;
|
78
|
-
|
79
|
-
return uk;
|
80
72
|
}
|
81
73
|
|
82
74
|
static inline void _msgpack_unpacker_free_stack(msgpack_unpacker_stack_t* stack) {
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
#endif
|
75
|
+
if (!msgpack_rmem_free(&s_stack_rmem, stack->data)) {
|
76
|
+
rb_bug("Failed to free an rmem pointer, memory leak?");
|
77
|
+
}
|
78
|
+
xfree(stack);
|
88
79
|
}
|
89
80
|
|
90
81
|
void _msgpack_unpacker_destroy(msgpack_unpacker_t* uk)
|
@@ -93,21 +84,28 @@ void _msgpack_unpacker_destroy(msgpack_unpacker_t* uk)
|
|
93
84
|
msgpack_buffer_destroy(UNPACKER_BUFFER_(uk));
|
94
85
|
}
|
95
86
|
|
87
|
+
void msgpack_unpacker_mark_stack(msgpack_unpacker_stack_t* stack)
|
88
|
+
{
|
89
|
+
while (stack) {
|
90
|
+
msgpack_unpacker_stack_entry_t* s = stack->data;
|
91
|
+
msgpack_unpacker_stack_entry_t* send = stack->data + stack->depth;
|
92
|
+
for(; s < send; s++) {
|
93
|
+
rb_gc_mark(s->object);
|
94
|
+
rb_gc_mark(s->key);
|
95
|
+
}
|
96
|
+
stack = stack->parent;
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
96
100
|
void msgpack_unpacker_mark(msgpack_unpacker_t* uk)
|
97
101
|
{
|
98
102
|
rb_gc_mark(uk->last_object);
|
99
103
|
rb_gc_mark(uk->reading_raw);
|
100
|
-
|
101
|
-
msgpack_unpacker_stack_t* s = uk->stack;
|
102
|
-
msgpack_unpacker_stack_t* send = uk->stack + uk->stack_depth;
|
103
|
-
for(; s < send; s++) {
|
104
|
-
rb_gc_mark(s->object);
|
105
|
-
rb_gc_mark(s->key);
|
106
|
-
}
|
107
|
-
|
104
|
+
msgpack_unpacker_mark_stack(uk->stack);
|
108
105
|
/* See MessagePack_Buffer_wrap */
|
109
106
|
/* msgpack_buffer_mark(UNPACKER_BUFFER_(uk)); */
|
110
107
|
rb_gc_mark(uk->buffer_ref);
|
108
|
+
rb_gc_mark(uk->self);
|
111
109
|
}
|
112
110
|
|
113
111
|
void _msgpack_unpacker_reset(msgpack_unpacker_t* uk)
|
@@ -116,9 +114,8 @@ void _msgpack_unpacker_reset(msgpack_unpacker_t* uk)
|
|
116
114
|
|
117
115
|
uk->head_byte = HEAD_BYTE_REQUIRED;
|
118
116
|
|
119
|
-
/*memset(uk->stack, 0, sizeof(msgpack_unpacker_t) * uk->
|
120
|
-
uk->
|
121
|
-
|
117
|
+
/*memset(uk->stack, 0, sizeof(msgpack_unpacker_t) * uk->stack->depth);*/
|
118
|
+
uk->stack->depth = 0;
|
122
119
|
uk->last_object = Qnil;
|
123
120
|
uk->reading_raw = Qnil;
|
124
121
|
uk->reading_raw_remaining = 0;
|
@@ -170,6 +167,9 @@ static inline int object_complete_symbol(msgpack_unpacker_t* uk, VALUE object)
|
|
170
167
|
static inline int object_complete_ext(msgpack_unpacker_t* uk, int ext_type, VALUE str)
|
171
168
|
{
|
172
169
|
if (uk->optimized_symbol_ext_type && ext_type == uk->symbol_ext_type) {
|
170
|
+
if (RB_UNLIKELY(NIL_P(str))) { // empty extension is returned as Qnil
|
171
|
+
return object_complete_symbol(uk, ID2SYM(rb_intern3("", 0, rb_utf8_encoding())));
|
172
|
+
}
|
173
173
|
return object_complete_symbol(uk, rb_str_intern(str));
|
174
174
|
}
|
175
175
|
|
@@ -178,7 +178,8 @@ static inline int object_complete_ext(msgpack_unpacker_t* uk, int ext_type, VALU
|
|
178
178
|
|
179
179
|
if(proc != Qnil) {
|
180
180
|
VALUE obj;
|
181
|
-
|
181
|
+
VALUE arg = (str == Qnil ? rb_str_buf_new(0) : str);
|
182
|
+
obj = rb_proc_call_with_block(proc, 1, &arg, Qnil);
|
182
183
|
return object_complete(uk, obj);
|
183
184
|
}
|
184
185
|
|
@@ -191,37 +192,37 @@ static inline int object_complete_ext(msgpack_unpacker_t* uk, int ext_type, VALU
|
|
191
192
|
}
|
192
193
|
|
193
194
|
/* stack funcs */
|
194
|
-
static inline
|
195
|
+
static inline msgpack_unpacker_stack_entry_t* _msgpack_unpacker_stack_entry_top(msgpack_unpacker_t* uk)
|
195
196
|
{
|
196
|
-
return &uk->stack[uk->
|
197
|
+
return &uk->stack->data[uk->stack->depth-1];
|
197
198
|
}
|
198
199
|
|
199
200
|
static inline int _msgpack_unpacker_stack_push(msgpack_unpacker_t* uk, enum stack_type_t type, size_t count, VALUE object)
|
200
201
|
{
|
201
202
|
reset_head_byte(uk);
|
202
203
|
|
203
|
-
if(uk->
|
204
|
+
if(uk->stack->capacity - uk->stack->depth <= 0) {
|
204
205
|
return PRIMITIVE_STACK_TOO_DEEP;
|
205
206
|
}
|
206
207
|
|
207
|
-
|
208
|
+
msgpack_unpacker_stack_entry_t* next = &uk->stack->data[uk->stack->depth];
|
208
209
|
next->count = count;
|
209
210
|
next->type = type;
|
210
211
|
next->object = object;
|
211
212
|
next->key = Qnil;
|
212
213
|
|
213
|
-
uk->
|
214
|
+
uk->stack->depth++;
|
214
215
|
return PRIMITIVE_CONTAINER_START;
|
215
216
|
}
|
216
217
|
|
217
218
|
static inline VALUE msgpack_unpacker_stack_pop(msgpack_unpacker_t* uk)
|
218
219
|
{
|
219
|
-
return --uk->
|
220
|
+
return --uk->stack->depth;
|
220
221
|
}
|
221
222
|
|
222
223
|
static inline bool msgpack_unpacker_stack_is_empty(msgpack_unpacker_t* uk)
|
223
224
|
{
|
224
|
-
return uk->
|
225
|
+
return uk->stack->depth == 0;
|
225
226
|
}
|
226
227
|
|
227
228
|
#ifdef USE_CASE_RANGE
|
@@ -249,8 +250,8 @@ static inline bool msgpack_unpacker_stack_is_empty(msgpack_unpacker_t* uk)
|
|
249
250
|
|
250
251
|
static inline bool is_reading_map_key(msgpack_unpacker_t* uk)
|
251
252
|
{
|
252
|
-
if(uk->
|
253
|
-
|
253
|
+
if(uk->stack->depth > 0) {
|
254
|
+
msgpack_unpacker_stack_entry_t* top = _msgpack_unpacker_stack_entry_top(uk);
|
254
255
|
if(top->type == STACK_TYPE_MAP_KEY) {
|
255
256
|
return true;
|
256
257
|
}
|
@@ -302,25 +303,17 @@ static inline int read_raw_body_begin(msgpack_unpacker_t* uk, int raw_type)
|
|
302
303
|
VALUE obj;
|
303
304
|
uk->last_object = Qnil;
|
304
305
|
reset_head_byte(uk);
|
305
|
-
size_t ext_size = uk->reading_raw_remaining;
|
306
306
|
uk->reading_raw_remaining = 0;
|
307
307
|
|
308
|
-
msgpack_unpacker_stack_t*
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
uk->stack = _msgpack_unpacker_new_stack();
|
313
|
-
uk->stack_depth = 0;
|
314
|
-
uk->stack_capacity = MSGPACK_UNPACKER_STACK_CAPACITY;
|
308
|
+
msgpack_unpacker_stack_t* child_stack = _msgpack_unpacker_new_stack();
|
309
|
+
child_stack->parent = uk->stack;
|
310
|
+
uk->stack = child_stack;
|
315
311
|
|
316
|
-
obj =
|
312
|
+
obj = rb_proc_call_with_block(proc, 1, &uk->self, Qnil);
|
317
313
|
|
318
|
-
|
319
|
-
|
320
|
-
uk->stack_depth = stack_depth;
|
321
|
-
uk->stack_capacity = stack_capacity;
|
314
|
+
uk->stack = child_stack->parent;
|
315
|
+
_msgpack_unpacker_free_stack(child_stack);
|
322
316
|
|
323
|
-
msgpack_buffer_skip(UNPACKER_BUFFER_(uk), ext_size);
|
324
317
|
return object_complete(uk, obj);
|
325
318
|
}
|
326
319
|
}
|
@@ -373,9 +366,6 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
373
366
|
|
374
367
|
SWITCH_RANGE(b, 0xa0, 0xbf) // FixRaw / fixstr
|
375
368
|
int count = b & 0x1f;
|
376
|
-
if(count == 0) {
|
377
|
-
return object_complete(uk, rb_utf8_str_new_static("", 0));
|
378
|
-
}
|
379
369
|
/* read_raw_body_begin sets uk->reading_raw */
|
380
370
|
uk->reading_raw_remaining = count;
|
381
371
|
return read_raw_body_begin(uk, RAW_TYPE_STRING);
|
@@ -392,7 +382,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
392
382
|
if(count == 0) {
|
393
383
|
return object_complete(uk, rb_hash_new());
|
394
384
|
}
|
395
|
-
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2,
|
385
|
+
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2, rb_hash_new_capa(count));
|
396
386
|
|
397
387
|
SWITCH_RANGE(b, 0xc0, 0xdf) // Variable
|
398
388
|
switch(b) {
|
@@ -475,7 +465,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
475
465
|
{
|
476
466
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
477
467
|
uint32_t u32 = _msgpack_be32(cb->u32);
|
478
|
-
return object_complete(uk, ULONG2NUM(
|
468
|
+
return object_complete(uk, ULONG2NUM(u32)); // long at least 32 bits
|
479
469
|
}
|
480
470
|
|
481
471
|
case 0xcf: // unsigned int 64
|
@@ -503,7 +493,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
503
493
|
{
|
504
494
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
505
495
|
int32_t i32 = _msgpack_be32(cb->i32);
|
506
|
-
return object_complete(uk, LONG2NUM(
|
496
|
+
return object_complete(uk, LONG2NUM(i32)); // long at least 32 bits
|
507
497
|
}
|
508
498
|
|
509
499
|
case 0xd3: // signed int 64
|
@@ -558,9 +548,6 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
558
548
|
{
|
559
549
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
560
550
|
uint8_t count = cb->u8;
|
561
|
-
if(count == 0) {
|
562
|
-
return object_complete(uk, rb_utf8_str_new_static("", 0));
|
563
|
-
}
|
564
551
|
/* read_raw_body_begin sets uk->reading_raw */
|
565
552
|
uk->reading_raw_remaining = count;
|
566
553
|
return read_raw_body_begin(uk, RAW_TYPE_STRING);
|
@@ -570,9 +557,6 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
570
557
|
{
|
571
558
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
572
559
|
uint16_t count = _msgpack_be16(cb->u16);
|
573
|
-
if(count == 0) {
|
574
|
-
return object_complete(uk, rb_utf8_str_new_static("", 0));
|
575
|
-
}
|
576
560
|
/* read_raw_body_begin sets uk->reading_raw */
|
577
561
|
uk->reading_raw_remaining = count;
|
578
562
|
return read_raw_body_begin(uk, RAW_TYPE_STRING);
|
@@ -582,9 +566,6 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
582
566
|
{
|
583
567
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
584
568
|
uint32_t count = _msgpack_be32(cb->u32);
|
585
|
-
if(count == 0) {
|
586
|
-
return object_complete(uk, rb_utf8_str_new_static("", 0));
|
587
|
-
}
|
588
569
|
/* read_raw_body_begin sets uk->reading_raw */
|
589
570
|
uk->reading_raw_remaining = count;
|
590
571
|
return read_raw_body_begin(uk, RAW_TYPE_STRING);
|
@@ -594,9 +575,6 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
594
575
|
{
|
595
576
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 1);
|
596
577
|
uint8_t count = cb->u8;
|
597
|
-
if(count == 0) {
|
598
|
-
return object_complete(uk, rb_str_new_static("", 0));
|
599
|
-
}
|
600
578
|
/* read_raw_body_begin sets uk->reading_raw */
|
601
579
|
uk->reading_raw_remaining = count;
|
602
580
|
return read_raw_body_begin(uk, RAW_TYPE_BINARY);
|
@@ -606,9 +584,6 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
606
584
|
{
|
607
585
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
608
586
|
uint16_t count = _msgpack_be16(cb->u16);
|
609
|
-
if(count == 0) {
|
610
|
-
return object_complete(uk, rb_str_new_static("", 0));
|
611
|
-
}
|
612
587
|
/* read_raw_body_begin sets uk->reading_raw */
|
613
588
|
uk->reading_raw_remaining = count;
|
614
589
|
return read_raw_body_begin(uk, RAW_TYPE_BINARY);
|
@@ -618,9 +593,6 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
618
593
|
{
|
619
594
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 4);
|
620
595
|
uint32_t count = _msgpack_be32(cb->u32);
|
621
|
-
if(count == 0) {
|
622
|
-
return object_complete(uk, rb_str_new_static("", 0));
|
623
|
-
}
|
624
596
|
/* read_raw_body_begin sets uk->reading_raw */
|
625
597
|
uk->reading_raw_remaining = count;
|
626
598
|
return read_raw_body_begin(uk, RAW_TYPE_BINARY);
|
@@ -653,7 +625,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
653
625
|
if(count == 0) {
|
654
626
|
return object_complete(uk, rb_hash_new());
|
655
627
|
}
|
656
|
-
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2,
|
628
|
+
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2, rb_hash_new_capa(count));
|
657
629
|
}
|
658
630
|
|
659
631
|
case 0xdf: // map 32
|
@@ -663,7 +635,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
663
635
|
if(count == 0) {
|
664
636
|
return object_complete(uk, rb_hash_new());
|
665
637
|
}
|
666
|
-
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2,
|
638
|
+
return _msgpack_unpacker_stack_push(uk, STACK_TYPE_MAP_KEY, count*2, rb_hash_new_capa(count));
|
667
639
|
}
|
668
640
|
|
669
641
|
default:
|
@@ -750,7 +722,7 @@ int msgpack_unpacker_read(msgpack_unpacker_t* uk, size_t target_stack_depth)
|
|
750
722
|
|
751
723
|
container_completed:
|
752
724
|
{
|
753
|
-
|
725
|
+
msgpack_unpacker_stack_entry_t* top = _msgpack_unpacker_stack_entry_top(uk);
|
754
726
|
switch(top->type) {
|
755
727
|
case STACK_TYPE_ARRAY:
|
756
728
|
rb_ary_push(top->object, uk->last_object);
|
@@ -800,7 +772,7 @@ int msgpack_unpacker_skip(msgpack_unpacker_t* uk, size_t target_stack_depth)
|
|
800
772
|
|
801
773
|
container_completed:
|
802
774
|
{
|
803
|
-
|
775
|
+
msgpack_unpacker_stack_entry_t* top = _msgpack_unpacker_stack_entry_top(uk);
|
804
776
|
|
805
777
|
/* this section optimized out */
|
806
778
|
// TODO object_complete still creates objects which should be optimized out
|
data/ext/msgpack/unpacker.h
CHANGED
@@ -21,12 +21,11 @@
|
|
21
21
|
#include "buffer.h"
|
22
22
|
#include "unpacker_ext_registry.h"
|
23
23
|
|
24
|
-
#ifndef MSGPACK_UNPACKER_STACK_CAPACITY
|
25
24
|
#define MSGPACK_UNPACKER_STACK_CAPACITY 128
|
26
|
-
#endif
|
27
25
|
|
28
26
|
struct msgpack_unpacker_t;
|
29
27
|
typedef struct msgpack_unpacker_t msgpack_unpacker_t;
|
28
|
+
typedef struct msgpack_unpacker_stack_t msgpack_unpacker_stack_t;
|
30
29
|
|
31
30
|
enum stack_type_t {
|
32
31
|
STACK_TYPE_ARRAY,
|
@@ -39,19 +38,21 @@ typedef struct {
|
|
39
38
|
enum stack_type_t type;
|
40
39
|
VALUE object;
|
41
40
|
VALUE key;
|
42
|
-
}
|
41
|
+
} msgpack_unpacker_stack_entry_t;
|
43
42
|
|
44
|
-
|
43
|
+
struct msgpack_unpacker_stack_t {
|
44
|
+
size_t depth;
|
45
|
+
size_t capacity;
|
46
|
+
msgpack_unpacker_stack_entry_t *data;
|
47
|
+
msgpack_unpacker_stack_t *parent;
|
48
|
+
};
|
45
49
|
|
46
50
|
struct msgpack_unpacker_t {
|
47
51
|
msgpack_buffer_t buffer;
|
48
|
-
|
52
|
+
msgpack_unpacker_stack_t *stack;
|
49
53
|
unsigned int head_byte;
|
50
54
|
|
51
|
-
|
52
|
-
size_t stack_depth;
|
53
|
-
size_t stack_capacity;
|
54
|
-
|
55
|
+
VALUE self;
|
55
56
|
VALUE last_object;
|
56
57
|
|
57
58
|
VALUE reading_raw;
|
@@ -82,11 +83,11 @@ enum msgpack_unpacker_object_type {
|
|
82
83
|
TYPE_MAP,
|
83
84
|
};
|
84
85
|
|
85
|
-
void msgpack_unpacker_static_init();
|
86
|
+
void msgpack_unpacker_static_init(void);
|
86
87
|
|
87
|
-
void msgpack_unpacker_static_destroy();
|
88
|
+
void msgpack_unpacker_static_destroy(void);
|
88
89
|
|
89
|
-
msgpack_unpacker_t*
|
90
|
+
void _msgpack_unpacker_init(msgpack_unpacker_t*);
|
90
91
|
|
91
92
|
void _msgpack_unpacker_destroy(msgpack_unpacker_t* uk);
|
92
93
|
|