msgpack 1.6.0 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/ChangeLog +25 -0
 - data/README.md +27 -0
 - data/ext/java/org/msgpack/jruby/Buffer.java +3 -3
 - data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +11 -20
 - data/ext/java/org/msgpack/jruby/ExtensionValue.java +1 -1
 - data/ext/java/org/msgpack/jruby/Factory.java +11 -50
 - data/ext/java/org/msgpack/jruby/Packer.java +9 -24
 - data/ext/java/org/msgpack/jruby/Unpacker.java +15 -32
 - data/ext/msgpack/buffer.c +16 -17
 - data/ext/msgpack/buffer.h +2 -8
 - data/ext/msgpack/buffer_class.c +76 -5
 - data/ext/msgpack/buffer_class.h +1 -0
 - data/ext/msgpack/extconf.rb +18 -26
 - data/ext/msgpack/factory_class.c +27 -61
 - data/ext/msgpack/packer.c +13 -14
 - data/ext/msgpack/packer.h +0 -4
 - data/ext/msgpack/packer_class.c +19 -54
 - data/ext/msgpack/packer_ext_registry.c +31 -28
 - data/ext/msgpack/packer_ext_registry.h +10 -14
 - data/ext/msgpack/rbinit.c +1 -1
 - data/ext/msgpack/rmem.c +3 -4
 - data/ext/msgpack/unpacker.c +12 -25
 - data/ext/msgpack/unpacker.h +0 -4
 - data/ext/msgpack/unpacker_class.c +14 -49
 - data/ext/msgpack/unpacker_ext_registry.c +4 -16
 - data/ext/msgpack/unpacker_ext_registry.h +3 -7
 - data/lib/msgpack/buffer.rb +9 -0
 - data/lib/msgpack/factory.rb +90 -63
 - data/lib/msgpack/packer.rb +10 -1
 - data/lib/msgpack/unpacker.rb +14 -1
 - data/lib/msgpack/version.rb +1 -1
 - data/lib/msgpack.rb +1 -0
 - data/msgpack.gemspec +6 -3
 - metadata +19 -48
 - data/.github/workflows/ci.yaml +0 -57
 - data/.gitignore +0 -23
 - data/.rubocop.yml +0 -36
 - data/Gemfile +0 -9
 - data/Rakefile +0 -70
 - data/appveyor.yml +0 -18
 - data/bench/bench.rb +0 -78
 - data/bin/console +0 -8
 - data/doclib/msgpack/buffer.rb +0 -193
 - data/doclib/msgpack/core_ext.rb +0 -101
 - data/doclib/msgpack/error.rb +0 -19
 - data/doclib/msgpack/extension_value.rb +0 -9
 - data/doclib/msgpack/factory.rb +0 -145
 - data/doclib/msgpack/packer.rb +0 -209
 - data/doclib/msgpack/time.rb +0 -22
 - data/doclib/msgpack/timestamp.rb +0 -44
 - data/doclib/msgpack/unpacker.rb +0 -183
 - data/doclib/msgpack.rb +0 -87
 - data/msgpack.org.md +0 -46
 - data/spec/bigint_spec.rb +0 -26
 - data/spec/cases.json +0 -1
 - data/spec/cases.msg +0 -0
 - data/spec/cases_compact.msg +0 -0
 - data/spec/cases_spec.rb +0 -39
 - data/spec/cruby/buffer_io_spec.rb +0 -255
 - data/spec/cruby/buffer_packer.rb +0 -29
 - data/spec/cruby/buffer_spec.rb +0 -592
 - data/spec/cruby/buffer_unpacker.rb +0 -19
 - data/spec/cruby/unpacker_spec.rb +0 -70
 - data/spec/ext_value_spec.rb +0 -99
 - data/spec/exttypes.rb +0 -51
 - data/spec/factory_spec.rb +0 -706
 - data/spec/format_spec.rb +0 -301
 - data/spec/jruby/benchmarks/shootout_bm.rb +0 -73
 - data/spec/jruby/benchmarks/symbolize_keys_bm.rb +0 -25
 - data/spec/jruby/unpacker_spec.rb +0 -186
 - data/spec/msgpack_spec.rb +0 -214
 - data/spec/pack_spec.rb +0 -61
 - data/spec/packer_spec.rb +0 -575
 - data/spec/random_compat.rb +0 -24
 - data/spec/spec_helper.rb +0 -72
 - data/spec/timestamp_spec.rb +0 -159
 - data/spec/unpack_spec.rb +0 -57
 - data/spec/unpacker_spec.rb +0 -869
 
    
        data/ext/msgpack/extconf.rb
    CHANGED
    
    | 
         @@ -1,17 +1,23 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'mkmf'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            have_header("ruby/st.h")
         
     | 
| 
       4 
     | 
    
         
            -
            have_header("st.h")
         
     | 
| 
       5 
3 
     | 
    
         
             
            have_func("rb_enc_interned_str", "ruby.h") # Ruby 3.0+
         
     | 
| 
       6 
4 
     | 
    
         
             
            have_func("rb_hash_new_capa", "ruby.h") # Ruby 3.2+
         
     | 
| 
      
 5 
     | 
    
         
            +
            have_func("rb_proc_call_with_block", "ruby.h") # CRuby (TruffleRuby doesn't have it)
         
     | 
| 
       7 
6 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
               
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
      
 7 
     | 
    
         
            +
            append_cflags([
         
     | 
| 
      
 8 
     | 
    
         
            +
              "-fvisibility=hidden",
         
     | 
| 
      
 9 
     | 
    
         
            +
              "-I..",
         
     | 
| 
      
 10 
     | 
    
         
            +
              "-Wall",
         
     | 
| 
      
 11 
     | 
    
         
            +
              "-O3",
         
     | 
| 
      
 12 
     | 
    
         
            +
              "-std=gnu99"
         
     | 
| 
      
 13 
     | 
    
         
            +
            ])
         
     | 
| 
      
 14 
     | 
    
         
            +
            append_cflags(RbConfig::CONFIG["debugflags"]) if RbConfig::CONFIG["debugflags"]
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            append_cflags("-DRUBY_DEBUG=1") if ENV["MSGPACK_DEBUG"]
         
     | 
| 
       11 
17 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
            if RUBY_VERSION.start_with?('3.0.')
         
     | 
| 
      
 18 
     | 
    
         
            +
            if RUBY_VERSION.start_with?('3.0.') && RUBY_VERSION <= '3.0.5'
         
     | 
| 
       13 
19 
     | 
    
         
             
              # https://bugs.ruby-lang.org/issues/18772
         
     | 
| 
       14 
     | 
    
         
            -
               
     | 
| 
      
 20 
     | 
    
         
            +
              append_cflags("-DRB_ENC_INTERNED_STR_NULL_CHECK=1")
         
     | 
| 
       15 
21 
     | 
    
         
             
            end
         
     | 
| 
       16 
22 
     | 
    
         | 
| 
       17 
23 
     | 
    
         
             
            # checking if Hash#[]= (rb_hash_aset) dedupes string keys (Ruby 2.6+)
         
     | 
| 
         @@ -21,35 +27,21 @@ r = rand.to_s 
     | 
|
| 
       21 
27 
     | 
    
         
             
            h[%W(#{r}).join('')] = :foo
         
     | 
| 
       22 
28 
     | 
    
         
             
            x[%W(#{r}).join('')] = :foo
         
     | 
| 
       23 
29 
     | 
    
         
             
            if x.keys[0].equal?(h.keys[0])
         
     | 
| 
       24 
     | 
    
         
            -
               
     | 
| 
      
 30 
     | 
    
         
            +
              append_cflags("-DHASH_ASET_DEDUPE=1")
         
     | 
| 
       25 
31 
     | 
    
         
             
            else
         
     | 
| 
       26 
     | 
    
         
            -
               
     | 
| 
       27 
     | 
    
         
            -
            end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
            # checking if String#-@ (str_uminus) dedupes... ' (Ruby 2.5+)
         
     | 
| 
       31 
     | 
    
         
            -
            begin
         
     | 
| 
       32 
     | 
    
         
            -
              a = -(%w(t e s t).join)
         
     | 
| 
       33 
     | 
    
         
            -
              b = -(%w(t e s t).join)
         
     | 
| 
       34 
     | 
    
         
            -
              if a.equal?(b)
         
     | 
| 
       35 
     | 
    
         
            -
                $CFLAGS << ' -DSTR_UMINUS_DEDUPE=1 '
         
     | 
| 
       36 
     | 
    
         
            -
              else
         
     | 
| 
       37 
     | 
    
         
            -
                $CFLAGS += ' -DSTR_UMINUS_DEDUPE=0 '
         
     | 
| 
       38 
     | 
    
         
            -
              end
         
     | 
| 
       39 
     | 
    
         
            -
            rescue NoMethodError
         
     | 
| 
       40 
     | 
    
         
            -
              $CFLAGS << ' -DSTR_UMINUS_DEDUPE=0 '
         
     | 
| 
      
 32 
     | 
    
         
            +
              append_cflags("-DHASH_ASET_DEDUPE=0")
         
     | 
| 
       41 
33 
     | 
    
         
             
            end
         
     | 
| 
       42 
34 
     | 
    
         | 
| 
       43 
35 
     | 
    
         
             
            # checking if String#-@ (str_uminus) directly interns frozen strings... ' (Ruby 3.0+)
         
     | 
| 
       44 
36 
     | 
    
         
             
            begin
         
     | 
| 
       45 
37 
     | 
    
         
             
              s = rand.to_s.freeze
         
     | 
| 
       46 
38 
     | 
    
         
             
              if (-s).equal?(s) && (-s.dup).equal?(s)
         
     | 
| 
       47 
     | 
    
         
            -
                 
     | 
| 
      
 39 
     | 
    
         
            +
                append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=1")
         
     | 
| 
       48 
40 
     | 
    
         
             
              else
         
     | 
| 
       49 
     | 
    
         
            -
                 
     | 
| 
      
 41 
     | 
    
         
            +
                append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=0")
         
     | 
| 
       50 
42 
     | 
    
         
             
              end
         
     | 
| 
       51 
43 
     | 
    
         
             
            rescue NoMethodError
         
     | 
| 
       52 
     | 
    
         
            -
               
     | 
| 
      
 44 
     | 
    
         
            +
              append_cflags("-DSTR_UMINUS_DEDUPE_FROZEN=0")
         
     | 
| 
       53 
45 
     | 
    
         
             
            end
         
     | 
| 
       54 
46 
     | 
    
         | 
| 
       55 
47 
     | 
    
         
             
            if warnflags = CONFIG['warnflags']
         
     | 
    
        data/ext/msgpack/factory_class.c
    CHANGED
    
    | 
         @@ -75,7 +75,7 @@ static const rb_data_type_t factory_data_type = { 
     | 
|
| 
       75 
75 
     | 
    
         
             
                    .dfree = Factory_free,
         
     | 
| 
       76 
76 
     | 
    
         
             
                    .dsize = Factory_memsize,
         
     | 
| 
       77 
77 
     | 
    
         
             
                },
         
     | 
| 
       78 
     | 
    
         
            -
                .flags = RUBY_TYPED_FREE_IMMEDIATELY
         
     | 
| 
      
 78 
     | 
    
         
            +
                .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
         
     | 
| 
       79 
79 
     | 
    
         
             
            };
         
     | 
| 
       80 
80 
     | 
    
         | 
| 
       81 
81 
     | 
    
         
             
            static inline msgpack_factory_t *Factory_get(VALUE object)
         
     | 
| 
         @@ -98,7 +98,7 @@ static VALUE Factory_initialize(int argc, VALUE* argv, VALUE self) 
     | 
|
| 
       98 
98 
     | 
    
         
             
            {
         
     | 
| 
       99 
99 
     | 
    
         
             
                msgpack_factory_t *fc = Factory_get(self);
         
     | 
| 
       100 
100 
     | 
    
         | 
| 
       101 
     | 
    
         
            -
                msgpack_packer_ext_registry_init(&fc->pkrg);
         
     | 
| 
      
 101 
     | 
    
         
            +
                msgpack_packer_ext_registry_init(self, &fc->pkrg);
         
     | 
| 
       102 
102 
     | 
    
         
             
                // fc->ukrg is lazily initialized
         
     | 
| 
       103 
103 
     | 
    
         | 
| 
       104 
104 
     | 
    
         
             
                fc->has_symbol_ext_type = false;
         
     | 
| 
         @@ -124,7 +124,7 @@ static VALUE Factory_dup(VALUE self) 
     | 
|
| 
       124 
124 
     | 
    
         
             
                cloned_fc->has_symbol_ext_type = fc->has_symbol_ext_type;
         
     | 
| 
       125 
125 
     | 
    
         
             
                cloned_fc->pkrg = fc->pkrg;
         
     | 
| 
       126 
126 
     | 
    
         
             
                msgpack_unpacker_ext_registry_borrow(fc->ukrg, &cloned_fc->ukrg);
         
     | 
| 
       127 
     | 
    
         
            -
                msgpack_packer_ext_registry_dup(&fc->pkrg, &cloned_fc->pkrg);
         
     | 
| 
      
 127 
     | 
    
         
            +
                msgpack_packer_ext_registry_dup(clone, &fc->pkrg, &cloned_fc->pkrg);
         
     | 
| 
       128 
128 
     | 
    
         | 
| 
       129 
129 
     | 
    
         
             
                return clone;
         
     | 
| 
       130 
130 
     | 
    
         
             
            }
         
     | 
| 
         @@ -139,7 +139,7 @@ static VALUE Factory_freeze(VALUE self) { 
     | 
|
| 
       139 
139 
     | 
    
         
             
                            // If the factory is frozen, we can safely share the packer cache between
         
     | 
| 
       140 
140 
     | 
    
         
             
                            // all packers. So we eagerly create it now so it's available when #packer
         
     | 
| 
       141 
141 
     | 
    
         
             
                            // is called.
         
     | 
| 
       142 
     | 
    
         
            -
                            fc->pkrg.cache  
     | 
| 
      
 142 
     | 
    
         
            +
                            RB_OBJ_WRITE(self, &fc->pkrg.cache, rb_hash_new());
         
     | 
| 
       143 
143 
     | 
    
         
             
                        }
         
     | 
| 
       144 
144 
     | 
    
         
             
                    }
         
     | 
| 
       145 
145 
     | 
    
         | 
| 
         @@ -158,7 +158,7 @@ VALUE MessagePack_Factory_packer(int argc, VALUE* argv, VALUE self) 
     | 
|
| 
       158 
158 
     | 
    
         | 
| 
       159 
159 
     | 
    
         
             
                msgpack_packer_t* pk = MessagePack_Packer_get(packer);
         
     | 
| 
       160 
160 
     | 
    
         
             
                msgpack_packer_ext_registry_destroy(&pk->ext_registry);
         
     | 
| 
       161 
     | 
    
         
            -
                 
     | 
| 
      
 161 
     | 
    
         
            +
                msgpack_packer_ext_registry_borrow(packer, &fc->pkrg, &pk->ext_registry);
         
     | 
| 
       162 
162 
     | 
    
         
             
                pk->has_bigint_ext_type = fc->has_bigint_ext_type;
         
     | 
| 
       163 
163 
     | 
    
         
             
                pk->has_symbol_ext_type = fc->has_symbol_ext_type;
         
     | 
| 
       164 
164 
     | 
    
         | 
| 
         @@ -187,7 +187,7 @@ static VALUE Factory_registered_types_internal(VALUE self) 
     | 
|
| 
       187 
187 
     | 
    
         
             
                VALUE uk_mapping = rb_hash_new();
         
     | 
| 
       188 
188 
     | 
    
         
             
                if (fc->ukrg) {
         
     | 
| 
       189 
189 
     | 
    
         
             
                    for(int i=0; i < 256; i++) {
         
     | 
| 
       190 
     | 
    
         
            -
                        if(fc->ukrg->array[i] 
     | 
| 
      
 190 
     | 
    
         
            +
                        if(!NIL_P(fc->ukrg->array[i])) {
         
     | 
| 
       191 
191 
     | 
    
         
             
                            rb_hash_aset(uk_mapping, INT2FIX(i - 128), fc->ukrg->array[i]);
         
     | 
| 
       192 
192 
     | 
    
         
             
                        }
         
     | 
| 
       193 
193 
     | 
    
         
             
                    }
         
     | 
| 
         @@ -200,73 +200,39 @@ static VALUE Factory_registered_types_internal(VALUE self) 
     | 
|
| 
       200 
200 
     | 
    
         
             
                );
         
     | 
| 
       201 
201 
     | 
    
         
             
            }
         
     | 
| 
       202 
202 
     | 
    
         | 
| 
       203 
     | 
    
         
            -
            static VALUE  
     | 
| 
      
 203 
     | 
    
         
            +
            static VALUE Factory_register_type_internal(VALUE self, VALUE rb_ext_type, VALUE ext_module, VALUE options)
         
     | 
| 
       204 
204 
     | 
    
         
             
            {
         
     | 
| 
       205 
205 
     | 
    
         
             
                msgpack_factory_t *fc = Factory_get(self);
         
     | 
| 
       206 
206 
     | 
    
         | 
| 
       207 
     | 
    
         
            -
                 
     | 
| 
       208 
     | 
    
         
            -
                int flags = 0;
         
     | 
| 
       209 
     | 
    
         
            -
                VALUE ext_module;
         
     | 
| 
       210 
     | 
    
         
            -
                VALUE options = Qnil;
         
     | 
| 
       211 
     | 
    
         
            -
                VALUE packer_arg, unpacker_arg;
         
     | 
| 
       212 
     | 
    
         
            -
                VALUE packer_proc, unpacker_proc;
         
     | 
| 
      
 207 
     | 
    
         
            +
                Check_Type(rb_ext_type, T_FIXNUM);
         
     | 
| 
       213 
208 
     | 
    
         | 
| 
       214 
     | 
    
         
            -
                if 
     | 
| 
       215 
     | 
    
         
            -
                    rb_raise( 
     | 
| 
      
 209 
     | 
    
         
            +
                if(rb_type(ext_module) != T_MODULE && rb_type(ext_module) != T_CLASS) {
         
     | 
| 
      
 210 
     | 
    
         
            +
                    rb_raise(rb_eArgError, "expected Module/Class but found %s.", rb_obj_classname(ext_module));
         
     | 
| 
       216 
211 
     | 
    
         
             
                }
         
     | 
| 
       217 
212 
     | 
    
         | 
| 
       218 
     | 
    
         
            -
                 
     | 
| 
       219 
     | 
    
         
            -
                case 2:
         
     | 
| 
       220 
     | 
    
         
            -
                    /* register_type(0x7f, Time) */
         
     | 
| 
       221 
     | 
    
         
            -
                    packer_arg = ID2SYM(rb_intern("to_msgpack_ext"));
         
     | 
| 
       222 
     | 
    
         
            -
                    unpacker_arg = ID2SYM(rb_intern("from_msgpack_ext"));
         
     | 
| 
       223 
     | 
    
         
            -
                    break;
         
     | 
| 
       224 
     | 
    
         
            -
                case 3:
         
     | 
| 
       225 
     | 
    
         
            -
                    /* register_type(0x7f, Time, packer: proc-like, unapcker: proc-like) */
         
     | 
| 
       226 
     | 
    
         
            -
                    options = argv[2];
         
     | 
| 
       227 
     | 
    
         
            -
                    if(rb_type(options) != T_HASH) {
         
     | 
| 
       228 
     | 
    
         
            -
                        rb_raise(rb_eArgError, "expected Hash but found %s.", rb_obj_classname(options));
         
     | 
| 
       229 
     | 
    
         
            -
                    }
         
     | 
| 
       230 
     | 
    
         
            -
                    packer_arg = rb_hash_aref(options, ID2SYM(rb_intern("packer")));
         
     | 
| 
       231 
     | 
    
         
            -
                    unpacker_arg = rb_hash_aref(options, ID2SYM(rb_intern("unpacker")));
         
     | 
| 
       232 
     | 
    
         
            -
                    break;
         
     | 
| 
       233 
     | 
    
         
            -
                default:
         
     | 
| 
       234 
     | 
    
         
            -
                    rb_raise(rb_eArgError, "wrong number of arguments (%d for 2..3)", argc);
         
     | 
| 
       235 
     | 
    
         
            -
                }
         
     | 
| 
      
 213 
     | 
    
         
            +
                int flags = 0;
         
     | 
| 
       236 
214 
     | 
    
         | 
| 
       237 
     | 
    
         
            -
                 
     | 
| 
      
 215 
     | 
    
         
            +
                VALUE packer_proc = Qnil;
         
     | 
| 
      
 216 
     | 
    
         
            +
                VALUE unpacker_proc = Qnil;
         
     | 
| 
      
 217 
     | 
    
         
            +
                if(!NIL_P(options)) {
         
     | 
| 
       238 
218 
     | 
    
         
             
                    Check_Type(options, T_HASH);
         
     | 
| 
      
 219 
     | 
    
         
            +
                    packer_proc = rb_hash_aref(options, ID2SYM(rb_intern("packer")));
         
     | 
| 
      
 220 
     | 
    
         
            +
                    unpacker_proc = rb_hash_aref(options, ID2SYM(rb_intern("unpacker")));
         
     | 
| 
       239 
221 
     | 
    
         
             
                }
         
     | 
| 
       240 
222 
     | 
    
         | 
| 
       241 
     | 
    
         
            -
                 
     | 
| 
       242 
     | 
    
         
            -
             
     | 
| 
       243 
     | 
    
         
            -
                    rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type);
         
     | 
| 
       244 
     | 
    
         
            -
                }
         
     | 
| 
       245 
     | 
    
         
            -
             
     | 
| 
       246 
     | 
    
         
            -
                ext_module = argv[1];
         
     | 
| 
       247 
     | 
    
         
            -
                if(rb_type(ext_module) != T_MODULE && rb_type(ext_module) != T_CLASS) {
         
     | 
| 
       248 
     | 
    
         
            -
                    rb_raise(rb_eArgError, "expected Module/Class but found %s.", rb_obj_classname(ext_module));
         
     | 
| 
       249 
     | 
    
         
            -
                }
         
     | 
| 
       250 
     | 
    
         
            -
             
     | 
| 
       251 
     | 
    
         
            -
                packer_proc = Qnil;
         
     | 
| 
       252 
     | 
    
         
            -
                unpacker_proc = Qnil;
         
     | 
| 
       253 
     | 
    
         
            -
             
     | 
| 
       254 
     | 
    
         
            -
                if(packer_arg != Qnil) {
         
     | 
| 
       255 
     | 
    
         
            -
                    packer_proc = rb_funcall(packer_arg, rb_intern("to_proc"), 0);
         
     | 
| 
      
 223 
     | 
    
         
            +
                if (OBJ_FROZEN(self)) {
         
     | 
| 
      
 224 
     | 
    
         
            +
                    rb_raise(rb_eFrozenError, "can't modify frozen MessagePack::Factory");
         
     | 
| 
       256 
225 
     | 
    
         
             
                }
         
     | 
| 
       257 
226 
     | 
    
         | 
| 
       258 
     | 
    
         
            -
                 
     | 
| 
       259 
     | 
    
         
            -
             
     | 
| 
       260 
     | 
    
         
            -
             
     | 
| 
       261 
     | 
    
         
            -
                    } else if (rb_respond_to(unpacker_arg, rb_intern("call"))) {
         
     | 
| 
       262 
     | 
    
         
            -
                        unpacker_proc = unpacker_arg;
         
     | 
| 
       263 
     | 
    
         
            -
                    } else {
         
     | 
| 
       264 
     | 
    
         
            -
                        unpacker_proc = rb_funcall(unpacker_arg, rb_intern("method"), 1, ID2SYM(rb_intern("call")));
         
     | 
| 
       265 
     | 
    
         
            -
                    }
         
     | 
| 
      
 227 
     | 
    
         
            +
                int ext_type = NUM2INT(rb_ext_type);
         
     | 
| 
      
 228 
     | 
    
         
            +
                if(ext_type < -128 || ext_type > 127) {
         
     | 
| 
      
 229 
     | 
    
         
            +
                    rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type);
         
     | 
| 
       266 
230 
     | 
    
         
             
                }
         
     | 
| 
       267 
231 
     | 
    
         | 
| 
       268 
232 
     | 
    
         
             
                if(ext_module == rb_cSymbol) {
         
     | 
| 
       269 
     | 
    
         
            -
                     
     | 
| 
      
 233 
     | 
    
         
            +
                    if(NIL_P(options) || RTEST(rb_hash_aref(options, ID2SYM(rb_intern("packer"))))) {
         
     | 
| 
      
 234 
     | 
    
         
            +
                        fc->has_symbol_ext_type = true;
         
     | 
| 
      
 235 
     | 
    
         
            +
                    }
         
     | 
| 
       270 
236 
     | 
    
         
             
                    if(RTEST(options) && RTEST(rb_hash_aref(options, ID2SYM(rb_intern("optimized_symbols_parsing"))))) {
         
     | 
| 
       271 
237 
     | 
    
         
             
                        fc->optimized_symbol_ext_type = true;
         
     | 
| 
       272 
238 
     | 
    
         
             
                    }
         
     | 
| 
         @@ -286,8 +252,8 @@ static VALUE Factory_register_type(int argc, VALUE* argv, VALUE self) 
     | 
|
| 
       286 
252 
     | 
    
         
             
                    }
         
     | 
| 
       287 
253 
     | 
    
         
             
                }
         
     | 
| 
       288 
254 
     | 
    
         | 
| 
       289 
     | 
    
         
            -
                msgpack_packer_ext_registry_put(&fc->pkrg, ext_module, ext_type, flags, packer_proc 
     | 
| 
       290 
     | 
    
         
            -
                msgpack_unpacker_ext_registry_put(&fc->ukrg, ext_module, ext_type, flags, unpacker_proc 
     | 
| 
      
 255 
     | 
    
         
            +
                msgpack_packer_ext_registry_put(self, &fc->pkrg, ext_module, ext_type, flags, packer_proc);
         
     | 
| 
      
 256 
     | 
    
         
            +
                msgpack_unpacker_ext_registry_put(self, &fc->ukrg, ext_module, ext_type, flags, unpacker_proc);
         
     | 
| 
       291 
257 
     | 
    
         | 
| 
       292 
258 
     | 
    
         
             
                return Qnil;
         
     | 
| 
       293 
259 
     | 
    
         
             
            }
         
     | 
| 
         @@ -306,5 +272,5 @@ void MessagePack_Factory_module_init(VALUE mMessagePack) 
     | 
|
| 
       306 
272 
     | 
    
         
             
                rb_define_method(cMessagePack_Factory, "unpacker", MessagePack_Factory_unpacker, -1);
         
     | 
| 
       307 
273 
     | 
    
         | 
| 
       308 
274 
     | 
    
         
             
                rb_define_private_method(cMessagePack_Factory, "registered_types_internal", Factory_registered_types_internal, 0);
         
     | 
| 
       309 
     | 
    
         
            -
                 
     | 
| 
      
 275 
     | 
    
         
            +
                rb_define_private_method(cMessagePack_Factory, "register_type_internal", Factory_register_type_internal, 3);
         
     | 
| 
       310 
276 
     | 
    
         
             
            }
         
     | 
    
        data/ext/msgpack/packer.c
    CHANGED
    
    | 
         @@ -17,16 +17,11 @@ 
     | 
|
| 
       17 
17 
     | 
    
         
             
             */
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
            #include "packer.h"
         
     | 
| 
      
 20 
     | 
    
         
            +
            #include "buffer_class.h"
         
     | 
| 
       20 
21 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
            {
         
     | 
| 
       25 
     | 
    
         
            -
                s_call = rb_intern("call");
         
     | 
| 
       26 
     | 
    
         
            -
            }
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
            void msgpack_packer_static_destroy(void)
         
     | 
| 
       29 
     | 
    
         
            -
            { }
         
     | 
| 
      
 22 
     | 
    
         
            +
            #if !defined(HAVE_RB_PROC_CALL_WITH_BLOCK)
         
     | 
| 
      
 23 
     | 
    
         
            +
            #define rb_proc_call_with_block(recv, argc, argv, block) rb_funcallv(recv, rb_intern("call"), argc, argv)
         
     | 
| 
      
 24 
     | 
    
         
            +
            #endif
         
     | 
| 
       30 
25 
     | 
    
         | 
| 
       31 
26 
     | 
    
         
             
            void msgpack_packer_init(msgpack_packer_t* pk)
         
     | 
| 
       32 
27 
     | 
    
         
             
            {
         
     | 
| 
         @@ -43,6 +38,7 @@ void msgpack_packer_mark(msgpack_packer_t* pk) 
     | 
|
| 
       43 
38 
     | 
    
         
             
                /* See MessagePack_Buffer_wrap */
         
     | 
| 
       44 
39 
     | 
    
         
             
                /* msgpack_buffer_mark(PACKER_BUFFER_(pk)); */
         
     | 
| 
       45 
40 
     | 
    
         
             
                rb_gc_mark(pk->buffer_ref);
         
     | 
| 
      
 41 
     | 
    
         
            +
                rb_gc_mark(pk->to_msgpack_arg);
         
     | 
| 
       46 
42 
     | 
    
         
             
            }
         
     | 
| 
       47 
43 
     | 
    
         | 
| 
       48 
44 
     | 
    
         
             
            void msgpack_packer_reset(msgpack_packer_t* pk)
         
     | 
| 
         @@ -99,14 +95,13 @@ struct msgpack_call_proc_args_t; 
     | 
|
| 
       99 
95 
     | 
    
         
             
            typedef struct msgpack_call_proc_args_t msgpack_call_proc_args_t;
         
     | 
| 
       100 
96 
     | 
    
         
             
            struct msgpack_call_proc_args_t {
         
     | 
| 
       101 
97 
     | 
    
         
             
                VALUE proc;
         
     | 
| 
       102 
     | 
    
         
            -
                VALUE  
     | 
| 
       103 
     | 
    
         
            -
                VALUE packer;
         
     | 
| 
      
 98 
     | 
    
         
            +
                VALUE args[2];
         
     | 
| 
       104 
99 
     | 
    
         
             
            };
         
     | 
| 
       105 
100 
     | 
    
         | 
| 
       106 
101 
     | 
    
         
             
            VALUE msgpack_packer_try_calling_proc(VALUE value)
         
     | 
| 
       107 
102 
     | 
    
         
             
            {
         
     | 
| 
       108 
103 
     | 
    
         
             
                msgpack_call_proc_args_t *args = (msgpack_call_proc_args_t *)value;
         
     | 
| 
       109 
     | 
    
         
            -
                return  
     | 
| 
      
 104 
     | 
    
         
            +
                return rb_proc_call_with_block(args->proc, 2, args->args, Qnil);
         
     | 
| 
       110 
105 
     | 
    
         
             
            }
         
     | 
| 
       111 
106 
     | 
    
         | 
| 
       112 
107 
     | 
    
         
             
            bool msgpack_packer_try_write_with_ext_type_lookup(msgpack_packer_t* pk, VALUE v)
         
     | 
| 
         @@ -120,11 +115,13 @@ bool msgpack_packer_try_write_with_ext_type_lookup(msgpack_packer_t* pk, VALUE v 
     | 
|
| 
       120 
115 
     | 
    
         
             
                }
         
     | 
| 
       121 
116 
     | 
    
         | 
| 
       122 
117 
     | 
    
         
             
                if(ext_flags & MSGPACK_EXT_RECURSIVE) {
         
     | 
| 
      
 118 
     | 
    
         
            +
                    VALUE held_buffer = MessagePack_Buffer_hold(&pk->buffer);
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
       123 
120 
     | 
    
         
             
                    msgpack_buffer_t parent_buffer = pk->buffer;
         
     | 
| 
       124 
121 
     | 
    
         
             
                    msgpack_buffer_init(PACKER_BUFFER_(pk));
         
     | 
| 
       125 
122 
     | 
    
         | 
| 
       126 
123 
     | 
    
         
             
                    int exception_occured = 0;
         
     | 
| 
       127 
     | 
    
         
            -
                    msgpack_call_proc_args_t args = { proc, v, pk->to_msgpack_arg };
         
     | 
| 
      
 124 
     | 
    
         
            +
                    msgpack_call_proc_args_t args = { proc, { v, pk->to_msgpack_arg } };
         
     | 
| 
       128 
125 
     | 
    
         
             
                    rb_protect(msgpack_packer_try_calling_proc, (VALUE)&args, &exception_occured);
         
     | 
| 
       129 
126 
     | 
    
         | 
| 
       130 
127 
     | 
    
         
             
                    if (exception_occured) {
         
     | 
| 
         @@ -138,8 +135,10 @@ bool msgpack_packer_try_write_with_ext_type_lookup(msgpack_packer_t* pk, VALUE v 
     | 
|
| 
       138 
135 
     | 
    
         
             
                        pk->buffer = parent_buffer;
         
     | 
| 
       139 
136 
     | 
    
         
             
                        msgpack_packer_write_ext(pk, ext_type, payload);
         
     | 
| 
       140 
137 
     | 
    
         
             
                    }
         
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
| 
      
 139 
     | 
    
         
            +
                    RB_GC_GUARD(held_buffer);
         
     | 
| 
       141 
140 
     | 
    
         
             
                } else {
         
     | 
| 
       142 
     | 
    
         
            -
                    VALUE payload =  
     | 
| 
      
 141 
     | 
    
         
            +
                    VALUE payload = rb_proc_call_with_block(proc, 1, &v, Qnil);
         
     | 
| 
       143 
142 
     | 
    
         
             
                    StringValue(payload);
         
     | 
| 
       144 
143 
     | 
    
         
             
                    msgpack_packer_write_ext(pk, ext_type, payload);
         
     | 
| 
       145 
144 
     | 
    
         
             
                }
         
     | 
    
        data/ext/msgpack/packer.h
    CHANGED
    
    | 
         @@ -47,10 +47,6 @@ struct msgpack_packer_t { 
     | 
|
| 
       47 
47 
     | 
    
         | 
| 
       48 
48 
     | 
    
         
             
            #define PACKER_BUFFER_(pk) (&(pk)->buffer)
         
     | 
| 
       49 
49 
     | 
    
         | 
| 
       50 
     | 
    
         
            -
            void msgpack_packer_static_init(void);
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
            void msgpack_packer_static_destroy(void);
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
50 
     | 
    
         
             
            void msgpack_packer_init(msgpack_packer_t* pk);
         
     | 
| 
       55 
51 
     | 
    
         | 
| 
       56 
52 
     | 
    
         
             
            void msgpack_packer_destroy(msgpack_packer_t* pk);
         
     | 
    
        data/ext/msgpack/packer_class.c
    CHANGED
    
    | 
         @@ -47,6 +47,7 @@ static void Packer_free(void *ptr) 
     | 
|
| 
       47 
47 
     | 
    
         
             
            static void Packer_mark(void *ptr)
         
     | 
| 
       48 
48 
     | 
    
         
             
            {
         
     | 
| 
       49 
49 
     | 
    
         
             
                msgpack_packer_t* pk = ptr;
         
     | 
| 
      
 50 
     | 
    
         
            +
                msgpack_buffer_mark(pk);
         
     | 
| 
       50 
51 
     | 
    
         
             
                msgpack_packer_mark(pk);
         
     | 
| 
       51 
52 
     | 
    
         
             
                msgpack_packer_ext_registry_mark(&pk->ext_registry);
         
     | 
| 
       52 
53 
     | 
    
         
             
            }
         
     | 
| 
         @@ -105,7 +106,7 @@ VALUE MessagePack_Packer_initialize(int argc, VALUE* argv, VALUE self) 
     | 
|
| 
       105 
106 
     | 
    
         | 
| 
       106 
107 
     | 
    
         
             
                msgpack_packer_t *pk = MessagePack_Packer_get(self);
         
     | 
| 
       107 
108 
     | 
    
         | 
| 
       108 
     | 
    
         
            -
                msgpack_packer_ext_registry_init(&pk->ext_registry);
         
     | 
| 
      
 109 
     | 
    
         
            +
                msgpack_packer_ext_registry_init(self, &pk->ext_registry);
         
     | 
| 
       109 
110 
     | 
    
         
             
                pk->buffer_ref = MessagePack_Buffer_wrap(PACKER_BUFFER_(pk), self);
         
     | 
| 
       110 
111 
     | 
    
         | 
| 
       111 
112 
     | 
    
         
             
                MessagePack_Buffer_set_options(PACKER_BUFFER_(pk), io, options);
         
     | 
| 
         @@ -129,6 +130,9 @@ static VALUE Packer_compatibility_mode_p(VALUE self) 
     | 
|
| 
       129 
130 
     | 
    
         
             
            static VALUE Packer_buffer(VALUE self)
         
     | 
| 
       130 
131 
     | 
    
         
             
            {
         
     | 
| 
       131 
132 
     | 
    
         
             
                msgpack_packer_t *pk = MessagePack_Packer_get(self);
         
     | 
| 
      
 133 
     | 
    
         
            +
                if (!RTEST(pk->buffer_ref)) {
         
     | 
| 
      
 134 
     | 
    
         
            +
                    pk->buffer_ref = MessagePack_Buffer_wrap(PACKER_BUFFER_(pk), self);
         
     | 
| 
      
 135 
     | 
    
         
            +
                }
         
     | 
| 
       132 
136 
     | 
    
         
             
                return pk->buffer_ref;
         
     | 
| 
       133 
137 
     | 
    
         
             
            }
         
     | 
| 
       134 
138 
     | 
    
         | 
| 
         @@ -229,7 +233,12 @@ static VALUE Packer_write_extension(VALUE self, VALUE obj) 
     | 
|
| 
       229 
233 
     | 
    
         
             
                msgpack_packer_t *pk = MessagePack_Packer_get(self);
         
     | 
| 
       230 
234 
     | 
    
         
             
                Check_Type(obj, T_STRUCT);
         
     | 
| 
       231 
235 
     | 
    
         | 
| 
       232 
     | 
    
         
            -
                 
     | 
| 
      
 236 
     | 
    
         
            +
                VALUE rb_ext_type = RSTRUCT_GET(obj, 0);
         
     | 
| 
      
 237 
     | 
    
         
            +
                if(!RB_TYPE_P(rb_ext_type, T_FIXNUM)) {
         
     | 
| 
      
 238 
     | 
    
         
            +
                    rb_raise(rb_eRangeError, "integer %s too big to convert to `signed char'", RSTRING_PTR(rb_String(rb_ext_type)));
         
     | 
| 
      
 239 
     | 
    
         
            +
                }
         
     | 
| 
      
 240 
     | 
    
         
            +
             
     | 
| 
      
 241 
     | 
    
         
            +
                int ext_type = FIX2INT(rb_ext_type);
         
     | 
| 
       233 
242 
     | 
    
         
             
                if(ext_type < -128 || ext_type > 127) {
         
     | 
| 
       234 
243 
     | 
    
         
             
                    rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type);
         
     | 
| 
       235 
244 
     | 
    
         
             
                }
         
     | 
| 
         @@ -334,18 +343,6 @@ static VALUE Packer_write_to(VALUE self, VALUE io) 
     | 
|
| 
       334 
343 
     | 
    
         
             
                return SIZET2NUM(sz);
         
     | 
| 
       335 
344 
     | 
    
         
             
            }
         
     | 
| 
       336 
345 
     | 
    
         | 
| 
       337 
     | 
    
         
            -
            //static VALUE Packer_append(VALUE self, VALUE string_or_buffer)
         
     | 
| 
       338 
     | 
    
         
            -
            //{
         
     | 
| 
       339 
     | 
    
         
            -
            //    msgpack_packer_t *pk = MessagePack_Packer_get(self);
         
     | 
| 
       340 
     | 
    
         
            -
            //
         
     | 
| 
       341 
     | 
    
         
            -
            //    // TODO if string_or_buffer is a Buffer
         
     | 
| 
       342 
     | 
    
         
            -
            //    VALUE string = string_or_buffer;
         
     | 
| 
       343 
     | 
    
         
            -
            //
         
     | 
| 
       344 
     | 
    
         
            -
            //    msgpack_buffer_append_string(PACKER_BUFFER_(pk), string);
         
     | 
| 
       345 
     | 
    
         
            -
            //
         
     | 
| 
       346 
     | 
    
         
            -
            //    return self;
         
     | 
| 
       347 
     | 
    
         
            -
            //}
         
     | 
| 
       348 
     | 
    
         
            -
             
     | 
| 
       349 
346 
     | 
    
         
             
            static VALUE Packer_registered_types_internal(VALUE self)
         
     | 
| 
       350 
347 
     | 
    
         
             
            {
         
     | 
| 
       351 
348 
     | 
    
         
             
                msgpack_packer_t *pk = MessagePack_Packer_get(self);
         
     | 
| 
         @@ -355,42 +352,20 @@ static VALUE Packer_registered_types_internal(VALUE self) 
     | 
|
| 
       355 
352 
     | 
    
         
             
                return rb_hash_new();
         
     | 
| 
       356 
353 
     | 
    
         
             
            }
         
     | 
| 
       357 
354 
     | 
    
         | 
| 
       358 
     | 
    
         
            -
            static VALUE  
     | 
| 
      
 355 
     | 
    
         
            +
            static VALUE Packer_register_type_internal(VALUE self, VALUE rb_ext_type, VALUE ext_module, VALUE proc)
         
     | 
| 
       359 
356 
     | 
    
         
             
            {
         
     | 
| 
       360 
     | 
    
         
            -
                 
     | 
| 
       361 
     | 
    
         
            -
             
     | 
| 
       362 
     | 
    
         
            -
                int ext_type;
         
     | 
| 
       363 
     | 
    
         
            -
                VALUE ext_module;
         
     | 
| 
       364 
     | 
    
         
            -
                VALUE proc;
         
     | 
| 
       365 
     | 
    
         
            -
                VALUE arg;
         
     | 
| 
       366 
     | 
    
         
            -
             
     | 
| 
       367 
     | 
    
         
            -
                switch (argc) {
         
     | 
| 
       368 
     | 
    
         
            -
                case 2:
         
     | 
| 
       369 
     | 
    
         
            -
                    /* register_type(0x7f, Time) {|obj| block... } */
         
     | 
| 
       370 
     | 
    
         
            -
                    rb_need_block();
         
     | 
| 
       371 
     | 
    
         
            -
                    proc = rb_block_lambda();
         
     | 
| 
       372 
     | 
    
         
            -
                    arg = proc;
         
     | 
| 
       373 
     | 
    
         
            -
                    break;
         
     | 
| 
       374 
     | 
    
         
            -
                case 3:
         
     | 
| 
       375 
     | 
    
         
            -
                    /* register_type(0x7f, Time, :to_msgpack_ext) */
         
     | 
| 
       376 
     | 
    
         
            -
                    arg = argv[2];
         
     | 
| 
       377 
     | 
    
         
            -
                    proc = rb_funcall(arg, rb_intern("to_proc"), 0);
         
     | 
| 
       378 
     | 
    
         
            -
                    break;
         
     | 
| 
       379 
     | 
    
         
            -
                default:
         
     | 
| 
       380 
     | 
    
         
            -
                    rb_raise(rb_eArgError, "wrong number of arguments (%d for 2..3)", argc);
         
     | 
| 
      
 357 
     | 
    
         
            +
                if (OBJ_FROZEN(self)) {
         
     | 
| 
      
 358 
     | 
    
         
            +
                    rb_raise(rb_eFrozenError, "can't modify frozen MessagePack::Packer");
         
     | 
| 
       381 
359 
     | 
    
         
             
                }
         
     | 
| 
       382 
360 
     | 
    
         | 
| 
       383 
     | 
    
         
            -
                 
     | 
| 
      
 361 
     | 
    
         
            +
                msgpack_packer_t *pk = MessagePack_Packer_get(self);
         
     | 
| 
      
 362 
     | 
    
         
            +
             
     | 
| 
      
 363 
     | 
    
         
            +
                int ext_type = NUM2INT(rb_ext_type);
         
     | 
| 
       384 
364 
     | 
    
         
             
                if(ext_type < -128 || ext_type > 127) {
         
     | 
| 
       385 
365 
     | 
    
         
             
                    rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type);
         
     | 
| 
       386 
366 
     | 
    
         
             
                }
         
     | 
| 
       387 
367 
     | 
    
         | 
| 
       388 
     | 
    
         
            -
                ext_module  
     | 
| 
       389 
     | 
    
         
            -
                if(rb_type(ext_module) != T_MODULE && rb_type(ext_module) != T_CLASS) {
         
     | 
| 
       390 
     | 
    
         
            -
                    rb_raise(rb_eArgError, "expected Module/Class but found %s.", rb_obj_classname(ext_module));
         
     | 
| 
       391 
     | 
    
         
            -
                }
         
     | 
| 
       392 
     | 
    
         
            -
             
     | 
| 
       393 
     | 
    
         
            -
                msgpack_packer_ext_registry_put(&pk->ext_registry, ext_module, ext_type, 0, proc, arg);
         
     | 
| 
      
 368 
     | 
    
         
            +
                msgpack_packer_ext_registry_put(self, &pk->ext_registry, ext_module, ext_type, 0, proc);
         
     | 
| 
       394 
369 
     | 
    
         | 
| 
       395 
370 
     | 
    
         
             
                if (ext_module == rb_cSymbol) {
         
     | 
| 
       396 
371 
     | 
    
         
             
                    pk->has_symbol_ext_type = true;
         
     | 
| 
         @@ -423,10 +398,6 @@ void MessagePack_Packer_module_init(VALUE mMessagePack) 
     | 
|
| 
       423 
398 
     | 
    
         
             
                s_write = rb_intern("write");
         
     | 
| 
       424 
399 
     | 
    
         | 
| 
       425 
400 
     | 
    
         
             
                sym_compatibility_mode = ID2SYM(rb_intern("compatibility_mode"));
         
     | 
| 
       426 
     | 
    
         
            -
             
     | 
| 
       427 
     | 
    
         
            -
                msgpack_packer_static_init();
         
     | 
| 
       428 
     | 
    
         
            -
                msgpack_packer_ext_registry_static_init();
         
     | 
| 
       429 
     | 
    
         
            -
             
     | 
| 
       430 
401 
     | 
    
         
             
                cMessagePack_Packer = rb_define_class_under(mMessagePack, "Packer", rb_cObject);
         
     | 
| 
       431 
402 
     | 
    
         | 
| 
       432 
403 
     | 
    
         
             
                rb_define_alloc_func(cMessagePack_Packer, MessagePack_Packer_alloc);
         
     | 
| 
         @@ -463,15 +434,9 @@ void MessagePack_Packer_module_init(VALUE mMessagePack) 
     | 
|
| 
       463 
434 
     | 
    
         
             
                rb_define_method(cMessagePack_Packer, "to_str", Packer_to_str, 0);
         
     | 
| 
       464 
435 
     | 
    
         
             
                rb_define_alias(cMessagePack_Packer, "to_s", "to_str");
         
     | 
| 
       465 
436 
     | 
    
         
             
                rb_define_method(cMessagePack_Packer, "to_a", Packer_to_a, 0);
         
     | 
| 
       466 
     | 
    
         
            -
                //rb_define_method(cMessagePack_Packer, "append", Packer_append, 1);
         
     | 
| 
       467 
     | 
    
         
            -
                //rb_define_alias(cMessagePack_Packer, "<<", "append");
         
     | 
| 
       468 
437 
     | 
    
         | 
| 
       469 
438 
     | 
    
         
             
                rb_define_private_method(cMessagePack_Packer, "registered_types_internal", Packer_registered_types_internal, 0);
         
     | 
| 
       470 
     | 
    
         
            -
                rb_define_method(cMessagePack_Packer, " 
     | 
| 
       471 
     | 
    
         
            -
             
     | 
| 
       472 
     | 
    
         
            -
                //s_packer_value = MessagePack_Packer_alloc(cMessagePack_Packer);
         
     | 
| 
       473 
     | 
    
         
            -
                //rb_gc_register_address(&s_packer_value);
         
     | 
| 
       474 
     | 
    
         
            -
                //Data_Get_Struct(s_packer_value, msgpack_packer_t, s_packer);
         
     | 
| 
      
 439 
     | 
    
         
            +
                rb_define_method(cMessagePack_Packer, "register_type_internal", Packer_register_type_internal, 3);
         
     | 
| 
       475 
440 
     | 
    
         | 
| 
       476 
441 
     | 
    
         
             
                rb_define_method(cMessagePack_Packer, "full_pack", Packer_full_pack, 0);
         
     | 
| 
       477 
442 
     | 
    
         
             
            }
         
     | 
| 
         @@ -18,20 +18,10 @@ 
     | 
|
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
            #include "packer_ext_registry.h"
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
            void msgpack_packer_ext_registry_static_init(void)
         
     | 
| 
       24 
     | 
    
         
            -
            {
         
     | 
| 
       25 
     | 
    
         
            -
                s_call = rb_intern("call");
         
     | 
| 
       26 
     | 
    
         
            -
            }
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
            void msgpack_packer_ext_registry_static_destroy(void)
         
     | 
| 
       29 
     | 
    
         
            -
            { }
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
            void msgpack_packer_ext_registry_init(msgpack_packer_ext_registry_t* pkrg)
         
     | 
| 
      
 21 
     | 
    
         
            +
            void msgpack_packer_ext_registry_init(VALUE owner, msgpack_packer_ext_registry_t* pkrg)
         
     | 
| 
       32 
22 
     | 
    
         
             
            {
         
     | 
| 
       33 
     | 
    
         
            -
                pkrg->hash  
     | 
| 
       34 
     | 
    
         
            -
                pkrg->cache  
     | 
| 
      
 23 
     | 
    
         
            +
                RB_OBJ_WRITE(owner, &pkrg->hash, Qnil);
         
     | 
| 
      
 24 
     | 
    
         
            +
                RB_OBJ_WRITE(owner, &pkrg->cache, Qnil);
         
     | 
| 
       35 
25 
     | 
    
         
             
            }
         
     | 
| 
       36 
26 
     | 
    
         | 
| 
       37 
27 
     | 
    
         
             
            void msgpack_packer_ext_registry_mark(msgpack_packer_ext_registry_t* pkrg)
         
     | 
| 
         @@ -40,32 +30,45 @@ void msgpack_packer_ext_registry_mark(msgpack_packer_ext_registry_t* pkrg) 
     | 
|
| 
       40 
30 
     | 
    
         
             
                rb_gc_mark(pkrg->cache);
         
     | 
| 
       41 
31 
     | 
    
         
             
            }
         
     | 
| 
       42 
32 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
            void  
     | 
| 
      
 33 
     | 
    
         
            +
            void msgpack_packer_ext_registry_borrow(VALUE owner, msgpack_packer_ext_registry_t* src,
         
     | 
| 
       44 
34 
     | 
    
         
             
                    msgpack_packer_ext_registry_t* dst)
         
     | 
| 
       45 
35 
     | 
    
         
             
            {
         
     | 
| 
       46 
     | 
    
         
            -
                if(RTEST(src->hash) 
     | 
| 
       47 
     | 
    
         
            -
                     
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
      
 36 
     | 
    
         
            +
                if(RTEST(src->hash)) {
         
     | 
| 
      
 37 
     | 
    
         
            +
                    if(rb_obj_frozen_p(src->hash)) {
         
     | 
| 
      
 38 
     | 
    
         
            +
                        // If the type registry is frozen we can safely share it, and share the cache as well.
         
     | 
| 
      
 39 
     | 
    
         
            +
                        RB_OBJ_WRITE(owner, &dst->hash, src->hash);
         
     | 
| 
      
 40 
     | 
    
         
            +
                        RB_OBJ_WRITE(owner, &dst->cache, src->cache);
         
     | 
| 
      
 41 
     | 
    
         
            +
                    } else {
         
     | 
| 
      
 42 
     | 
    
         
            +
                        RB_OBJ_WRITE(owner, &dst->hash, rb_hash_dup(src->hash));
         
     | 
| 
      
 43 
     | 
    
         
            +
                        RB_OBJ_WRITE(owner, &dst->cache, NIL_P(src->cache) ? Qnil : rb_hash_dup(src->cache));
         
     | 
| 
      
 44 
     | 
    
         
            +
                    }
         
     | 
| 
       49 
45 
     | 
    
         
             
                } else {
         
     | 
| 
       50 
     | 
    
         
            -
                     
     | 
| 
       51 
     | 
    
         
            -
                    dst-> 
     | 
| 
       52 
     | 
    
         
            -
                    dst->cache = src->cache;
         
     | 
| 
      
 46 
     | 
    
         
            +
                    RB_OBJ_WRITE(owner, &dst->hash, Qnil);
         
     | 
| 
      
 47 
     | 
    
         
            +
                    RB_OBJ_WRITE(owner, &dst->cache, Qnil);
         
     | 
| 
       53 
48 
     | 
    
         
             
                }
         
     | 
| 
       54 
49 
     | 
    
         
             
            }
         
     | 
| 
       55 
50 
     | 
    
         | 
| 
       56 
     | 
    
         
            -
            VALUE  
     | 
| 
       57 
     | 
    
         
            -
                     
     | 
| 
      
 51 
     | 
    
         
            +
            void msgpack_packer_ext_registry_dup(VALUE owner, msgpack_packer_ext_registry_t* src,
         
     | 
| 
      
 52 
     | 
    
         
            +
                    msgpack_packer_ext_registry_t* dst)
         
     | 
| 
       58 
53 
     | 
    
         
             
            {
         
     | 
| 
       59 
     | 
    
         
            -
                 
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
      
 54 
     | 
    
         
            +
                RB_OBJ_WRITE(owner, &dst->hash, NIL_P(src->hash) ? Qnil : rb_hash_dup(src->hash));
         
     | 
| 
      
 55 
     | 
    
         
            +
                RB_OBJ_WRITE(owner, &dst->cache, NIL_P(src->cache) ? Qnil : rb_hash_dup(src->cache));
         
     | 
| 
      
 56 
     | 
    
         
            +
            }
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            void msgpack_packer_ext_registry_put(VALUE owner, msgpack_packer_ext_registry_t* pkrg,
         
     | 
| 
      
 59 
     | 
    
         
            +
                    VALUE ext_module, int ext_type, int flags, VALUE proc)
         
     | 
| 
      
 60 
     | 
    
         
            +
            {
         
     | 
| 
      
 61 
     | 
    
         
            +
                if(NIL_P(pkrg->hash)) {
         
     | 
| 
      
 62 
     | 
    
         
            +
                    RB_OBJ_WRITE(owner, &pkrg->hash, rb_hash_new());
         
     | 
| 
       61 
63 
     | 
    
         
             
                }
         
     | 
| 
       62 
64 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
                if 
     | 
| 
      
 65 
     | 
    
         
            +
                if(NIL_P(pkrg->cache)) {
         
     | 
| 
      
 66 
     | 
    
         
            +
                    RB_OBJ_WRITE(owner, &pkrg->cache, rb_hash_new());
         
     | 
| 
      
 67 
     | 
    
         
            +
                } else {
         
     | 
| 
       64 
68 
     | 
    
         
             
                    /* clear lookup cache not to miss added type */
         
     | 
| 
       65 
69 
     | 
    
         
             
                    rb_hash_clear(pkrg->cache);
         
     | 
| 
       66 
70 
     | 
    
         
             
                }
         
     | 
| 
       67 
71 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
                 
     | 
| 
       69 
     | 
    
         
            -
                 
     | 
| 
       70 
     | 
    
         
            -
                return rb_hash_aset(pkrg->hash, ext_module, entry);
         
     | 
| 
      
 72 
     | 
    
         
            +
                VALUE entry = rb_ary_new3(3, INT2FIX(ext_type), proc, INT2FIX(flags));
         
     | 
| 
      
 73 
     | 
    
         
            +
                rb_hash_aset(pkrg->hash, ext_module, entry);
         
     | 
| 
       71 
74 
     | 
    
         
             
            }
         
     | 
| 
         @@ -31,22 +31,21 @@ struct msgpack_packer_ext_registry_t { 
     | 
|
| 
       31 
31 
     | 
    
         
             
                VALUE cache; // lookup cache for ext types inherited from a super class
         
     | 
| 
       32 
32 
     | 
    
         
             
            };
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
       34 
     | 
    
         
            -
            void  
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
            void msgpack_packer_ext_registry_static_destroy(void);
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
            void msgpack_packer_ext_registry_init(msgpack_packer_ext_registry_t* pkrg);
         
     | 
| 
      
 34 
     | 
    
         
            +
            void msgpack_packer_ext_registry_init(VALUE owner, msgpack_packer_ext_registry_t* pkrg);
         
     | 
| 
       39 
35 
     | 
    
         | 
| 
       40 
36 
     | 
    
         
             
            static inline void msgpack_packer_ext_registry_destroy(msgpack_packer_ext_registry_t* pkrg)
         
     | 
| 
       41 
37 
     | 
    
         
             
            { }
         
     | 
| 
       42 
38 
     | 
    
         | 
| 
       43 
39 
     | 
    
         
             
            void msgpack_packer_ext_registry_mark(msgpack_packer_ext_registry_t* pkrg);
         
     | 
| 
       44 
40 
     | 
    
         | 
| 
       45 
     | 
    
         
            -
            void  
     | 
| 
      
 41 
     | 
    
         
            +
            void msgpack_packer_ext_registry_borrow(VALUE owner, msgpack_packer_ext_registry_t* src,
         
     | 
| 
       46 
42 
     | 
    
         
             
                    msgpack_packer_ext_registry_t* dst);
         
     | 
| 
       47 
43 
     | 
    
         | 
| 
       48 
     | 
    
         
            -
            VALUE  
     | 
| 
       49 
     | 
    
         
            -
                     
     | 
| 
      
 44 
     | 
    
         
            +
            void msgpack_packer_ext_registry_dup(VALUE owner, msgpack_packer_ext_registry_t* src,
         
     | 
| 
      
 45 
     | 
    
         
            +
                    msgpack_packer_ext_registry_t* dst);
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            void msgpack_packer_ext_registry_put(VALUE owner, msgpack_packer_ext_registry_t* pkrg,
         
     | 
| 
      
 48 
     | 
    
         
            +
                    VALUE ext_module, int ext_type, int flags, VALUE proc);
         
     | 
| 
       50 
49 
     | 
    
         | 
| 
       51 
50 
     | 
    
         
             
            static int msgpack_packer_ext_find_superclass(VALUE key, VALUE value, VALUE arg)
         
     | 
| 
       52 
51 
     | 
    
         
             
            {
         
     | 
| 
         @@ -68,7 +67,7 @@ static inline VALUE msgpack_packer_ext_registry_fetch(msgpack_packer_ext_registr 
     | 
|
| 
       68 
67 
     | 
    
         
             
                VALUE type = rb_hash_lookup(pkrg->hash, lookup_class);
         
     | 
| 
       69 
68 
     | 
    
         
             
                if(type != Qnil) {
         
     | 
| 
       70 
69 
     | 
    
         
             
                    *ext_type_result = FIX2INT(rb_ary_entry(type, 0));
         
     | 
| 
       71 
     | 
    
         
            -
                    *ext_flags_result = FIX2INT(rb_ary_entry(type,  
     | 
| 
      
 70 
     | 
    
         
            +
                    *ext_flags_result = FIX2INT(rb_ary_entry(type, 2));
         
     | 
| 
       72 
71 
     | 
    
         
             
                    return rb_ary_entry(type, 1);
         
     | 
| 
       73 
72 
     | 
    
         
             
                }
         
     | 
| 
       74 
73 
     | 
    
         | 
| 
         @@ -77,7 +76,7 @@ static inline VALUE msgpack_packer_ext_registry_fetch(msgpack_packer_ext_registr 
     | 
|
| 
       77 
76 
     | 
    
         
             
                    VALUE type_inht = rb_hash_lookup(pkrg->cache, lookup_class);
         
     | 
| 
       78 
77 
     | 
    
         
             
                    if(type_inht != Qnil) {
         
     | 
| 
       79 
78 
     | 
    
         
             
                        *ext_type_result = FIX2INT(rb_ary_entry(type_inht, 0));
         
     | 
| 
       80 
     | 
    
         
            -
                        *ext_flags_result = FIX2INT(rb_ary_entry(type_inht,  
     | 
| 
      
 79 
     | 
    
         
            +
                        *ext_flags_result = FIX2INT(rb_ary_entry(type_inht, 2));
         
     | 
| 
       81 
80 
     | 
    
         
             
                        return rb_ary_entry(type_inht, 1);
         
     | 
| 
       82 
81 
     | 
    
         
             
                    }
         
     | 
| 
       83 
82 
     | 
    
         
             
                }
         
     | 
| 
         @@ -129,12 +128,9 @@ static inline VALUE msgpack_packer_ext_registry_lookup(msgpack_packer_ext_regist 
     | 
|
| 
       129 
128 
     | 
    
         
             
                VALUE superclass = args[1];
         
     | 
| 
       130 
129 
     | 
    
         
             
                if(superclass != Qnil) {
         
     | 
| 
       131 
130 
     | 
    
         
             
                    VALUE superclass_type = rb_hash_lookup(pkrg->hash, superclass);
         
     | 
| 
       132 
     | 
    
         
            -
                    if (!RTEST(pkrg->cache)) {
         
     | 
| 
       133 
     | 
    
         
            -
                        pkrg->cache = rb_hash_new();
         
     | 
| 
       134 
     | 
    
         
            -
                    }
         
     | 
| 
       135 
131 
     | 
    
         
             
                    rb_hash_aset(pkrg->cache, lookup_class, superclass_type);
         
     | 
| 
       136 
132 
     | 
    
         
             
                    *ext_type_result = FIX2INT(rb_ary_entry(superclass_type, 0));
         
     | 
| 
       137 
     | 
    
         
            -
                    *ext_flags_result = FIX2INT(rb_ary_entry(superclass_type,  
     | 
| 
      
 133 
     | 
    
         
            +
                    *ext_flags_result = FIX2INT(rb_ary_entry(superclass_type, 2));
         
     | 
| 
       138 
134 
     | 
    
         
             
                    return rb_ary_entry(superclass_type, 1);
         
     | 
| 
       139 
135 
     | 
    
         
             
                }
         
     | 
| 
       140 
136 
     | 
    
         | 
    
        data/ext/msgpack/rbinit.c
    CHANGED
    
    
    
        data/ext/msgpack/rmem.c
    CHANGED
    
    | 
         @@ -65,11 +65,10 @@ void* _msgpack_rmem_alloc2(msgpack_rmem_t* pm) 
     | 
|
| 
       65 
65 
     | 
    
         
             
                /* allocate new chunk */
         
     | 
| 
       66 
66 
     | 
    
         
             
                c = pm->array_last++;
         
     | 
| 
       67 
67 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
                /* move to  
     | 
| 
       69 
     | 
    
         
            -
                 
     | 
| 
       70 
     | 
    
         
            -
                pm->head = *c;
         
     | 
| 
       71 
     | 
    
         
            -
                *c = tmp;
         
     | 
| 
      
 68 
     | 
    
         
            +
                /* move head to array */
         
     | 
| 
      
 69 
     | 
    
         
            +
                *c = pm->head;
         
     | 
| 
       72 
70 
     | 
    
         | 
| 
      
 71 
     | 
    
         
            +
                pm->head.pages = NULL; /* make sure we don't point to another chunk's pages in case xmalloc triggers GC */
         
     | 
| 
       73 
72 
     | 
    
         
             
                pm->head.mask = 0xffffffff & (~1);  /* "& (~1)" means first chunk is already allocated */
         
     | 
| 
       74 
73 
     | 
    
         
             
                pm->head.pages = xmalloc(MSGPACK_RMEM_PAGE_SIZE * 32);
         
     | 
| 
       75 
74 
     | 
    
         |