msgpack 0.7.4 → 1.3.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 +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
|