msgpack 1.2.0 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6ddf9590b93ed3b6762ce63e65d4bd29c1ad2792
4
- data.tar.gz: e26d98fbd1befb38ab0fc9911dbfe0236a5c7fb9
2
+ SHA256:
3
+ metadata.gz: 68dd900fcc04726f6cb555013d2517177b94a5d08e913d2918fb51537d291f43
4
+ data.tar.gz: 6bd2cce929b6d2e82a9c709556287698c344bc059e21ea1555419217ca3eee00
5
5
  SHA512:
6
- metadata.gz: 16e002df895c9db51fc43d68f291191f2a4e3d3d289a2b57e6b37459c141391916306f0c7ef71b7b3072bed453144498d8182ec9a36774d881735486016e9460
7
- data.tar.gz: a8f7fba77316e2e82cd4a157d3a3f5bf5d500fb53d076585440d61c6608278056bb6b2ff4ea0f502c45e6be99d81223fcef712b567a0f514ecd71e553dc8f0c7
6
+ metadata.gz: 2738b1131fb77a0d6594525faeb34d77ac558abb4289bfddf256863ef46c174b0414d2c2a52b772f1c20862d308766f1ddcfa37b3d0224c00ab11ce652b739ad
7
+ data.tar.gz: b8af7f48d1ae8e9c65c1af36f34b72989978e41426c730ab99f44cd9264253716d96d59abf13cc80f28384561f7a5ec1e5d2a6941afd8bec72c4b90626756bdc
@@ -1,20 +1,5 @@
1
1
  language: ruby
2
2
 
3
- rvm:
4
- - 2.0.0
5
- - 2.1.6
6
- - 2.2.2
7
- - 2.3.0
8
- - 2.4.0
9
- - ruby-head
10
- - jruby-19mode
11
- - jruby-9.1.5.0
12
- - jruby-head
13
-
14
- os:
15
- - linux
16
- - osx
17
-
18
3
  sudo: false
19
4
 
20
5
  branches:
@@ -24,18 +9,30 @@ branches:
24
9
  gemfile:
25
10
  - Gemfile
26
11
 
12
+ # http://rubies.travis-ci.org/
27
13
  matrix:
28
- exclude:
29
- - rvm: 2.0.0
30
- os: osx
31
- - rvm: jruby-19mode
14
+ include:
15
+ - rvm: 2.1.10
16
+ os: linux
17
+ - rvm: 2.2.8
18
+ os: linux
19
+ - rvm: 2.3.5
20
+ os: linux
21
+ - rvm: 2.3.5
32
22
  os: osx
33
- - rvm: jruby-9.1.5.0
23
+ - rvm: 2.4.2
24
+ os: linux
25
+ - rvm: 2.4.2
34
26
  os: osx
27
+ - rvm: ruby-head
28
+ os: linux
29
+ - rvm: jruby-9.1.9.0
30
+ os: linux
35
31
  - rvm: jruby-head
36
- os: osx
32
+ os: linux
33
+ - rvm: jruby-19mode
34
+ os: linux
37
35
  allow_failures:
38
36
  - rvm: ruby-head
39
37
  - rvm: jruby-head
40
38
  - rvm: jruby-19mode
41
- os: osx
data/ChangeLog CHANGED
@@ -1,3 +1,12 @@
1
+ 2018-01-11 version 1.2.2:
2
+
3
+ * Fix bug to occur SEGV occasionally (depends on GC timing) when exttype is used
4
+ * Fix bug to encode an ext type with wrong type id if superclass is also registered as ext type
5
+
6
+ 2017-12-08 version 1.2.1:
7
+
8
+ * Hotfix release only for JRuby: 1.2.0-java was built in incorrect way
9
+
1
10
  2017-12-07 version 1.2.0:
2
11
 
3
12
  * Add MessagePack::Factory#dump and MessagePack::Factory#load as convenient methods
@@ -384,7 +384,7 @@ public class Encoder {
384
384
  lookupClass = object.getSingletonClass();
385
385
  }
386
386
 
387
- IRubyObject[] pair = registry.lookupPackerByModule(lookupClass);
387
+ IRubyObject[] pair = registry.lookupPackerForObject(object);
388
388
  if (pair != null) {
389
389
  RubyString bytes = pair[0].callMethod(runtime.getCurrentContext(), "call", object).asString();
390
390
  int type = (int) ((RubyFixnum) pair[1]).getLongValue();
@@ -5,6 +5,7 @@ import org.jruby.RubyHash;
5
5
  import org.jruby.RubyArray;
6
6
  import org.jruby.RubyModule;
7
7
  import org.jruby.RubyFixnum;
8
+ import org.jruby.RubySymbol;
8
9
  import org.jruby.runtime.ThreadContext;
9
10
  import org.jruby.runtime.builtin.IRubyObject;
10
11
 
@@ -74,22 +75,50 @@ public class ExtensionRegistry {
74
75
  }
75
76
  }
76
77
 
77
- public IRubyObject[] lookupPackerByModule(RubyModule mod) {
78
+ public IRubyObject[] lookupPackerForObject(IRubyObject object) {
79
+ RubyModule lookupClass = null;
80
+ IRubyObject[] pair;
81
+ /*
82
+ * Objects of type Integer (Fixnum, Bignum), Float, Symbol and frozen
83
+ * String have no singleton class and raise a TypeError when trying to get
84
+ * it.
85
+ *
86
+ * Since all but symbols are already filtered out when reaching this code
87
+ * only symbols are checked here.
88
+ */
89
+ if (!(object instanceof RubySymbol)) {
90
+ lookupClass = object.getSingletonClass();
91
+ pair = fetchEntryByModule(lookupClass);
92
+ if (pair != null) {
93
+ return pair;
94
+ }
95
+ }
96
+
97
+ pair = fetchEntryByModule(object.getType());
98
+ if (pair != null) {
99
+ return pair;
100
+ }
101
+
102
+ if (lookupClass == null) {
103
+ lookupClass = object.getType(); // only for Symbol
104
+ }
105
+ ExtensionEntry e = findEntryByModuleOrAncestor(lookupClass);
106
+ if (e != null && e.hasPacker()) {
107
+ extensionsByAncestor.put(e.getExtensionModule(), e);
108
+ return e.toPackerProcTypeIdPair(lookupClass.getRuntime().getCurrentContext());
109
+ }
110
+ return null;
111
+ }
112
+
113
+ private IRubyObject[] fetchEntryByModule(final RubyModule mod) {
78
114
  ExtensionEntry e = extensionsByModule.get(mod);
79
115
  if (e == null) {
80
116
  e = extensionsByAncestor.get(mod);
81
117
  }
82
- if (e == null) {
83
- e = findEntryByModuleOrAncestor(mod);
84
- if (e != null) {
85
- extensionsByAncestor.put(e.getExtensionModule(), e);
86
- }
87
- }
88
118
  if (e != null && e.hasPacker()) {
89
119
  return e.toPackerProcTypeIdPair(mod.getRuntime().getCurrentContext());
90
- } else {
91
- return null;
92
120
  }
121
+ return null;
93
122
  }
94
123
 
95
124
  private ExtensionEntry findEntryByModuleOrAncestor(final RubyModule mod) {
@@ -54,7 +54,7 @@ static void Buffer_free(void* data)
54
54
 
55
55
  static VALUE Buffer_alloc(VALUE klass)
56
56
  {
57
- msgpack_buffer_t* b = ALLOC_N(msgpack_buffer_t, 1);
57
+ msgpack_buffer_t* b = ZALLOC_N(msgpack_buffer_t, 1);
58
58
  msgpack_buffer_init(b);
59
59
 
60
60
  return Data_Wrap_Struct(klass, msgpack_buffer_mark, Buffer_free, b);
@@ -28,6 +28,16 @@
28
28
  #endif
29
29
 
30
30
 
31
+ /*
32
+ * ZALLOC_N (ruby 2.2 or later)
33
+ */
34
+ #ifndef RB_ZALLOC_N
35
+ # define RB_ZALLOC_N(type,n) ((type*)ruby_xcalloc((size_t)(n),sizeof(type)))
36
+ #endif
37
+ #ifndef ZALLOC_N
38
+ # define ZALLOC_N(type,n) RB_ZALLOC_N(type,n)
39
+ #endif
40
+
31
41
  /*
32
42
  * COMPAT_HAVE_ENCODING
33
43
  */
@@ -59,10 +59,7 @@ void Factory_mark(msgpack_factory_t* fc)
59
59
 
60
60
  static VALUE Factory_alloc(VALUE klass)
61
61
  {
62
- msgpack_factory_t* fc = ALLOC_N(msgpack_factory_t, 1);
63
-
64
- msgpack_packer_ext_registry_init(&fc->pkrg);
65
- msgpack_unpacker_ext_registry_init(&fc->ukrg);
62
+ msgpack_factory_t* fc = ZALLOC_N(msgpack_factory_t, 1);
66
63
 
67
64
  VALUE self = Data_Wrap_Struct(klass, Factory_mark, Factory_free, fc);
68
65
  return self;
@@ -72,6 +69,9 @@ static VALUE Factory_initialize(int argc, VALUE* argv, VALUE self)
72
69
  {
73
70
  FACTORY(self, fc);
74
71
 
72
+ msgpack_packer_ext_registry_init(&fc->pkrg);
73
+ msgpack_unpacker_ext_registry_init(&fc->ukrg);
74
+
75
75
  fc->has_symbol_ext_type = false;
76
76
 
77
77
  switch (argc) {
@@ -125,25 +125,7 @@ void msgpack_packer_write_other_value(msgpack_packer_t* pk, VALUE v)
125
125
  {
126
126
  int ext_type;
127
127
 
128
- VALUE lookup_class;
129
-
130
- /*
131
- * Objects of type Integer (Fixnum, Bignum), Float, Symbol and frozen
132
- * String have no singleton class and raise a TypeError when trying to get
133
- * it. See implementation of #singleton_class in ruby's source code:
134
- * VALUE rb_singleton_class(VALUE obj);
135
- *
136
- * Since all but symbols are already filtered out when reaching this code
137
- * only symbols are checked here.
138
- */
139
- if (SYMBOL_P(v)) {
140
- lookup_class = rb_obj_class(v);
141
- } else {
142
- lookup_class = rb_singleton_class(v);
143
- }
144
-
145
- VALUE proc = msgpack_packer_ext_registry_lookup(&pk->ext_registry, lookup_class,
146
- &ext_type);
128
+ VALUE proc = msgpack_packer_ext_registry_lookup(&pk->ext_registry, v, &ext_type);
147
129
 
148
130
  if(proc != Qnil) {
149
131
  VALUE payload = rb_funcall(proc, s_call, 1, v);
@@ -56,14 +56,12 @@ static void Packer_mark(msgpack_packer_t* pk)
56
56
 
57
57
  VALUE MessagePack_Packer_alloc(VALUE klass)
58
58
  {
59
- msgpack_packer_t* pk = ALLOC_N(msgpack_packer_t, 1);
59
+ msgpack_packer_t* pk = ZALLOC_N(msgpack_packer_t, 1);
60
60
  msgpack_packer_init(pk);
61
61
 
62
62
  VALUE self = Data_Wrap_Struct(klass, Packer_mark, Packer_free, pk);
63
63
 
64
64
  msgpack_packer_set_to_msgpack_method(pk, s_to_msgpack, self);
65
- msgpack_packer_ext_registry_init(&pk->ext_registry);
66
- pk->buffer_ref = MessagePack_Buffer_wrap(PACKER_BUFFER_(pk), self);
67
65
 
68
66
  return self;
69
67
  }
@@ -97,6 +95,9 @@ VALUE MessagePack_Packer_initialize(int argc, VALUE* argv, VALUE self)
97
95
 
98
96
  PACKER(self, pk);
99
97
 
98
+ msgpack_packer_ext_registry_init(&pk->ext_registry);
99
+ pk->buffer_ref = MessagePack_Buffer_wrap(PACKER_BUFFER_(pk), self);
100
+
100
101
  MessagePack_Buffer_set_options(PACKER_BUFFER_(pk), io, options);
101
102
 
102
103
  if(options != Qnil) {
@@ -59,24 +59,64 @@ static int msgpack_packer_ext_find_superclass(VALUE key, VALUE value, VALUE arg)
59
59
  return ST_CONTINUE;
60
60
  }
61
61
 
62
-
63
- static inline VALUE msgpack_packer_ext_registry_lookup(msgpack_packer_ext_registry_t* pkrg,
62
+ static inline VALUE msgpack_packer_ext_registry_fetch(msgpack_packer_ext_registry_t* pkrg,
64
63
  VALUE lookup_class, int* ext_type_result)
65
64
  {
65
+ // fetch lookup_class from hash, which is a hash to register classes
66
66
  VALUE type = rb_hash_lookup(pkrg->hash, lookup_class);
67
67
  if(type != Qnil) {
68
68
  *ext_type_result = FIX2INT(rb_ary_entry(type, 0));
69
69
  return rb_ary_entry(type, 1);
70
70
  }
71
71
 
72
+ // fetch lookup_class from cache, which stores results of searching ancestors from pkrg->hash
72
73
  VALUE type_inht = rb_hash_lookup(pkrg->cache, lookup_class);
73
74
  if(type_inht != Qnil) {
74
75
  *ext_type_result = FIX2INT(rb_ary_entry(type_inht, 0));
75
76
  return rb_ary_entry(type_inht, 1);
76
77
  }
77
78
 
79
+ return Qnil;
80
+ }
81
+
82
+ static inline VALUE msgpack_packer_ext_registry_lookup(msgpack_packer_ext_registry_t* pkrg,
83
+ VALUE instance, int* ext_type_result)
84
+ {
85
+ VALUE lookup_class;
86
+ VALUE type;
87
+
88
+ /*
89
+ * 1. check whether singleton_class of this instance is registered (or resolved in past) or not.
90
+ *
91
+ * Objects of type Integer (Fixnum, Bignum), Float, Symbol and frozen
92
+ * String have no singleton class and raise a TypeError when trying to get
93
+ * it. See implementation of #singleton_class in ruby's source code:
94
+ * VALUE rb_singleton_class(VALUE obj);
95
+ *
96
+ * Since all but symbols are already filtered out when reaching this code
97
+ * only symbols are checked here.
98
+ */
99
+ if (!SYMBOL_P(instance)) {
100
+ lookup_class = rb_singleton_class(instance);
101
+
102
+ type = msgpack_packer_ext_registry_fetch(pkrg, lookup_class, ext_type_result);
103
+
104
+ if(type != Qnil) {
105
+ return type;
106
+ }
107
+ }
108
+
109
+ /*
110
+ * 2. check the class of instance is registered (or resolved in past) or not.
111
+ */
112
+ type = msgpack_packer_ext_registry_fetch(pkrg, rb_obj_class(instance), ext_type_result);
113
+
114
+ if(type != Qnil) {
115
+ return type;
116
+ }
117
+
78
118
  /*
79
- * check all keys whether it is an ancestor of lookup_class, or not
119
+ * 3. check all keys whether it is an ancestor of lookup_class, or not
80
120
  */
81
121
  VALUE args[2];
82
122
  args[0] = lookup_class;
@@ -58,14 +58,10 @@ static void Unpacker_mark(msgpack_unpacker_t* uk)
58
58
 
59
59
  VALUE MessagePack_Unpacker_alloc(VALUE klass)
60
60
  {
61
- msgpack_unpacker_t* uk = ALLOC_N(msgpack_unpacker_t, 1);
61
+ msgpack_unpacker_t* uk = ZALLOC_N(msgpack_unpacker_t, 1);
62
62
  _msgpack_unpacker_init(uk);
63
63
 
64
64
  VALUE self = Data_Wrap_Struct(klass, Unpacker_mark, Unpacker_free, uk);
65
-
66
- msgpack_unpacker_ext_registry_init(&uk->ext_registry);
67
- uk->buffer_ref = MessagePack_Buffer_wrap(UNPACKER_BUFFER_(uk), self);
68
-
69
65
  return self;
70
66
  }
71
67
 
@@ -101,6 +97,9 @@ VALUE MessagePack_Unpacker_initialize(int argc, VALUE* argv, VALUE self)
101
97
 
102
98
  UNPACKER(self, uk);
103
99
 
100
+ msgpack_unpacker_ext_registry_init(&uk->ext_registry);
101
+ uk->buffer_ref = MessagePack_Buffer_wrap(UNPACKER_BUFFER_(uk), self);
102
+
104
103
  MessagePack_Buffer_set_options(UNPACKER_BUFFER_(uk), io, options);
105
104
 
106
105
  if(options != Qnil) {
@@ -1,3 +1,3 @@
1
1
  module MessagePack
2
- VERSION = "1.2.0"
2
+ VERSION = "1.2.2"
3
3
  end
@@ -331,6 +331,19 @@ describe MessagePack::Factory do
331
331
  end
332
332
  end
333
333
 
334
+ describe 'under stressful GC' do
335
+ it 'works well' do
336
+ begin
337
+ GC.stress = true
338
+
339
+ f = MessagePack::Factory.new
340
+ f.register_type(0x0a, Symbol)
341
+ ensure
342
+ GC.stress = false
343
+ end
344
+ end
345
+ end
346
+
334
347
  describe 'DefaultFactory' do
335
348
  it 'is a factory' do
336
349
  MessagePack::DefaultFactory.should be_kind_of(MessagePack::Factory)
@@ -372,6 +372,50 @@ describe MessagePack::Packer do
372
372
  end
373
373
  end
374
374
 
375
+ context 'when it and its super class has an ext type' do
376
+ before { stub_const('Value', Class.new) }
377
+ before do
378
+ Value.class_eval do
379
+ def to_msgpack_ext
380
+ 'value_msgpacked'
381
+ end
382
+ end
383
+ end
384
+ before { packer.register_type(0x01, Value, :to_msgpack_ext) }
385
+
386
+ context "when it is a child class" do
387
+ before { stub_const('InheritedValue', Class.new(Value)) }
388
+ before do
389
+ InheritedValue.class_eval do
390
+ def to_msgpack_ext
391
+ 'inherited_value_msgpacked'
392
+ end
393
+ end
394
+ end
395
+
396
+ before { packer.register_type(0x02, InheritedValue, :to_msgpack_ext) }
397
+ subject { packer.pack(InheritedValue.new).to_s }
398
+
399
+ it { is_expected.to eq "\xC7\x19\x02inherited_value_msgpacked" }
400
+ end
401
+
402
+ context "even when it is a child class" do
403
+ before { stub_const('InheritedValue', Class.new(Value)) }
404
+ before do
405
+ InheritedValue.class_eval do
406
+ def to_msgpack_ext
407
+ 'inherited_value_msgpacked'
408
+ end
409
+ end
410
+ end
411
+
412
+ before { packer.register_type(0x02, InheritedValue, :to_msgpack_ext) }
413
+ subject { packer.pack(Value.new).to_s }
414
+
415
+ it { is_expected.to eq "\xC7\x0F\x01value_msgpacked" }
416
+ end
417
+ end
418
+
375
419
  context 'when it has no ext type but an included module has' do
376
420
  subject { packer.pack(Value.new).to_s }
377
421
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: msgpack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-12-07 00:00:00.000000000 Z
13
+ date: 2018-01-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -239,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
239
239
  version: '0'
240
240
  requirements: []
241
241
  rubyforge_project: msgpack
242
- rubygems_version: 2.6.13
242
+ rubygems_version: 2.7.3
243
243
  signing_key:
244
244
  specification_version: 4
245
245
  summary: MessagePack, a binary-based efficient data interchange format.