msgpack 0.6.2-x86-mingw32 → 0.7.0dev1-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +33 -0
- data/README.rdoc +2 -6
- data/Rakefile +9 -0
- data/appveyor.yml +18 -0
- data/doclib/msgpack/error.rb +6 -1
- data/doclib/msgpack/extension_value.rb +9 -0
- data/doclib/msgpack/factory.rb +68 -0
- data/doclib/msgpack/packer.rb +38 -0
- data/doclib/msgpack/unpacker.rb +39 -2
- data/ext/java/org/msgpack/jruby/Buffer.java +4 -0
- data/ext/java/org/msgpack/jruby/Decoder.java +44 -0
- data/ext/java/org/msgpack/jruby/Encoder.java +46 -4
- data/ext/java/org/msgpack/jruby/ExtensionValue.java +55 -60
- data/ext/java/org/msgpack/jruby/MessagePackLibrary.java +18 -5
- data/ext/java/org/msgpack/jruby/Packer.java +17 -4
- data/ext/java/org/msgpack/jruby/Unpacker.java +59 -2
- data/ext/msgpack/buffer_class.c +2 -2
- data/ext/msgpack/buffer_class.h +1 -1
- data/ext/msgpack/compat.h +12 -0
- data/ext/msgpack/core_ext.c +15 -0
- data/ext/msgpack/extconf.rb +4 -1
- data/ext/msgpack/extension_value_class.c +34 -0
- data/ext/msgpack/extension_value_class.h +31 -0
- data/ext/msgpack/factory_class.c +213 -0
- data/ext/msgpack/factory_class.h +35 -0
- data/ext/msgpack/packer.c +14 -7
- data/ext/msgpack/packer.h +46 -8
- data/ext/msgpack/packer_class.c +92 -45
- data/ext/msgpack/packer_class.h +4 -2
- data/ext/msgpack/packer_ext_registry.c +87 -0
- data/ext/msgpack/packer_ext_registry.h +101 -0
- data/ext/msgpack/rbinit.c +4 -0
- data/ext/msgpack/unpacker.c +128 -23
- data/ext/msgpack/unpacker.h +11 -0
- data/ext/msgpack/unpacker_class.c +117 -38
- data/ext/msgpack/unpacker_class.h +4 -2
- data/ext/msgpack/unpacker_ext_registry.c +68 -0
- data/ext/msgpack/unpacker_ext_registry.h +62 -0
- data/lib/msgpack.rb +4 -0
- data/lib/msgpack/factory.rb +60 -0
- data/lib/msgpack/packer.rb +28 -0
- data/lib/msgpack/unpacker.rb +28 -0
- data/lib/msgpack/version.rb +1 -1
- data/msgpack.gemspec +4 -3
- data/spec/cruby/buffer_io_spec.rb +2 -3
- data/spec/cruby/buffer_spec.rb +1 -3
- data/spec/cruby/unpacker_spec.rb +14 -2
- data/spec/ext_value_spec.rb +99 -0
- data/spec/exttypes.rb +51 -0
- data/spec/factory_spec.rb +236 -0
- data/spec/jruby/msgpack/unpacker_spec.rb +25 -0
- data/spec/{jruby/msgpack_spec.rb → msgpack_spec.rb} +1 -1
- data/spec/pack_spec.rb +0 -6
- data/spec/packer_spec.rb +95 -0
- data/spec/spec_helper.rb +12 -1
- data/spec/unpack_spec.rb +1 -4
- data/spec/unpacker_spec.rb +133 -0
- metadata +50 -15
- data/Dockerfile +0 -55
data/ext/msgpack/unpacker.h
CHANGED
@@ -19,6 +19,7 @@
|
|
19
19
|
#define MSGPACK_RUBY_UNPACKER_H__
|
20
20
|
|
21
21
|
#include "buffer.h"
|
22
|
+
#include "unpacker_ext_registry.h"
|
22
23
|
|
23
24
|
#ifndef MSGPACK_UNPACKER_STACK_CAPACITY
|
24
25
|
#define MSGPACK_UNPACKER_STACK_CAPACITY 128
|
@@ -55,11 +56,15 @@ struct msgpack_unpacker_t {
|
|
55
56
|
|
56
57
|
VALUE reading_raw;
|
57
58
|
size_t reading_raw_remaining;
|
59
|
+
int reading_raw_type;
|
58
60
|
|
59
61
|
VALUE buffer_ref;
|
60
62
|
|
63
|
+
msgpack_unpacker_ext_registry_t ext_registry;
|
64
|
+
|
61
65
|
/* options */
|
62
66
|
bool symbolize_keys;
|
67
|
+
bool allow_unknown_ext;
|
63
68
|
};
|
64
69
|
|
65
70
|
#define UNPACKER_BUFFER_(uk) (&(uk)->buffer)
|
@@ -91,6 +96,11 @@ static inline void msgpack_unpacker_set_symbolized_keys(msgpack_unpacker_t* uk,
|
|
91
96
|
uk->symbolize_keys = enable;
|
92
97
|
}
|
93
98
|
|
99
|
+
static inline void msgpack_unpacker_set_allow_unknown_ext(msgpack_unpacker_t* uk, bool enable)
|
100
|
+
{
|
101
|
+
uk->allow_unknown_ext = enable;
|
102
|
+
}
|
103
|
+
|
94
104
|
|
95
105
|
/* error codes */
|
96
106
|
#define PRIMITIVE_CONTAINER_START 1
|
@@ -99,6 +109,7 @@ static inline void msgpack_unpacker_set_symbolized_keys(msgpack_unpacker_t* uk,
|
|
99
109
|
#define PRIMITIVE_INVALID_BYTE -2
|
100
110
|
#define PRIMITIVE_STACK_TOO_DEEP -3
|
101
111
|
#define PRIMITIVE_UNEXPECTED_TYPE -4
|
112
|
+
#define PRIMITIVE_UNEXPECTED_EXT_TYPE -5
|
102
113
|
|
103
114
|
int msgpack_unpacker_read(msgpack_unpacker_t* uk, size_t target_stack_depth);
|
104
115
|
|
@@ -19,6 +19,7 @@
|
|
19
19
|
#include "unpacker.h"
|
20
20
|
#include "unpacker_class.h"
|
21
21
|
#include "buffer_class.h"
|
22
|
+
#include "factory_class.h"
|
22
23
|
|
23
24
|
VALUE cMessagePack_Unpacker;
|
24
25
|
|
@@ -28,7 +29,9 @@ VALUE cMessagePack_Unpacker;
|
|
28
29
|
static VALUE eUnpackError;
|
29
30
|
static VALUE eMalformedFormatError;
|
30
31
|
static VALUE eStackError;
|
31
|
-
static VALUE
|
32
|
+
static VALUE eUnexpectedTypeError;
|
33
|
+
static VALUE eUnknownExtTypeError;
|
34
|
+
static VALUE mTypeError; // obsoleted. only for backward compatibility. See #86.
|
32
35
|
|
33
36
|
#define UNPACKER(from, name) \
|
34
37
|
msgpack_unpacker_t *name = NULL; \
|
@@ -42,23 +45,31 @@ static void Unpacker_free(msgpack_unpacker_t* uk)
|
|
42
45
|
if(uk == NULL) {
|
43
46
|
return;
|
44
47
|
}
|
48
|
+
msgpack_unpacker_ext_registry_destroy(&uk->ext_registry);
|
45
49
|
_msgpack_unpacker_destroy(uk);
|
46
50
|
free(uk);
|
47
51
|
}
|
48
52
|
|
49
|
-
static
|
53
|
+
static void Unpacker_mark(msgpack_unpacker_t* uk)
|
54
|
+
{
|
55
|
+
msgpack_unpacker_mark(uk);
|
56
|
+
msgpack_unpacker_ext_registry_mark(&uk->ext_registry);
|
57
|
+
}
|
58
|
+
|
59
|
+
VALUE MessagePack_Unpacker_alloc(VALUE klass)
|
50
60
|
{
|
51
61
|
msgpack_unpacker_t* uk = ALLOC_N(msgpack_unpacker_t, 1);
|
52
62
|
_msgpack_unpacker_init(uk);
|
53
63
|
|
54
|
-
VALUE self = Data_Wrap_Struct(klass,
|
64
|
+
VALUE self = Data_Wrap_Struct(klass, Unpacker_mark, Unpacker_free, uk);
|
55
65
|
|
66
|
+
msgpack_unpacker_ext_registry_init(&uk->ext_registry);
|
56
67
|
uk->buffer_ref = MessagePack_Buffer_wrap(UNPACKER_BUFFER_(uk), self);
|
57
68
|
|
58
69
|
return self;
|
59
70
|
}
|
60
71
|
|
61
|
-
|
72
|
+
VALUE MessagePack_Unpacker_initialize(int argc, VALUE* argv, VALUE self)
|
62
73
|
{
|
63
74
|
VALUE io = Qnil;
|
64
75
|
VALUE options = Qnil;
|
@@ -90,21 +101,19 @@ static VALUE Unpacker_initialize(int argc, VALUE* argv, VALUE self)
|
|
90
101
|
|
91
102
|
UNPACKER(self, uk);
|
92
103
|
|
93
|
-
|
94
|
-
|
95
|
-
return self;
|
96
|
-
}
|
97
|
-
|
98
|
-
void MessagePack_Unpacker_initialize(msgpack_unpacker_t* uk, VALUE io, VALUE options)
|
99
|
-
{
|
100
|
-
MessagePack_Buffer_initialize(UNPACKER_BUFFER_(uk), io, options);
|
104
|
+
MessagePack_Buffer_set_options(UNPACKER_BUFFER_(uk), io, options);
|
101
105
|
|
102
106
|
if(options != Qnil) {
|
103
107
|
VALUE v;
|
104
108
|
|
105
109
|
v = rb_hash_aref(options, ID2SYM(rb_intern("symbolize_keys")));
|
106
110
|
msgpack_unpacker_set_symbolized_keys(uk, RTEST(v));
|
111
|
+
|
112
|
+
v = rb_hash_aref(options, ID2SYM(rb_intern("allow_unknown_ext")));
|
113
|
+
msgpack_unpacker_set_allow_unknown_ext(uk, RTEST(v));
|
107
114
|
}
|
115
|
+
|
116
|
+
return self;
|
108
117
|
}
|
109
118
|
|
110
119
|
static void raise_unpacker_error(int r)
|
@@ -117,7 +126,9 @@ static void raise_unpacker_error(int r)
|
|
117
126
|
case PRIMITIVE_STACK_TOO_DEEP:
|
118
127
|
rb_raise(eStackError, "stack level too deep");
|
119
128
|
case PRIMITIVE_UNEXPECTED_TYPE:
|
120
|
-
rb_raise(
|
129
|
+
rb_raise(eUnexpectedTypeError, "unexpected type");
|
130
|
+
case PRIMITIVE_UNEXPECTED_EXT_TYPE:
|
131
|
+
rb_raise(eUnknownExtTypeError, "unexpected extension type");
|
121
132
|
default:
|
122
133
|
rb_raise(eUnpackError, "logically unknown error %d", r);
|
123
134
|
}
|
@@ -283,6 +294,13 @@ static VALUE Unpacker_each(VALUE self)
|
|
283
294
|
|
284
295
|
static VALUE Unpacker_feed_each(VALUE self, VALUE data)
|
285
296
|
{
|
297
|
+
#ifdef RETURN_ENUMERATOR
|
298
|
+
{
|
299
|
+
VALUE argv[] = { data };
|
300
|
+
RETURN_ENUMERATOR(self, sizeof(argv) / sizeof(VALUE), argv);
|
301
|
+
}
|
302
|
+
#endif
|
303
|
+
|
286
304
|
// TODO optimize
|
287
305
|
Unpacker_feed(self, data);
|
288
306
|
return Unpacker_each(self);
|
@@ -297,39 +315,83 @@ static VALUE Unpacker_reset(VALUE self)
|
|
297
315
|
return Qnil;
|
298
316
|
}
|
299
317
|
|
300
|
-
VALUE
|
318
|
+
static VALUE Unpacker_registered_types_internal(VALUE self)
|
301
319
|
{
|
302
|
-
|
303
|
-
VALUE options = Qnil;
|
320
|
+
UNPACKER(self, uk);
|
304
321
|
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
rb_raise(rb_eArgError, "expected Hash but found %s.", rb_obj_classname(options));
|
322
|
+
VALUE mapping = rb_hash_new();
|
323
|
+
for(int i=0; i < 256; i++) {
|
324
|
+
if(uk->ext_registry.array[i] != Qnil) {
|
325
|
+
rb_hash_aset(mapping, INT2FIX(i - 128), uk->ext_registry.array[i]);
|
310
326
|
}
|
311
|
-
|
327
|
+
}
|
328
|
+
|
329
|
+
return mapping;
|
330
|
+
}
|
331
|
+
|
332
|
+
static VALUE Unpacker_register_type(int argc, VALUE* argv, VALUE self)
|
333
|
+
{
|
334
|
+
UNPACKER(self, uk);
|
335
|
+
|
336
|
+
int ext_type;
|
337
|
+
VALUE proc;
|
338
|
+
VALUE arg;
|
339
|
+
VALUE ext_class;
|
340
|
+
|
341
|
+
switch (argc) {
|
312
342
|
case 1:
|
313
|
-
|
343
|
+
/* register_type(0x7f) {|data| block... } */
|
344
|
+
rb_need_block();
|
345
|
+
#ifdef HAVE_RB_BLOCK_LAMBDA
|
346
|
+
proc = rb_block_lambda();
|
347
|
+
#else
|
348
|
+
/* MRI 1.8 */
|
349
|
+
proc = rb_block_proc();
|
350
|
+
#endif
|
351
|
+
arg = proc;
|
352
|
+
ext_class = Qnil;
|
353
|
+
break;
|
354
|
+
case 3:
|
355
|
+
/* register_type(0x7f, Time, :from_msgpack_ext) */
|
356
|
+
ext_class = argv[1];
|
357
|
+
arg = argv[2];
|
358
|
+
proc = rb_obj_method(ext_class, arg);
|
314
359
|
break;
|
315
360
|
default:
|
316
|
-
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1
|
361
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 3)", argc);
|
317
362
|
}
|
318
363
|
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
364
|
+
ext_type = rb_num2int(argv[0]);
|
365
|
+
if(ext_type < -128 || ext_type > 127) {
|
366
|
+
rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type);
|
367
|
+
}
|
323
368
|
|
324
|
-
|
325
|
-
|
369
|
+
msgpack_unpacker_ext_registry_put(&uk->ext_registry, ext_class, ext_type, proc, arg);
|
370
|
+
|
371
|
+
return Qnil;
|
372
|
+
}
|
373
|
+
|
374
|
+
VALUE MessagePack_unpack(int argc, VALUE* argv)
|
375
|
+
{
|
376
|
+
VALUE src;
|
377
|
+
VALUE self;
|
378
|
+
|
379
|
+
if (argc < 0 || argc > 2) {
|
380
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..2)", argc);
|
381
|
+
}
|
382
|
+
src = argv[0];
|
326
383
|
|
327
384
|
if(rb_type(src) == T_STRING) {
|
328
|
-
|
385
|
+
self = MessagePack_Factory_unpacker(argc - 1, argv + 1, cMessagePack_DefaultFactory);
|
386
|
+
UNPACKER(self, uk);
|
329
387
|
msgpack_buffer_append_string(UNPACKER_BUFFER_(uk), src);
|
330
388
|
} else {
|
331
|
-
|
389
|
+
self = MessagePack_Factory_unpacker(argc, argv, cMessagePack_DefaultFactory);
|
332
390
|
}
|
391
|
+
UNPACKER(self, uk);
|
392
|
+
|
393
|
+
/* prefer reference than copying; see MessagePack_Unpacker_module_init */
|
394
|
+
msgpack_buffer_set_write_reference_threshold(UNPACKER_BUFFER_(uk), 0);
|
333
395
|
|
334
396
|
int r = msgpack_unpacker_read(uk, 0);
|
335
397
|
if(r < 0) {
|
@@ -337,8 +399,9 @@ VALUE MessagePack_unpack(int argc, VALUE* argv)
|
|
337
399
|
}
|
338
400
|
|
339
401
|
/* raise if extra bytes follow */
|
340
|
-
|
341
|
-
|
402
|
+
size_t extra = msgpack_buffer_top_readable_size(UNPACKER_BUFFER_(uk));
|
403
|
+
if(extra > 0) {
|
404
|
+
rb_raise(eMalformedFormatError, "%zd extra bytes after the deserialized object", extra);
|
342
405
|
}
|
343
406
|
|
344
407
|
#ifdef RB_GC_GUARD
|
@@ -362,9 +425,19 @@ static VALUE MessagePack_unpack_module_method(int argc, VALUE* argv, VALUE mod)
|
|
362
425
|
return MessagePack_unpack(argc, argv);
|
363
426
|
}
|
364
427
|
|
428
|
+
VALUE MessagePack_Unpacker_new(int argc, VALUE* argv)
|
429
|
+
{
|
430
|
+
VALUE self = MessagePack_Unpacker_alloc(cMessagePack_Unpacker);
|
431
|
+
MessagePack_Unpacker_initialize(argc, argv, self);
|
432
|
+
return self;
|
433
|
+
}
|
434
|
+
|
365
435
|
void MessagePack_Unpacker_module_init(VALUE mMessagePack)
|
366
436
|
{
|
367
437
|
msgpack_unpacker_static_init();
|
438
|
+
msgpack_unpacker_ext_registry_static_init();
|
439
|
+
|
440
|
+
mTypeError = rb_define_module_under(mMessagePack, "TypeError");
|
368
441
|
|
369
442
|
cMessagePack_Unpacker = rb_define_class_under(mMessagePack, "Unpacker", rb_cObject);
|
370
443
|
|
@@ -374,11 +447,14 @@ void MessagePack_Unpacker_module_init(VALUE mMessagePack)
|
|
374
447
|
|
375
448
|
eStackError = rb_define_class_under(mMessagePack, "StackError", eUnpackError);
|
376
449
|
|
377
|
-
|
450
|
+
eUnexpectedTypeError = rb_define_class_under(mMessagePack, "UnexpectedTypeError", eUnpackError);
|
451
|
+
rb_include_module(eUnexpectedTypeError, mTypeError);
|
452
|
+
|
453
|
+
eUnknownExtTypeError = rb_define_class_under(mMessagePack, "UnknownExtTypeError", eUnpackError);
|
378
454
|
|
379
|
-
rb_define_alloc_func(cMessagePack_Unpacker,
|
455
|
+
rb_define_alloc_func(cMessagePack_Unpacker, MessagePack_Unpacker_alloc);
|
380
456
|
|
381
|
-
rb_define_method(cMessagePack_Unpacker, "initialize",
|
457
|
+
rb_define_method(cMessagePack_Unpacker, "initialize", MessagePack_Unpacker_initialize, -1);
|
382
458
|
rb_define_method(cMessagePack_Unpacker, "buffer", Unpacker_buffer, 0);
|
383
459
|
rb_define_method(cMessagePack_Unpacker, "read", Unpacker_read, 0);
|
384
460
|
rb_define_alias(cMessagePack_Unpacker, "unpack", "read");
|
@@ -392,7 +468,10 @@ void MessagePack_Unpacker_module_init(VALUE mMessagePack)
|
|
392
468
|
rb_define_method(cMessagePack_Unpacker, "feed_each", Unpacker_feed_each, 1);
|
393
469
|
rb_define_method(cMessagePack_Unpacker, "reset", Unpacker_reset, 0);
|
394
470
|
|
395
|
-
|
471
|
+
rb_define_private_method(cMessagePack_Unpacker, "registered_types_internal", Unpacker_registered_types_internal, 0);
|
472
|
+
rb_define_method(cMessagePack_Unpacker, "register_type", Unpacker_register_type, -1);
|
473
|
+
|
474
|
+
//s_unpacker_value = MessagePack_Unpacker_alloc(cMessagePack_Unpacker);
|
396
475
|
//rb_gc_register_address(&s_unpacker_value);
|
397
476
|
//Data_Get_Struct(s_unpacker_value, msgpack_unpacker_t, s_unpacker);
|
398
477
|
/* prefer reference than copying */
|
@@ -24,9 +24,11 @@ extern VALUE cMessagePack_Unpacker;
|
|
24
24
|
|
25
25
|
void MessagePack_Unpacker_module_init(VALUE mMessagePack);
|
26
26
|
|
27
|
-
VALUE
|
27
|
+
VALUE MessagePack_Unpacker_alloc(VALUE klass);
|
28
|
+
|
29
|
+
VALUE MessagePack_Unpacker_initialize(int argc, VALUE* argv, VALUE self);
|
28
30
|
|
29
|
-
|
31
|
+
VALUE MessagePack_unpack(int argc, VALUE* argv);
|
30
32
|
|
31
33
|
#endif
|
32
34
|
|
@@ -0,0 +1,68 @@
|
|
1
|
+
/*
|
2
|
+
* MessagePack for Ruby
|
3
|
+
*
|
4
|
+
* Copyright (C) 2008-2015 Sadayuki Furuhashi
|
5
|
+
*
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
* you may not use this file except in compliance with the License.
|
8
|
+
* You may obtain a copy of the License at
|
9
|
+
*
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
*
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
* See the License for the specific language governing permissions and
|
16
|
+
* limitations under the License.
|
17
|
+
*/
|
18
|
+
|
19
|
+
#include "unpacker_ext_registry.h"
|
20
|
+
|
21
|
+
static ID s_call;
|
22
|
+
static ID s_dup;
|
23
|
+
|
24
|
+
void msgpack_unpacker_ext_registry_static_init()
|
25
|
+
{
|
26
|
+
s_call = rb_intern("call");
|
27
|
+
s_dup = rb_intern("dup");
|
28
|
+
}
|
29
|
+
|
30
|
+
void msgpack_unpacker_ext_registry_static_destroy()
|
31
|
+
{ }
|
32
|
+
|
33
|
+
void msgpack_unpacker_ext_registry_init(msgpack_unpacker_ext_registry_t* ukrg)
|
34
|
+
{
|
35
|
+
for(int i=0; i < 256; i++) {
|
36
|
+
ukrg->array[i] = Qnil;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
void msgpack_unpacker_ext_registry_mark(msgpack_unpacker_ext_registry_t* ukrg)
|
41
|
+
{
|
42
|
+
for(int i=0; i < 256; i++) {
|
43
|
+
rb_gc_mark(ukrg->array[i]);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
void msgpack_unpacker_ext_registry_dup(msgpack_unpacker_ext_registry_t* src,
|
48
|
+
msgpack_unpacker_ext_registry_t* dst)
|
49
|
+
{
|
50
|
+
for(int i=0; i < 256; i++) {
|
51
|
+
dst->array[i] = src->array[i];
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
VALUE msgpack_unpacker_ext_registry_put(msgpack_unpacker_ext_registry_t* ukrg,
|
56
|
+
VALUE ext_class, int ext_type, VALUE proc, VALUE arg)
|
57
|
+
{
|
58
|
+
VALUE e = rb_ary_new3(3, ext_class, proc, arg);
|
59
|
+
VALUE before = ukrg->array[ext_type + 128];
|
60
|
+
ukrg->array[ext_type + 128] = e;
|
61
|
+
return before;
|
62
|
+
}
|
63
|
+
|
64
|
+
VALUE msgpack_unpacker_ext_registry_call(msgpack_unpacker_ext_registry_t* ukrg,
|
65
|
+
VALUE proc, VALUE ext_data)
|
66
|
+
{
|
67
|
+
return rb_funcall(proc, s_call, 1, ext_data);
|
68
|
+
}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
/*
|
2
|
+
* MessagePack for Ruby
|
3
|
+
*
|
4
|
+
* Copyright (C) 2008-2015 Sadayuki Furuhashi
|
5
|
+
*
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
* you may not use this file except in compliance with the License.
|
8
|
+
* You may obtain a copy of the License at
|
9
|
+
*
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
*
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
* See the License for the specific language governing permissions and
|
16
|
+
* limitations under the License.
|
17
|
+
*/
|
18
|
+
#ifndef MSGPACK_RUBY_PACKER_PACKER_EXT_REGISTRY_H__
|
19
|
+
#define MSGPACK_RUBY_PACKER_PACKER_EXT_REGISTRY_H__
|
20
|
+
|
21
|
+
#include "compat.h"
|
22
|
+
#include "ruby.h"
|
23
|
+
|
24
|
+
struct msgpack_unpacker_ext_registry_t;
|
25
|
+
typedef struct msgpack_unpacker_ext_registry_t msgpack_unpacker_ext_registry_t;
|
26
|
+
|
27
|
+
struct msgpack_unpacker_ext_registry_t {
|
28
|
+
VALUE array[256];
|
29
|
+
//int bitmap;
|
30
|
+
};
|
31
|
+
|
32
|
+
void msgpack_unpacker_ext_registry_static_init();
|
33
|
+
|
34
|
+
void msgpack_unpacker_ext_registry_static_destroy();
|
35
|
+
|
36
|
+
void msgpack_unpacker_ext_registry_init(msgpack_unpacker_ext_registry_t* ukrg);
|
37
|
+
|
38
|
+
static inline void msgpack_unpacker_ext_registry_destroy(msgpack_unpacker_ext_registry_t* ukrg)
|
39
|
+
{ }
|
40
|
+
|
41
|
+
void msgpack_unpacker_ext_registry_mark(msgpack_unpacker_ext_registry_t* ukrg);
|
42
|
+
|
43
|
+
void msgpack_unpacker_ext_registry_dup(msgpack_unpacker_ext_registry_t* src,
|
44
|
+
msgpack_unpacker_ext_registry_t* dst);
|
45
|
+
|
46
|
+
VALUE msgpack_unpacker_ext_registry_put(msgpack_unpacker_ext_registry_t* ukrg,
|
47
|
+
VALUE ext_class, int ext_type, VALUE proc, VALUE arg);
|
48
|
+
|
49
|
+
static inline VALUE msgpack_unpacker_ext_registry_lookup(msgpack_unpacker_ext_registry_t* ukrg,
|
50
|
+
int ext_type)
|
51
|
+
{
|
52
|
+
VALUE e = ukrg->array[ext_type + 128];
|
53
|
+
if(e == Qnil) {
|
54
|
+
return Qnil;
|
55
|
+
}
|
56
|
+
return rb_ary_entry(e, 1);
|
57
|
+
}
|
58
|
+
|
59
|
+
VALUE msgpack_unpacker_ext_registry_call(msgpack_unpacker_ext_registry_t* ukrg,
|
60
|
+
VALUE proc, VALUE ext_data);
|
61
|
+
|
62
|
+
#endif
|