msgpack 1.2.0-x86-mingw32 → 1.2.2-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/.travis.yml +19 -22
- data/ChangeLog +9 -0
- data/ext/java/org/msgpack/jruby/Encoder.java +1 -1
- data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +38 -9
- data/ext/msgpack/buffer_class.c +1 -1
- data/ext/msgpack/compat.h +10 -0
- data/ext/msgpack/factory_class.c +4 -4
- data/ext/msgpack/packer.c +1 -19
- data/ext/msgpack/packer_class.c +4 -3
- data/ext/msgpack/packer_ext_registry.h +43 -3
- data/ext/msgpack/unpacker_class.c +4 -5
- data/lib/msgpack/version.rb +1 -1
- data/spec/factory_spec.rb +13 -0
- data/spec/packer_spec.rb +44 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff565d69a17eb604c162b7bfbda56a6438180286
|
4
|
+
data.tar.gz: c6f4e68cbfaeadde530e6be0a4f88256f40b9c81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a5b1b049fa6ec1c26104ea9f4e134d66adf46d4dfcef59ad74c185cb86f7d88eadbbfdf84fad292582a8dcf1d44098ea153199ca8ad920a3bf20cc912d77713
|
7
|
+
data.tar.gz: 89b66dbdd97210ba64a621e8dc2984af963789cd3a08e85d45c32a9604786e7c35f54c2966fd3aa4520b4791d90713b6d68455736aa834b4d43e6983fac646fa
|
data/.travis.yml
CHANGED
@@ -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
|
-
|
29
|
-
- rvm: 2.
|
30
|
-
os:
|
31
|
-
- rvm:
|
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:
|
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:
|
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.
|
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[]
|
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) {
|
data/ext/msgpack/buffer_class.c
CHANGED
@@ -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 =
|
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);
|
data/ext/msgpack/compat.h
CHANGED
@@ -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
|
*/
|
data/ext/msgpack/factory_class.c
CHANGED
@@ -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 =
|
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) {
|
data/ext/msgpack/packer.c
CHANGED
@@ -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
|
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);
|
data/ext/msgpack/packer_class.c
CHANGED
@@ -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 =
|
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 =
|
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) {
|
data/lib/msgpack/version.rb
CHANGED
data/spec/factory_spec.rb
CHANGED
@@ -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)
|
data/spec/packer_spec.rb
CHANGED
@@ -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.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: x86-mingw32
|
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:
|
13
|
+
date: 2018-01-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -246,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
246
246
|
version: '0'
|
247
247
|
requirements: []
|
248
248
|
rubyforge_project: msgpack
|
249
|
-
rubygems_version: 2.6.
|
249
|
+
rubygems_version: 2.6.14
|
250
250
|
signing_key:
|
251
251
|
specification_version: 4
|
252
252
|
summary: MessagePack, a binary-based efficient data interchange format.
|