msgpack 0.7.4 → 1.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +3 -1
- data/.rubocop.yml +3 -0
- data/.travis.yml +27 -14
- data/ChangeLog +89 -1
- data/Gemfile +6 -1
- data/README.rdoc +55 -1
- data/Rakefile +5 -1
- data/bench/pack_symbols.rb +28 -0
- data/bench/run_symbols.sh +26 -0
- data/doclib/msgpack.rb +2 -2
- data/doclib/msgpack/core_ext.rb +20 -20
- data/doclib/msgpack/factory.rb +33 -0
- data/doclib/msgpack/packer.rb +20 -0
- data/doclib/msgpack/time.rb +22 -0
- data/doclib/msgpack/timestamp.rb +44 -0
- data/ext/java/org/msgpack/jruby/Buffer.java +4 -0
- data/ext/java/org/msgpack/jruby/Encoder.java +48 -18
- data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +67 -38
- data/ext/java/org/msgpack/jruby/Factory.java +20 -8
- data/ext/java/org/msgpack/jruby/MessagePackLibrary.java +0 -92
- data/ext/java/org/msgpack/jruby/Packer.java +114 -11
- data/ext/java/org/msgpack/jruby/Unpacker.java +15 -8
- data/ext/msgpack/buffer.h +14 -0
- data/ext/msgpack/buffer_class.c +1 -1
- data/ext/msgpack/compat.h +10 -0
- data/ext/msgpack/factory_class.c +24 -17
- data/ext/msgpack/factory_class.h +0 -2
- data/ext/msgpack/packer.c +5 -4
- data/ext/msgpack/packer.h +13 -1
- data/ext/msgpack/packer_class.c +130 -43
- data/ext/msgpack/packer_class.h +0 -2
- data/ext/msgpack/packer_ext_registry.c +2 -2
- data/ext/msgpack/packer_ext_registry.h +64 -25
- data/ext/msgpack/rbinit.c +0 -2
- data/ext/msgpack/unpacker.c +3 -3
- data/ext/msgpack/unpacker_class.c +25 -56
- data/ext/msgpack/unpacker_class.h +0 -2
- data/ext/msgpack/unpacker_ext_registry.c +2 -2
- data/ext/msgpack/unpacker_ext_registry.h +3 -3
- data/lib/msgpack.rb +36 -0
- data/lib/msgpack/core_ext.rb +139 -0
- data/lib/msgpack/factory.rb +21 -0
- data/lib/msgpack/symbol.rb +9 -0
- data/lib/msgpack/time.rb +29 -0
- data/lib/msgpack/timestamp.rb +76 -0
- data/lib/msgpack/version.rb +8 -1
- data/msgpack.gemspec +6 -7
- data/spec/cruby/buffer_spec.rb +6 -1
- data/spec/factory_spec.rb +134 -0
- data/spec/msgpack_spec.rb +52 -0
- data/spec/packer_spec.rb +200 -0
- data/spec/timestamp_spec.rb +121 -0
- data/spec/unpacker_spec.rb +29 -0
- metadata +29 -23
- data/ext/msgpack/core_ext.c +0 -144
- data/ext/msgpack/core_ext.h +0 -26
data/ext/msgpack/packer_class.h
CHANGED
@@ -64,7 +64,7 @@ __rb_hash_clear_clear_i(key, value, dummy)
|
|
64
64
|
#endif
|
65
65
|
|
66
66
|
VALUE msgpack_packer_ext_registry_put(msgpack_packer_ext_registry_t* pkrg,
|
67
|
-
VALUE
|
67
|
+
VALUE ext_module, int ext_type, VALUE proc, VALUE arg)
|
68
68
|
{
|
69
69
|
VALUE e = rb_ary_new3(3, INT2FIX(ext_type), proc, arg);
|
70
70
|
/* clear lookup cache not to miss added type */
|
@@ -75,5 +75,5 @@ VALUE msgpack_packer_ext_registry_put(msgpack_packer_ext_registry_t* pkrg,
|
|
75
75
|
rb_hash_foreach(pkrg->cache, __rb_hash_clear_clear_i, 0);
|
76
76
|
}
|
77
77
|
#endif
|
78
|
-
return rb_hash_aset(pkrg->hash,
|
78
|
+
return rb_hash_aset(pkrg->hash, ext_module, e);
|
79
79
|
}
|
@@ -15,8 +15,8 @@
|
|
15
15
|
* See the License for the specific language governing permissions and
|
16
16
|
* limitations under the License.
|
17
17
|
*/
|
18
|
-
#ifndef
|
19
|
-
#define
|
18
|
+
#ifndef MSGPACK_RUBY_PACKER_EXT_REGISTRY_H__
|
19
|
+
#define MSGPACK_RUBY_PACKER_EXT_REGISTRY_H__
|
20
20
|
|
21
21
|
#include "compat.h"
|
22
22
|
#include "ruby.h"
|
@@ -26,10 +26,7 @@ typedef struct msgpack_packer_ext_registry_t msgpack_packer_ext_registry_t;
|
|
26
26
|
|
27
27
|
struct msgpack_packer_ext_registry_t {
|
28
28
|
VALUE hash;
|
29
|
-
|
30
|
-
* lookup cache for subclasses of registered classes
|
31
|
-
*/
|
32
|
-
VALUE cache;
|
29
|
+
VALUE cache; // lookup cache for ext types inherited from a super class
|
33
30
|
};
|
34
31
|
|
35
32
|
void msgpack_packer_ext_registry_static_init();
|
@@ -47,9 +44,9 @@ void msgpack_packer_ext_registry_dup(msgpack_packer_ext_registry_t* src,
|
|
47
44
|
msgpack_packer_ext_registry_t* dst);
|
48
45
|
|
49
46
|
VALUE msgpack_packer_ext_registry_put(msgpack_packer_ext_registry_t* pkrg,
|
50
|
-
VALUE
|
47
|
+
VALUE ext_module, int ext_type, VALUE proc, VALUE arg);
|
51
48
|
|
52
|
-
static int
|
49
|
+
static int msgpack_packer_ext_find_superclass(VALUE key, VALUE value, VALUE arg)
|
53
50
|
{
|
54
51
|
VALUE *args = (VALUE *) arg;
|
55
52
|
if(key == Qundef) {
|
@@ -62,34 +59,76 @@ static int msgpack_packer_ext_find_inherited(VALUE key, VALUE value, VALUE arg)
|
|
62
59
|
return ST_CONTINUE;
|
63
60
|
}
|
64
61
|
|
62
|
+
static inline VALUE msgpack_packer_ext_registry_fetch(msgpack_packer_ext_registry_t* pkrg,
|
63
|
+
VALUE lookup_class, int* ext_type_result)
|
64
|
+
{
|
65
|
+
// fetch lookup_class from hash, which is a hash to register classes
|
66
|
+
VALUE type = rb_hash_lookup(pkrg->hash, lookup_class);
|
67
|
+
if(type != Qnil) {
|
68
|
+
*ext_type_result = FIX2INT(rb_ary_entry(type, 0));
|
69
|
+
return rb_ary_entry(type, 1);
|
70
|
+
}
|
71
|
+
|
72
|
+
// fetch lookup_class from cache, which stores results of searching ancestors from pkrg->hash
|
73
|
+
VALUE type_inht = rb_hash_lookup(pkrg->cache, lookup_class);
|
74
|
+
if(type_inht != Qnil) {
|
75
|
+
*ext_type_result = FIX2INT(rb_ary_entry(type_inht, 0));
|
76
|
+
return rb_ary_entry(type_inht, 1);
|
77
|
+
}
|
78
|
+
|
79
|
+
return Qnil;
|
80
|
+
}
|
65
81
|
|
66
82
|
static inline VALUE msgpack_packer_ext_registry_lookup(msgpack_packer_ext_registry_t* pkrg,
|
67
|
-
VALUE
|
83
|
+
VALUE instance, int* ext_type_result)
|
68
84
|
{
|
69
|
-
VALUE
|
70
|
-
|
71
|
-
|
72
|
-
|
85
|
+
VALUE lookup_class;
|
86
|
+
VALUE type;
|
87
|
+
|
88
|
+
/*
|
89
|
+
* 1. check whether singleton_class of this instance is registered (or resolved in past) or not.
|
90
|
+
*
|
91
|
+
* Objects of type Integer (Fixnum, Bignum), Float, Symbol and frozen
|
92
|
+
* String have no singleton class and raise a TypeError when trying to get
|
93
|
+
* it. See implementation of #singleton_class in ruby's source code:
|
94
|
+
* VALUE rb_singleton_class(VALUE obj);
|
95
|
+
*
|
96
|
+
* Since all but symbols are already filtered out when reaching this code
|
97
|
+
* only symbols are checked here.
|
98
|
+
*/
|
99
|
+
if (!SYMBOL_P(instance)) {
|
100
|
+
lookup_class = rb_singleton_class(instance);
|
101
|
+
|
102
|
+
type = msgpack_packer_ext_registry_fetch(pkrg, lookup_class, ext_type_result);
|
103
|
+
|
104
|
+
if(type != Qnil) {
|
105
|
+
return type;
|
106
|
+
}
|
73
107
|
}
|
74
108
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
109
|
+
/*
|
110
|
+
* 2. check the class of instance is registered (or resolved in past) or not.
|
111
|
+
*/
|
112
|
+
type = msgpack_packer_ext_registry_fetch(pkrg, rb_obj_class(instance), ext_type_result);
|
113
|
+
|
114
|
+
if(type != Qnil) {
|
115
|
+
return type;
|
79
116
|
}
|
80
117
|
|
81
118
|
/*
|
82
|
-
* check all keys whether it is
|
119
|
+
* 3. check all keys whether it is an ancestor of lookup_class, or not
|
83
120
|
*/
|
84
121
|
VALUE args[2];
|
85
|
-
args[0] =
|
122
|
+
args[0] = lookup_class;
|
86
123
|
args[1] = Qnil;
|
87
|
-
rb_hash_foreach(pkrg->hash,
|
88
|
-
|
89
|
-
VALUE
|
90
|
-
if(
|
91
|
-
|
92
|
-
|
124
|
+
rb_hash_foreach(pkrg->hash, msgpack_packer_ext_find_superclass, (VALUE) args);
|
125
|
+
|
126
|
+
VALUE superclass = args[1];
|
127
|
+
if(superclass != Qnil) {
|
128
|
+
VALUE superclass_type = rb_hash_lookup(pkrg->hash, superclass);
|
129
|
+
rb_hash_aset(pkrg->cache, lookup_class, superclass_type);
|
130
|
+
*ext_type_result = FIX2INT(rb_ary_entry(superclass_type, 0));
|
131
|
+
return rb_ary_entry(superclass_type, 1);
|
93
132
|
}
|
94
133
|
|
95
134
|
return Qnil;
|
data/ext/msgpack/rbinit.c
CHANGED
@@ -21,7 +21,6 @@
|
|
21
21
|
#include "unpacker_class.h"
|
22
22
|
#include "factory_class.h"
|
23
23
|
#include "extension_value_class.h"
|
24
|
-
#include "core_ext.h"
|
25
24
|
|
26
25
|
void Init_msgpack(void)
|
27
26
|
{
|
@@ -32,6 +31,5 @@ void Init_msgpack(void)
|
|
32
31
|
MessagePack_Unpacker_module_init(mMessagePack);
|
33
32
|
MessagePack_Factory_module_init(mMessagePack);
|
34
33
|
MessagePack_ExtensionValue_module_init(mMessagePack);
|
35
|
-
MessagePack_core_ext_module_init();
|
36
34
|
}
|
37
35
|
|
data/ext/msgpack/unpacker.c
CHANGED
@@ -369,7 +369,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
369
369
|
{
|
370
370
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 2);
|
371
371
|
uint8_t length = cb->u8;
|
372
|
-
int ext_type = cb->buffer[1];
|
372
|
+
int ext_type = (signed char) cb->buffer[1];
|
373
373
|
if(length == 0) {
|
374
374
|
return object_complete_ext(uk, ext_type, rb_str_buf_new(0));
|
375
375
|
}
|
@@ -381,7 +381,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
381
381
|
{
|
382
382
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 3);
|
383
383
|
uint16_t length = _msgpack_be16(cb->u16);
|
384
|
-
int ext_type = cb->buffer[2];
|
384
|
+
int ext_type = (signed char) cb->buffer[2];
|
385
385
|
if(length == 0) {
|
386
386
|
return object_complete_ext(uk, ext_type, rb_str_buf_new(0));
|
387
387
|
}
|
@@ -393,7 +393,7 @@ static int read_primitive(msgpack_unpacker_t* uk)
|
|
393
393
|
{
|
394
394
|
READ_CAST_BLOCK_OR_RETURN_EOF(cb, uk, 5);
|
395
395
|
uint32_t length = _msgpack_be32(cb->u32);
|
396
|
-
int ext_type = cb->buffer[4];
|
396
|
+
int ext_type = (signed char) cb->buffer[4];
|
397
397
|
if(length == 0) {
|
398
398
|
return object_complete_ext(uk, ext_type, rb_str_buf_new(0));
|
399
399
|
}
|
@@ -58,14 +58,10 @@ static void Unpacker_mark(msgpack_unpacker_t* uk)
|
|
58
58
|
|
59
59
|
VALUE MessagePack_Unpacker_alloc(VALUE klass)
|
60
60
|
{
|
61
|
-
msgpack_unpacker_t* uk =
|
61
|
+
msgpack_unpacker_t* uk = ZALLOC_N(msgpack_unpacker_t, 1);
|
62
62
|
_msgpack_unpacker_init(uk);
|
63
63
|
|
64
64
|
VALUE self = Data_Wrap_Struct(klass, Unpacker_mark, Unpacker_free, uk);
|
65
|
-
|
66
|
-
msgpack_unpacker_ext_registry_init(&uk->ext_registry);
|
67
|
-
uk->buffer_ref = MessagePack_Buffer_wrap(UNPACKER_BUFFER_(uk), self);
|
68
|
-
|
69
65
|
return self;
|
70
66
|
}
|
71
67
|
|
@@ -81,9 +77,6 @@ VALUE MessagePack_Unpacker_initialize(int argc, VALUE* argv, VALUE self)
|
|
81
77
|
VALUE v = argv[0];
|
82
78
|
if(rb_type(v) == T_HASH) {
|
83
79
|
options = v;
|
84
|
-
if(rb_type(options) != T_HASH) {
|
85
|
-
rb_raise(rb_eArgError, "expected Hash but found %s.", rb_obj_classname(options));
|
86
|
-
}
|
87
80
|
} else {
|
88
81
|
io = v;
|
89
82
|
}
|
@@ -101,6 +94,9 @@ VALUE MessagePack_Unpacker_initialize(int argc, VALUE* argv, VALUE self)
|
|
101
94
|
|
102
95
|
UNPACKER(self, uk);
|
103
96
|
|
97
|
+
msgpack_unpacker_ext_registry_init(&uk->ext_registry);
|
98
|
+
uk->buffer_ref = MessagePack_Buffer_wrap(UNPACKER_BUFFER_(uk), self);
|
99
|
+
|
104
100
|
MessagePack_Buffer_set_options(UNPACKER_BUFFER_(uk), io, options);
|
105
101
|
|
106
102
|
if(options != Qnil) {
|
@@ -257,6 +253,17 @@ static VALUE Unpacker_feed(VALUE self, VALUE data)
|
|
257
253
|
return self;
|
258
254
|
}
|
259
255
|
|
256
|
+
static VALUE Unpacker_feed_reference(VALUE self, VALUE data)
|
257
|
+
{
|
258
|
+
UNPACKER(self, uk);
|
259
|
+
|
260
|
+
StringValue(data);
|
261
|
+
|
262
|
+
msgpack_buffer_append_string_reference(UNPACKER_BUFFER_(uk), data);
|
263
|
+
|
264
|
+
return self;
|
265
|
+
}
|
266
|
+
|
260
267
|
static VALUE Unpacker_each_impl(VALUE self)
|
261
268
|
{
|
262
269
|
UNPACKER(self, uk);
|
@@ -313,8 +320,7 @@ static VALUE Unpacker_feed_each(VALUE self, VALUE data)
|
|
313
320
|
}
|
314
321
|
#endif
|
315
322
|
|
316
|
-
|
317
|
-
Unpacker_feed(self, data);
|
323
|
+
Unpacker_feed_reference(self, data);
|
318
324
|
return Unpacker_each(self);
|
319
325
|
}
|
320
326
|
|
@@ -348,7 +354,7 @@ static VALUE Unpacker_register_type(int argc, VALUE* argv, VALUE self)
|
|
348
354
|
int ext_type;
|
349
355
|
VALUE proc;
|
350
356
|
VALUE arg;
|
351
|
-
VALUE
|
357
|
+
VALUE ext_module;
|
352
358
|
|
353
359
|
switch (argc) {
|
354
360
|
case 1:
|
@@ -361,50 +367,32 @@ static VALUE Unpacker_register_type(int argc, VALUE* argv, VALUE self)
|
|
361
367
|
proc = rb_block_proc();
|
362
368
|
#endif
|
363
369
|
arg = proc;
|
364
|
-
|
370
|
+
ext_module = Qnil;
|
365
371
|
break;
|
366
372
|
case 3:
|
367
373
|
/* register_type(0x7f, Time, :from_msgpack_ext) */
|
368
|
-
|
374
|
+
ext_module = argv[1];
|
369
375
|
arg = argv[2];
|
370
|
-
proc = rb_obj_method(
|
376
|
+
proc = rb_obj_method(ext_module, arg);
|
371
377
|
break;
|
372
378
|
default:
|
373
379
|
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 3)", argc);
|
374
380
|
}
|
375
381
|
|
376
|
-
ext_type =
|
382
|
+
ext_type = NUM2INT(argv[0]);
|
377
383
|
if(ext_type < -128 || ext_type > 127) {
|
378
384
|
rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type);
|
379
385
|
}
|
380
386
|
|
381
|
-
msgpack_unpacker_ext_registry_put(&uk->ext_registry,
|
387
|
+
msgpack_unpacker_ext_registry_put(&uk->ext_registry, ext_module, ext_type, proc, arg);
|
382
388
|
|
383
389
|
return Qnil;
|
384
390
|
}
|
385
391
|
|
386
|
-
VALUE
|
392
|
+
static VALUE Unpacker_full_unpack(VALUE self)
|
387
393
|
{
|
388
|
-
VALUE src;
|
389
|
-
VALUE self;
|
390
|
-
|
391
|
-
if (argc < 0 || argc > 2) {
|
392
|
-
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..2)", argc);
|
393
|
-
}
|
394
|
-
src = argv[0];
|
395
|
-
|
396
|
-
if(rb_type(src) == T_STRING) {
|
397
|
-
self = MessagePack_Factory_unpacker(argc - 1, argv + 1, cMessagePack_DefaultFactory);
|
398
|
-
UNPACKER(self, uk);
|
399
|
-
msgpack_buffer_append_string(UNPACKER_BUFFER_(uk), src);
|
400
|
-
} else {
|
401
|
-
self = MessagePack_Factory_unpacker(argc, argv, cMessagePack_DefaultFactory);
|
402
|
-
}
|
403
394
|
UNPACKER(self, uk);
|
404
395
|
|
405
|
-
/* prefer reference than copying; see MessagePack_Unpacker_module_init */
|
406
|
-
msgpack_buffer_set_write_reference_threshold(UNPACKER_BUFFER_(uk), 0);
|
407
|
-
|
408
396
|
int r = msgpack_unpacker_read(uk, 0);
|
409
397
|
if(r < 0) {
|
410
398
|
raise_unpacker_error(r);
|
@@ -416,27 +404,9 @@ VALUE MessagePack_unpack(int argc, VALUE* argv)
|
|
416
404
|
rb_raise(eMalformedFormatError, "%zd extra bytes after the deserialized object", extra);
|
417
405
|
}
|
418
406
|
|
419
|
-
#ifdef RB_GC_GUARD
|
420
|
-
/* This prevents compilers from optimizing out the `self` variable
|
421
|
-
* from stack. Otherwise GC free()s it. */
|
422
|
-
RB_GC_GUARD(self);
|
423
|
-
#endif
|
424
|
-
|
425
407
|
return msgpack_unpacker_get_last_object(uk);
|
426
408
|
}
|
427
409
|
|
428
|
-
static VALUE MessagePack_load_module_method(int argc, VALUE* argv, VALUE mod)
|
429
|
-
{
|
430
|
-
UNUSED(mod);
|
431
|
-
return MessagePack_unpack(argc, argv);
|
432
|
-
}
|
433
|
-
|
434
|
-
static VALUE MessagePack_unpack_module_method(int argc, VALUE* argv, VALUE mod)
|
435
|
-
{
|
436
|
-
UNUSED(mod);
|
437
|
-
return MessagePack_unpack(argc, argv);
|
438
|
-
}
|
439
|
-
|
440
410
|
VALUE MessagePack_Unpacker_new(int argc, VALUE* argv)
|
441
411
|
{
|
442
412
|
VALUE self = MessagePack_Unpacker_alloc(cMessagePack_Unpacker);
|
@@ -478,6 +448,7 @@ void MessagePack_Unpacker_module_init(VALUE mMessagePack)
|
|
478
448
|
rb_define_method(cMessagePack_Unpacker, "read_map_header", Unpacker_read_map_header, 0);
|
479
449
|
//rb_define_method(cMessagePack_Unpacker, "peek_next_type", Unpacker_peek_next_type, 0); // TODO
|
480
450
|
rb_define_method(cMessagePack_Unpacker, "feed", Unpacker_feed, 1);
|
451
|
+
rb_define_method(cMessagePack_Unpacker, "feed_reference", Unpacker_feed_reference, 1);
|
481
452
|
rb_define_method(cMessagePack_Unpacker, "each", Unpacker_each, 0);
|
482
453
|
rb_define_method(cMessagePack_Unpacker, "feed_each", Unpacker_feed_each, 1);
|
483
454
|
rb_define_method(cMessagePack_Unpacker, "reset", Unpacker_reset, 0);
|
@@ -491,8 +462,6 @@ void MessagePack_Unpacker_module_init(VALUE mMessagePack)
|
|
491
462
|
/* prefer reference than copying */
|
492
463
|
//msgpack_buffer_set_write_reference_threshold(UNPACKER_BUFFER_(s_unpacker), 0);
|
493
464
|
|
494
|
-
|
495
|
-
rb_define_module_function(mMessagePack, "load", MessagePack_load_module_method, -1);
|
496
|
-
rb_define_module_function(mMessagePack, "unpack", MessagePack_unpack_module_method, -1);
|
465
|
+
rb_define_method(cMessagePack_Unpacker, "full_unpack", Unpacker_full_unpack, 0);
|
497
466
|
}
|
498
467
|
|
@@ -53,9 +53,9 @@ void msgpack_unpacker_ext_registry_dup(msgpack_unpacker_ext_registry_t* src,
|
|
53
53
|
}
|
54
54
|
|
55
55
|
VALUE msgpack_unpacker_ext_registry_put(msgpack_unpacker_ext_registry_t* ukrg,
|
56
|
-
VALUE
|
56
|
+
VALUE ext_module, int ext_type, VALUE proc, VALUE arg)
|
57
57
|
{
|
58
|
-
VALUE e = rb_ary_new3(3,
|
58
|
+
VALUE e = rb_ary_new3(3, ext_module, proc, arg);
|
59
59
|
VALUE before = ukrg->array[ext_type + 128];
|
60
60
|
ukrg->array[ext_type + 128] = e;
|
61
61
|
return before;
|
@@ -15,8 +15,8 @@
|
|
15
15
|
* See the License for the specific language governing permissions and
|
16
16
|
* limitations under the License.
|
17
17
|
*/
|
18
|
-
#ifndef
|
19
|
-
#define
|
18
|
+
#ifndef MSGPACK_RUBY_UNPACKER_EXT_REGISTRY_H__
|
19
|
+
#define MSGPACK_RUBY_UNPACKER_EXT_REGISTRY_H__
|
20
20
|
|
21
21
|
#include "compat.h"
|
22
22
|
#include "ruby.h"
|
@@ -44,7 +44,7 @@ void msgpack_unpacker_ext_registry_dup(msgpack_unpacker_ext_registry_t* src,
|
|
44
44
|
msgpack_unpacker_ext_registry_t* dst);
|
45
45
|
|
46
46
|
VALUE msgpack_unpacker_ext_registry_put(msgpack_unpacker_ext_registry_t* ukrg,
|
47
|
-
VALUE
|
47
|
+
VALUE ext_module, int ext_type, VALUE proc, VALUE arg);
|
48
48
|
|
49
49
|
static inline VALUE msgpack_unpacker_ext_registry_lookup(msgpack_unpacker_ext_registry_t* ukrg,
|
50
50
|
int ext_type)
|
data/lib/msgpack.rb
CHANGED
@@ -15,3 +15,39 @@ end
|
|
15
15
|
require "msgpack/packer"
|
16
16
|
require "msgpack/unpacker"
|
17
17
|
require "msgpack/factory"
|
18
|
+
require "msgpack/symbol"
|
19
|
+
require "msgpack/core_ext"
|
20
|
+
require "msgpack/timestamp"
|
21
|
+
require "msgpack/time"
|
22
|
+
|
23
|
+
module MessagePack
|
24
|
+
DefaultFactory = MessagePack::Factory.new
|
25
|
+
DEFAULT_EMPTY_PARAMS = {}.freeze
|
26
|
+
|
27
|
+
def load(src, param = nil)
|
28
|
+
unpacker = nil
|
29
|
+
|
30
|
+
if src.is_a? String
|
31
|
+
unpacker = DefaultFactory.unpacker param || DEFAULT_EMPTY_PARAMS
|
32
|
+
unpacker.feed_reference src
|
33
|
+
else
|
34
|
+
unpacker = DefaultFactory.unpacker src, param || DEFAULT_EMPTY_PARAMS
|
35
|
+
end
|
36
|
+
|
37
|
+
unpacker.full_unpack
|
38
|
+
end
|
39
|
+
alias :unpack :load
|
40
|
+
|
41
|
+
module_function :load
|
42
|
+
module_function :unpack
|
43
|
+
|
44
|
+
def pack(v, *rest)
|
45
|
+
packer = DefaultFactory.packer(*rest)
|
46
|
+
packer.write v
|
47
|
+
packer.full_pack
|
48
|
+
end
|
49
|
+
alias :dump :pack
|
50
|
+
|
51
|
+
module_function :pack
|
52
|
+
module_function :dump
|
53
|
+
end
|