msgpack 1.4.2 → 1.7.3
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 +89 -0
- data/README.md +73 -13
- data/ext/java/org/msgpack/jruby/Buffer.java +26 -19
- data/ext/java/org/msgpack/jruby/Decoder.java +29 -21
- data/ext/java/org/msgpack/jruby/Encoder.java +68 -30
- data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +43 -64
- data/ext/java/org/msgpack/jruby/ExtensionValue.java +6 -9
- data/ext/java/org/msgpack/jruby/Factory.java +43 -42
- data/ext/java/org/msgpack/jruby/Packer.java +37 -40
- data/ext/java/org/msgpack/jruby/Unpacker.java +80 -73
- data/ext/msgpack/buffer.c +54 -74
- data/ext/msgpack/buffer.h +21 -18
- data/ext/msgpack/buffer_class.c +161 -52
- data/ext/msgpack/buffer_class.h +1 -0
- data/ext/msgpack/compat.h +0 -99
- data/ext/msgpack/extconf.rb +25 -46
- data/ext/msgpack/factory_class.c +143 -87
- data/ext/msgpack/packer.c +66 -43
- data/ext/msgpack/packer.h +25 -20
- data/ext/msgpack/packer_class.c +102 -130
- data/ext/msgpack/packer_class.h +11 -0
- data/ext/msgpack/packer_ext_registry.c +35 -40
- data/ext/msgpack/packer_ext_registry.h +41 -38
- 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 +136 -111
- data/ext/msgpack/unpacker.h +16 -13
- data/ext/msgpack/unpacker_class.c +86 -126
- data/ext/msgpack/unpacker_class.h +11 -0
- data/ext/msgpack/unpacker_ext_registry.c +40 -28
- data/ext/msgpack/unpacker_ext_registry.h +21 -18
- data/lib/msgpack/bigint.rb +69 -0
- data/lib/msgpack/buffer.rb +9 -0
- data/lib/msgpack/factory.rb +140 -10
- data/lib/msgpack/packer.rb +10 -1
- data/lib/msgpack/symbol.rb +21 -4
- data/lib/msgpack/time.rb +1 -1
- data/lib/msgpack/unpacker.rb +14 -1
- data/lib/msgpack/version.rb +1 -1
- data/lib/msgpack.rb +6 -7
- data/msgpack.gemspec +8 -5
- metadata +37 -82
- data/.gitignore +0 -23
- data/.rubocop.yml +0 -36
- data/.travis.yml +0 -39
- data/Gemfile +0 -9
- data/Rakefile +0 -71
- 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 -101
- data/doclib/msgpack/packer.rb +0 -208
- 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/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 -367
- 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 -557
- data/spec/random_compat.rb +0 -24
- data/spec/spec_helper.rb +0 -55
- data/spec/timestamp_spec.rb +0 -121
- data/spec/unpack_spec.rb +0 -57
- data/spec/unpacker_spec.rb +0 -819
data/ext/msgpack/buffer_class.c
CHANGED
@@ -21,20 +21,87 @@
|
|
21
21
|
#include "buffer.h"
|
22
22
|
#include "buffer_class.h"
|
23
23
|
|
24
|
-
VALUE cMessagePack_Buffer;
|
24
|
+
VALUE cMessagePack_Buffer = Qnil;
|
25
|
+
VALUE cMessagePack_HeldBuffer = Qnil;
|
25
26
|
|
26
27
|
static ID s_read;
|
27
28
|
static ID s_readpartial;
|
28
29
|
static ID s_write;
|
29
30
|
static ID s_append;
|
30
31
|
static ID s_close;
|
32
|
+
static ID s_at_owner;
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
static VALUE sym_read_reference_threshold;
|
35
|
+
static VALUE sym_write_reference_threshold;
|
36
|
+
static VALUE sym_io_buffer_size;
|
37
|
+
|
38
|
+
typedef struct msgpack_held_buffer_t msgpack_held_buffer_t;
|
39
|
+
struct msgpack_held_buffer_t {
|
40
|
+
size_t size;
|
41
|
+
VALUE mapped_strings[];
|
42
|
+
};
|
43
|
+
|
44
|
+
static void HeldBuffer_mark(void *data)
|
45
|
+
{
|
46
|
+
msgpack_held_buffer_t* held_buffer = (msgpack_held_buffer_t*)data;
|
47
|
+
for (size_t index = 0; index < held_buffer->size; index++) {
|
48
|
+
rb_gc_mark(held_buffer->mapped_strings[index]);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
static size_t HeldBuffer_memsize(const void *data)
|
53
|
+
{
|
54
|
+
const msgpack_held_buffer_t* held_buffer = (msgpack_held_buffer_t*)data;
|
55
|
+
return sizeof(size_t) + sizeof(VALUE) * held_buffer->size;
|
56
|
+
}
|
57
|
+
|
58
|
+
static const rb_data_type_t held_buffer_data_type = {
|
59
|
+
.wrap_struct_name = "msgpack:held_buffer",
|
60
|
+
.function = {
|
61
|
+
.dmark = HeldBuffer_mark,
|
62
|
+
.dfree = RUBY_TYPED_DEFAULT_FREE,
|
63
|
+
.dsize = HeldBuffer_memsize,
|
64
|
+
},
|
65
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
66
|
+
};
|
67
|
+
|
68
|
+
VALUE MessagePack_Buffer_hold(msgpack_buffer_t* buffer)
|
69
|
+
{
|
70
|
+
size_t mapped_strings_count = 0;
|
71
|
+
msgpack_buffer_chunk_t* c = buffer->head;
|
72
|
+
while (c != &buffer->tail) {
|
73
|
+
if (c->mapped_string != NO_MAPPED_STRING) {
|
74
|
+
mapped_strings_count++;
|
75
|
+
}
|
76
|
+
c = c->next;
|
77
|
+
}
|
78
|
+
if (c->mapped_string != NO_MAPPED_STRING) {
|
79
|
+
mapped_strings_count++;
|
80
|
+
}
|
81
|
+
|
82
|
+
if (mapped_strings_count == 0) {
|
83
|
+
return Qnil;
|
84
|
+
}
|
85
|
+
|
86
|
+
msgpack_held_buffer_t* held_buffer = xmalloc(sizeof(msgpack_held_buffer_t) + mapped_strings_count * sizeof(VALUE));
|
87
|
+
|
88
|
+
c = buffer->head;
|
89
|
+
mapped_strings_count = 0;
|
90
|
+
while (c != &buffer->tail) {
|
91
|
+
if (c->mapped_string != NO_MAPPED_STRING) {
|
92
|
+
held_buffer->mapped_strings[mapped_strings_count] = c->mapped_string;
|
93
|
+
mapped_strings_count++;
|
94
|
+
}
|
95
|
+
c = c->next;
|
96
|
+
}
|
97
|
+
if (c->mapped_string != NO_MAPPED_STRING) {
|
98
|
+
held_buffer->mapped_strings[mapped_strings_count] = c->mapped_string;
|
99
|
+
mapped_strings_count++;
|
37
100
|
}
|
101
|
+
held_buffer->size = mapped_strings_count;
|
102
|
+
return TypedData_Wrap_Struct(cMessagePack_HeldBuffer, &held_buffer_data_type, held_buffer);
|
103
|
+
}
|
104
|
+
|
38
105
|
|
39
106
|
#define CHECK_STRING_TYPE(value) \
|
40
107
|
value = rb_check_string_type(value); \
|
@@ -52,34 +119,69 @@ static void Buffer_free(void* data)
|
|
52
119
|
xfree(b);
|
53
120
|
}
|
54
121
|
|
122
|
+
static size_t Buffer_memsize(const void *data)
|
123
|
+
{
|
124
|
+
return sizeof(msgpack_buffer_t) + msgpack_buffer_memsize(data);
|
125
|
+
}
|
126
|
+
|
127
|
+
static const rb_data_type_t buffer_data_type = {
|
128
|
+
.wrap_struct_name = "msgpack:buffer",
|
129
|
+
.function = {
|
130
|
+
.dmark = msgpack_buffer_mark,
|
131
|
+
.dfree = Buffer_free,
|
132
|
+
.dsize = Buffer_memsize,
|
133
|
+
},
|
134
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
135
|
+
};
|
136
|
+
|
137
|
+
static const rb_data_type_t buffer_view_data_type = {
|
138
|
+
.wrap_struct_name = "msgpack:buffer_view",
|
139
|
+
.function = {
|
140
|
+
.dmark = NULL,
|
141
|
+
.dfree = NULL,
|
142
|
+
.dsize = NULL,
|
143
|
+
},
|
144
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
145
|
+
};
|
146
|
+
|
147
|
+
static inline msgpack_buffer_t *MessagePack_Buffer_get(VALUE object)
|
148
|
+
{
|
149
|
+
msgpack_buffer_t *buffer;
|
150
|
+
bool view = RTEST(rb_ivar_get(object, s_at_owner));
|
151
|
+
TypedData_Get_Struct(object, msgpack_buffer_t, view ? &buffer_view_data_type : &buffer_data_type, buffer);
|
152
|
+
if (!buffer) {
|
153
|
+
rb_raise(rb_eArgError, "Uninitialized Buffer object");
|
154
|
+
}
|
155
|
+
return buffer;
|
156
|
+
}
|
157
|
+
|
55
158
|
static VALUE Buffer_alloc(VALUE klass)
|
56
159
|
{
|
57
|
-
msgpack_buffer_t* b
|
160
|
+
msgpack_buffer_t* b;
|
161
|
+
VALUE buffer = TypedData_Make_Struct(klass, msgpack_buffer_t, &buffer_data_type, b);
|
58
162
|
msgpack_buffer_init(b);
|
59
|
-
|
60
|
-
return
|
163
|
+
rb_ivar_set(buffer, s_at_owner, Qnil);
|
164
|
+
return buffer;
|
61
165
|
}
|
62
166
|
|
63
167
|
static ID get_partial_read_method(VALUE io)
|
64
168
|
{
|
65
|
-
if(rb_respond_to(io, s_readpartial)) {
|
169
|
+
if(io != Qnil && rb_respond_to(io, s_readpartial)) {
|
66
170
|
return s_readpartial;
|
67
|
-
} else if(rb_respond_to(io, s_read)) {
|
68
|
-
return s_read;
|
69
|
-
} else {
|
70
|
-
return s_read;
|
71
171
|
}
|
172
|
+
return s_read;
|
72
173
|
}
|
73
174
|
|
74
175
|
static ID get_write_all_method(VALUE io)
|
75
176
|
{
|
76
|
-
if(
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
177
|
+
if(io != Qnil) {
|
178
|
+
if(rb_respond_to(io, s_write)) {
|
179
|
+
return s_write;
|
180
|
+
} else if(rb_respond_to(io, s_append)) {
|
181
|
+
return s_append;
|
182
|
+
}
|
82
183
|
}
|
184
|
+
return s_write;
|
83
185
|
}
|
84
186
|
|
85
187
|
void MessagePack_Buffer_set_options(msgpack_buffer_t* b, VALUE io, VALUE options)
|
@@ -91,27 +193,28 @@ void MessagePack_Buffer_set_options(msgpack_buffer_t* b, VALUE io, VALUE options
|
|
91
193
|
if(options != Qnil) {
|
92
194
|
VALUE v;
|
93
195
|
|
94
|
-
v = rb_hash_aref(options,
|
196
|
+
v = rb_hash_aref(options, sym_read_reference_threshold);
|
95
197
|
if(v != Qnil) {
|
96
|
-
msgpack_buffer_set_read_reference_threshold(b,
|
198
|
+
msgpack_buffer_set_read_reference_threshold(b, NUM2SIZET(v));
|
97
199
|
}
|
98
200
|
|
99
|
-
v = rb_hash_aref(options,
|
201
|
+
v = rb_hash_aref(options, sym_write_reference_threshold);
|
100
202
|
if(v != Qnil) {
|
101
|
-
msgpack_buffer_set_write_reference_threshold(b,
|
203
|
+
msgpack_buffer_set_write_reference_threshold(b, NUM2SIZET(v));
|
102
204
|
}
|
103
205
|
|
104
|
-
v = rb_hash_aref(options,
|
206
|
+
v = rb_hash_aref(options, sym_io_buffer_size);
|
105
207
|
if(v != Qnil) {
|
106
|
-
msgpack_buffer_set_io_buffer_size(b,
|
208
|
+
msgpack_buffer_set_io_buffer_size(b, NUM2SIZET(v));
|
107
209
|
}
|
108
210
|
}
|
109
211
|
}
|
110
212
|
|
111
213
|
VALUE MessagePack_Buffer_wrap(msgpack_buffer_t* b, VALUE owner)
|
112
214
|
{
|
113
|
-
|
114
|
-
|
215
|
+
VALUE buffer = TypedData_Wrap_Struct(cMessagePack_Buffer, &buffer_view_data_type, b);
|
216
|
+
rb_ivar_set(buffer, s_at_owner, owner);
|
217
|
+
return buffer;
|
115
218
|
}
|
116
219
|
|
117
220
|
static VALUE Buffer_initialize(int argc, VALUE* argv, VALUE self)
|
@@ -141,7 +244,7 @@ static VALUE Buffer_initialize(int argc, VALUE* argv, VALUE self)
|
|
141
244
|
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..1)", argc);
|
142
245
|
}
|
143
246
|
|
144
|
-
|
247
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
145
248
|
|
146
249
|
MessagePack_Buffer_set_options(b, io, options);
|
147
250
|
|
@@ -150,21 +253,21 @@ static VALUE Buffer_initialize(int argc, VALUE* argv, VALUE self)
|
|
150
253
|
|
151
254
|
static VALUE Buffer_clear(VALUE self)
|
152
255
|
{
|
153
|
-
|
256
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
154
257
|
msgpack_buffer_clear(b);
|
155
258
|
return Qnil;
|
156
259
|
}
|
157
260
|
|
158
261
|
static VALUE Buffer_size(VALUE self)
|
159
262
|
{
|
160
|
-
|
263
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
161
264
|
size_t size = msgpack_buffer_all_readable_size(b);
|
162
265
|
return SIZET2NUM(size);
|
163
266
|
}
|
164
267
|
|
165
268
|
static VALUE Buffer_empty_p(VALUE self)
|
166
269
|
{
|
167
|
-
|
270
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
168
271
|
if(msgpack_buffer_top_readable_size(b) == 0) {
|
169
272
|
return Qtrue;
|
170
273
|
} else {
|
@@ -174,7 +277,7 @@ static VALUE Buffer_empty_p(VALUE self)
|
|
174
277
|
|
175
278
|
static VALUE Buffer_write(VALUE self, VALUE string_or_buffer)
|
176
279
|
{
|
177
|
-
|
280
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
178
281
|
|
179
282
|
VALUE string = string_or_buffer; // TODO optimize if string_or_buffer is a Buffer
|
180
283
|
StringValue(string);
|
@@ -186,7 +289,7 @@ static VALUE Buffer_write(VALUE self, VALUE string_or_buffer)
|
|
186
289
|
|
187
290
|
static VALUE Buffer_append(VALUE self, VALUE string_or_buffer)
|
188
291
|
{
|
189
|
-
|
292
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
190
293
|
|
191
294
|
VALUE string = string_or_buffer; // TODO optimize if string_or_buffer is a Buffer
|
192
295
|
StringValue(string);
|
@@ -245,10 +348,11 @@ static VALUE read_until_eof_rescue(VALUE args)
|
|
245
348
|
return Qnil;
|
246
349
|
}
|
247
350
|
|
248
|
-
static VALUE read_until_eof_error(VALUE args)
|
351
|
+
static VALUE read_until_eof_error(VALUE args, VALUE error)
|
249
352
|
{
|
250
353
|
/* ignore EOFError */
|
251
354
|
UNUSED(args);
|
355
|
+
UNUSED(error);
|
252
356
|
return Qnil;
|
253
357
|
}
|
254
358
|
|
@@ -276,14 +380,13 @@ static inline size_t read_until_eof(msgpack_buffer_t* b, VALUE out, unsigned lon
|
|
276
380
|
|
277
381
|
static inline VALUE read_all(msgpack_buffer_t* b, VALUE out)
|
278
382
|
{
|
279
|
-
#ifndef DISABLE_BUFFER_READ_TO_S_OPTIMIZE
|
280
383
|
if(out == Qnil && !msgpack_buffer_has_io(b)) {
|
281
384
|
/* same as to_s && clear; optimize */
|
282
385
|
VALUE str = msgpack_buffer_all_as_string(b);
|
283
386
|
msgpack_buffer_clear(b);
|
284
387
|
return str;
|
285
388
|
}
|
286
|
-
|
389
|
+
|
287
390
|
MAKE_EMPTY_STRING(out);
|
288
391
|
read_until_eof(b, out, 0);
|
289
392
|
return out;
|
@@ -291,22 +394,22 @@ static inline VALUE read_all(msgpack_buffer_t* b, VALUE out)
|
|
291
394
|
|
292
395
|
static VALUE Buffer_skip(VALUE self, VALUE sn)
|
293
396
|
{
|
294
|
-
|
397
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
295
398
|
|
296
399
|
unsigned long n = FIX2ULONG(sn);
|
297
400
|
|
298
401
|
/* do nothing */
|
299
402
|
if(n == 0) {
|
300
|
-
return
|
403
|
+
return INT2NUM(0);
|
301
404
|
}
|
302
405
|
|
303
406
|
size_t sz = read_until_eof(b, Qnil, n);
|
304
|
-
return
|
407
|
+
return SIZET2NUM(sz);
|
305
408
|
}
|
306
409
|
|
307
410
|
static VALUE Buffer_skip_all(VALUE self, VALUE sn)
|
308
411
|
{
|
309
|
-
|
412
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
310
413
|
|
311
414
|
unsigned long n = FIX2ULONG(sn);
|
312
415
|
|
@@ -344,7 +447,7 @@ static VALUE Buffer_read_all(int argc, VALUE* argv, VALUE self)
|
|
344
447
|
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..2)", argc);
|
345
448
|
}
|
346
449
|
|
347
|
-
|
450
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
348
451
|
|
349
452
|
if(out != Qnil) {
|
350
453
|
CHECK_STRING_TYPE(out);
|
@@ -390,7 +493,7 @@ static VALUE Buffer_read(int argc, VALUE* argv, VALUE self)
|
|
390
493
|
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..2)", argc);
|
391
494
|
}
|
392
495
|
|
393
|
-
|
496
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
394
497
|
|
395
498
|
if(out != Qnil) {
|
396
499
|
CHECK_STRING_TYPE(out);
|
@@ -406,7 +509,6 @@ static VALUE Buffer_read(int argc, VALUE* argv, VALUE self)
|
|
406
509
|
return out;
|
407
510
|
}
|
408
511
|
|
409
|
-
#ifndef DISABLE_BUFFER_READ_TO_S_OPTIMIZE
|
410
512
|
if(!msgpack_buffer_has_io(b) && out == Qnil &&
|
411
513
|
msgpack_buffer_all_readable_size(b) <= n) {
|
412
514
|
/* same as to_s && clear; optimize */
|
@@ -419,7 +521,6 @@ static VALUE Buffer_read(int argc, VALUE* argv, VALUE self)
|
|
419
521
|
return str;
|
420
522
|
}
|
421
523
|
}
|
422
|
-
#endif
|
423
524
|
|
424
525
|
MAKE_EMPTY_STRING(out);
|
425
526
|
read_until_eof(b, out, n);
|
@@ -433,32 +534,32 @@ static VALUE Buffer_read(int argc, VALUE* argv, VALUE self)
|
|
433
534
|
|
434
535
|
static VALUE Buffer_to_str(VALUE self)
|
435
536
|
{
|
436
|
-
|
537
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
437
538
|
return msgpack_buffer_all_as_string(b);
|
438
539
|
}
|
439
540
|
|
440
541
|
static VALUE Buffer_to_a(VALUE self)
|
441
542
|
{
|
442
|
-
|
543
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
443
544
|
return msgpack_buffer_all_as_string_array(b);
|
444
545
|
}
|
445
546
|
|
446
547
|
static VALUE Buffer_flush(VALUE self)
|
447
548
|
{
|
448
|
-
|
549
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
449
550
|
msgpack_buffer_flush(b);
|
450
551
|
return self;
|
451
552
|
}
|
452
553
|
|
453
554
|
static VALUE Buffer_io(VALUE self)
|
454
555
|
{
|
455
|
-
|
556
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
456
557
|
return b->io;
|
457
558
|
}
|
458
559
|
|
459
560
|
static VALUE Buffer_close(VALUE self)
|
460
561
|
{
|
461
|
-
|
562
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
462
563
|
if(b->io != Qnil) {
|
463
564
|
return rb_funcall(b->io, s_close, 0);
|
464
565
|
}
|
@@ -467,9 +568,9 @@ static VALUE Buffer_close(VALUE self)
|
|
467
568
|
|
468
569
|
static VALUE Buffer_write_to(VALUE self, VALUE io)
|
469
570
|
{
|
470
|
-
|
571
|
+
msgpack_buffer_t *b = MessagePack_Buffer_get(self);
|
471
572
|
size_t sz = msgpack_buffer_flush_to_io(b, io, s_write, true);
|
472
|
-
return
|
573
|
+
return SIZET2NUM(sz);
|
473
574
|
}
|
474
575
|
|
475
576
|
void MessagePack_Buffer_module_init(VALUE mMessagePack)
|
@@ -479,9 +580,17 @@ void MessagePack_Buffer_module_init(VALUE mMessagePack)
|
|
479
580
|
s_write = rb_intern("write");
|
480
581
|
s_append = rb_intern("<<");
|
481
582
|
s_close = rb_intern("close");
|
583
|
+
s_at_owner = rb_intern("@owner");
|
584
|
+
|
585
|
+
sym_read_reference_threshold = ID2SYM(rb_intern("read_reference_threshold"));
|
586
|
+
sym_write_reference_threshold = ID2SYM(rb_intern("write_reference_threshold"));
|
587
|
+
sym_io_buffer_size = ID2SYM(rb_intern("io_buffer_size"));
|
482
588
|
|
483
589
|
msgpack_buffer_static_init();
|
484
590
|
|
591
|
+
cMessagePack_HeldBuffer = rb_define_class_under(mMessagePack, "HeldBuffer", rb_cBasicObject);
|
592
|
+
rb_undef_alloc_func(cMessagePack_HeldBuffer);
|
593
|
+
|
485
594
|
cMessagePack_Buffer = rb_define_class_under(mMessagePack, "Buffer", rb_cObject);
|
486
595
|
|
487
596
|
rb_define_alloc_func(cMessagePack_Buffer, Buffer_alloc);
|
data/ext/msgpack/buffer_class.h
CHANGED
@@ -25,6 +25,7 @@ extern VALUE cMessagePack_Buffer;
|
|
25
25
|
void MessagePack_Buffer_module_init(VALUE mMessagePack);
|
26
26
|
|
27
27
|
VALUE MessagePack_Buffer_wrap(msgpack_buffer_t* b, VALUE owner);
|
28
|
+
VALUE MessagePack_Buffer_hold(msgpack_buffer_t* b);
|
28
29
|
|
29
30
|
void MessagePack_Buffer_set_options(msgpack_buffer_t* b, VALUE io, VALUE options);
|
30
31
|
|
data/ext/msgpack/compat.h
CHANGED
@@ -22,104 +22,5 @@
|
|
22
22
|
#include "ruby.h"
|
23
23
|
#include "ruby/encoding.h"
|
24
24
|
|
25
|
-
#if defined(HAVE_RUBY_ST_H)
|
26
|
-
# include "ruby/st.h" /* ruby hash on Ruby 1.9 */
|
27
|
-
#elif defined(HAVE_ST_H)
|
28
|
-
# include "st.h" /* ruby hash on Ruby 1.8 */
|
29
|
-
#endif
|
30
|
-
|
31
|
-
|
32
|
-
/*
|
33
|
-
* ZALLOC_N (ruby 2.2 or later)
|
34
|
-
*/
|
35
|
-
#ifndef RB_ZALLOC_N
|
36
|
-
# define RB_ZALLOC_N(type,n) ((type*)ruby_xcalloc((size_t)(n),sizeof(type)))
|
37
|
-
#endif
|
38
|
-
#ifndef ZALLOC_N
|
39
|
-
# define ZALLOC_N(type,n) RB_ZALLOC_N(type,n)
|
40
|
-
#endif
|
41
|
-
|
42
|
-
|
43
|
-
/*
|
44
|
-
* define STR_DUP_LIKELY_DOES_COPY
|
45
|
-
* check rb_str_dup actually copies the string or not
|
46
|
-
*/
|
47
|
-
#if defined(RUBY_VM) && defined(FL_ALL) && defined(FL_USER1) && defined(FL_USER3) /* MRI 1.9 */
|
48
|
-
# define STR_DUP_LIKELY_DOES_COPY(str) FL_ALL(str, FL_USER1|FL_USER3) /* same as STR_ASSOC_P(str) */
|
49
|
-
|
50
|
-
#elif defined(FL_TEST) && defined(ELTS_SHARED) /* MRI 1.8 */
|
51
|
-
# define STR_DUP_LIKELY_DOES_COPY(str) (!FL_TEST(str, ELTS_SHARED))
|
52
|
-
|
53
|
-
//#elif defined(RUBINIUS) || defined(JRUBY) /* Rubinius and JRuby */
|
54
|
-
#else
|
55
|
-
# define STR_DUP_LIKELY_DOES_COPY(str) (1)
|
56
|
-
|
57
|
-
#endif
|
58
|
-
|
59
|
-
|
60
|
-
/*
|
61
|
-
* SIZET2NUM
|
62
|
-
*/
|
63
|
-
#ifndef SIZET2NUM /* MRI 1.8 */
|
64
|
-
# define SIZET2NUM(v) ULL2NUM(v)
|
65
|
-
#endif
|
66
|
-
|
67
|
-
|
68
|
-
/*
|
69
|
-
* rb_errinfo()
|
70
|
-
*/
|
71
|
-
#if defined(RUBY_VM) /* MRI 1.9 */
|
72
|
-
# define COMPAT_RERAISE rb_exc_raise(rb_errinfo())
|
73
|
-
|
74
|
-
#elif defined(JRUBY) /* JRuby */
|
75
|
-
# define COMPAT_RERAISE rb_exc_raise(rb_gv_get("$!"))
|
76
|
-
|
77
|
-
#else /* MRI 1.8 and Rubinius */
|
78
|
-
# define COMPAT_RERAISE rb_exc_raise(ruby_errinfo)
|
79
|
-
#endif
|
80
|
-
|
81
|
-
|
82
|
-
/*
|
83
|
-
* RBIGNUM_POSITIVE_P
|
84
|
-
*/
|
85
|
-
#ifndef RBIGNUM_POSITIVE_P
|
86
|
-
# if defined(RUBINIUS) /* Rubinius <= v1.2.3 */
|
87
|
-
# define RBIGNUM_POSITIVE_P(b) (rb_funcall(b, rb_intern(">="), 1, INT2FIX(0)) == Qtrue)
|
88
|
-
|
89
|
-
# elif defined(JRUBY) /* JRuby */
|
90
|
-
# define RBIGNUM_POSITIVE_P(b) (rb_funcall(b, rb_intern(">="), 1, INT2FIX(0)) == Qtrue)
|
91
|
-
# define rb_big2ull(b) rb_num2ull(b)
|
92
|
-
/*#define rb_big2ll(b) rb_num2ll(b)*/
|
93
|
-
|
94
|
-
# else /* MRI 1.8 */
|
95
|
-
# define RBIGNUM_POSITIVE_P(b) (RBIGNUM(b)->sign)
|
96
|
-
# endif
|
97
|
-
#endif
|
98
|
-
|
99
|
-
|
100
|
-
/*
|
101
|
-
* RSTRING_PTR, RSTRING_LEN
|
102
|
-
*/
|
103
|
-
#ifndef RSTRING_PTR /* MRI 1.8.5 */
|
104
|
-
# define RSTRING_PTR(s) (RSTRING(s)->ptr)
|
105
|
-
#endif
|
106
|
-
|
107
|
-
#ifndef RSTRING_LEN /* MRI 1.8.5 */
|
108
|
-
# define RSTRING_LEN(s) (RSTRING(s)->len)
|
109
|
-
#endif
|
110
|
-
|
111
|
-
|
112
|
-
/*
|
113
|
-
* RSTRUCT_GET
|
114
|
-
*/
|
115
|
-
#ifndef RSTRUCT_GET
|
116
|
-
# ifdef RSTRUCT_PTR /* MRI <= 2.0.0 */
|
117
|
-
# define RSTRUCT_GET(st, idx) (RSTRUCT_PTR(st)[idx])
|
118
|
-
# else /* Rubinius */
|
119
|
-
# define RSTRUCT_GET(st, idx) (rb_struct_aref(st, INT2FIX(idx)))
|
120
|
-
# endif
|
121
|
-
#endif
|
122
|
-
|
123
|
-
|
124
25
|
#endif
|
125
26
|
|
data/ext/msgpack/extconf.rb
CHANGED
@@ -1,67 +1,47 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
have_func("
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
23
|
-
# msgpack-ruby doesn't modify data came from RSTRING_PTR(str)
|
24
|
-
$CFLAGS << %[ -DRSTRING_NOT_MODIFIED]
|
25
|
-
# Rubinius C extensions don't grab GVL while rmem is not thread safe
|
26
|
-
$CFLAGS << %[ -DDISABLE_RMEM]
|
3
|
+
have_func("rb_enc_interned_str", "ruby.h") # Ruby 3.0+
|
4
|
+
have_func("rb_hash_new_capa", "ruby.h") # Ruby 3.2+
|
5
|
+
have_func("rb_proc_call_with_block", "ruby.h") # CRuby (TruffleRuby doesn't have it)
|
6
|
+
|
7
|
+
append_cflags([
|
8
|
+
"-fvisibility=hidden",
|
9
|
+
"-I..",
|
10
|
+
"-Wall",
|
11
|
+
"-O3",
|
12
|
+
"-std=gnu99"
|
13
|
+
])
|
14
|
+
append_cflags(RbConfig::CONFIG["debugflags"]) if RbConfig::CONFIG["debugflags"]
|
15
|
+
|
16
|
+
append_cflags("-DRUBY_DEBUG=1") if ENV["MSGPACK_DEBUG"]
|
17
|
+
|
18
|
+
if RUBY_VERSION.start_with?('3.0.') && RUBY_VERSION <= '3.0.5'
|
19
|
+
# https://bugs.ruby-lang.org/issues/18772
|
20
|
+
append_cflags("-DRB_ENC_INTERNED_STR_NULL_CHECK=1")
|
27
21
|
end
|
28
22
|
|
29
|
-
# checking if Hash#[]= (rb_hash_aset) dedupes string keys
|
23
|
+
# checking if Hash#[]= (rb_hash_aset) dedupes string keys (Ruby 2.6+)
|
30
24
|
h = {}
|
31
25
|
x = {}
|
32
26
|
r = rand.to_s
|
33
27
|
h[%W(#{r}).join('')] = :foo
|
34
28
|
x[%W(#{r}).join('')] = :foo
|
35
29
|
if x.keys[0].equal?(h.keys[0])
|
36
|
-
|
30
|
+
append_cflags("-DHASH_ASET_DEDUPE=1")
|
37
31
|
else
|
38
|
-
|
32
|
+
append_cflags("-DHASH_ASET_DEDUPE=0")
|
39
33
|
end
|
40
34
|
|
41
|
-
|
42
|
-
# checking if String#-@ (str_uminus) dedupes... '
|
43
|
-
begin
|
44
|
-
a = -(%w(t e s t).join)
|
45
|
-
b = -(%w(t e s t).join)
|
46
|
-
if a.equal?(b)
|
47
|
-
$CFLAGS << ' -DSTR_UMINUS_DEDUPE=1 '
|
48
|
-
else
|
49
|
-
$CFLAGS += ' -DSTR_UMINUS_DEDUPE=0 '
|
50
|
-
end
|
51
|
-
rescue NoMethodError
|
52
|
-
$CFLAGS << ' -DSTR_UMINUS_DEDUPE=0 '
|
53
|
-
end
|
54
|
-
|
55
|
-
# checking if String#-@ (str_uminus) directly interns frozen strings... '
|
35
|
+
# checking if String#-@ (str_uminus) directly interns frozen strings... ' (Ruby 3.0+)
|
56
36
|
begin
|
57
37
|
s = rand.to_s.freeze
|
58
38
|
if (-s).equal?(s) && (-s.dup).equal?(s)
|
59
|
-
|
39
|
+
append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=1")
|
60
40
|
else
|
61
|
-
|
41
|
+
append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=0")
|
62
42
|
end
|
63
43
|
rescue NoMethodError
|
64
|
-
|
44
|
+
append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=0")
|
65
45
|
end
|
66
46
|
|
67
47
|
if warnflags = CONFIG['warnflags']
|
@@ -69,4 +49,3 @@ if warnflags = CONFIG['warnflags']
|
|
69
49
|
end
|
70
50
|
|
71
51
|
create_makefile('msgpack/msgpack')
|
72
|
-
|