msgpack 0.6.2-x86-mingw32 → 0.7.0dev1-x86-mingw32
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/.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
         
     |