msgpack 1.5.6 → 1.8.0
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 +50 -0
- data/README.md +48 -12
- 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 +69 -56
- data/ext/msgpack/buffer.h +138 -44
- data/ext/msgpack/buffer_class.c +132 -31
- data/ext/msgpack/buffer_class.h +1 -0
- data/ext/msgpack/extconf.rb +20 -30
- data/ext/msgpack/factory_class.c +75 -86
- data/ext/msgpack/packer.c +13 -16
- data/ext/msgpack/packer.h +24 -21
- data/ext/msgpack/packer_class.c +72 -98
- data/ext/msgpack/packer_class.h +11 -0
- 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/sysdep.h +5 -2
- data/ext/msgpack/unpacker.c +201 -113
- data/ext/msgpack/unpacker.h +22 -15
- data/ext/msgpack/unpacker_class.c +87 -92
- data/ext/msgpack/unpacker_class.h +11 -0
- 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 +8 -3
- metadata +21 -51
- 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/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 -575
- 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 -688
- 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 -71
- data/spec/timestamp_spec.rb +0 -159
- data/spec/unpack_spec.rb +0 -57
- data/spec/unpacker_spec.rb +0 -859
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: efdb772bf54b74587a6c99e9513f9c16c78bbef3e5e3c17064a4be79fd5adb7a
|
4
|
+
data.tar.gz: d2f74cb1115947f5337cd730b6283fac61ceeed3a9457597cc90155b3dc93d7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92da2466eac162f0d6d319496d7af3dbbef0d76b77c3aefb4787213e3b957464603859101ae28ac9620be82feb29278b2ed601adf2fd9d9811b364c258061d4b
|
7
|
+
data.tar.gz: a469586178eb44bbd50abf4cb34684f6a3fd4038063a80d9b3bf7f5cb9e6a2b34c1fed853be669f0bfb356d618efff3a2eaa51b86dd34d5427787a05453b8e11
|
data/ChangeLog
CHANGED
@@ -1,3 +1,53 @@
|
|
1
|
+
2025-02-06 1.8.0
|
2
|
+
|
3
|
+
* Numerous small optimizations.
|
4
|
+
* Added `key_cache` option to `Unpacker`.
|
5
|
+
|
6
|
+
2024-11-11 1.7.5
|
7
|
+
|
8
|
+
* Rerelease 1.7.4 with fixed java package.
|
9
|
+
|
10
|
+
2024-11-11 1.7.4
|
11
|
+
|
12
|
+
* Fixed a potental memory leak when recursive unpacker raise.
|
13
|
+
|
14
|
+
2024-10-03 1.7.3
|
15
|
+
|
16
|
+
* Limit initial containers pre-allocation to `SHRT_MAX` (32k) entries.
|
17
|
+
|
18
|
+
2023-07-18 1.7.2:
|
19
|
+
|
20
|
+
* Fix a potential GC bug when packing data using recursive extensions and buffers containing over 512KkiB of data (See #341).
|
21
|
+
* Fix a regression where feeding an empty string to an Unpacker would be considered like the end of the buffer.
|
22
|
+
|
23
|
+
2023-05-19 1.7.1:
|
24
|
+
|
25
|
+
* Fix JRuby 9.4 compatibility.
|
26
|
+
* Fix compilation on older compilers (gcc 4.x).
|
27
|
+
* Fix an infinite recursion issue when registering a Symbol type with a `nil` packer.
|
28
|
+
|
29
|
+
2023-03-29 1.7.0:
|
30
|
+
|
31
|
+
* Fix a possible double-free issue when GC triggers inside `_msgpack_rmem_alloc2`.
|
32
|
+
* `Unpacker#feed` now always directly read in provided strings instead of copying content in its buffer.
|
33
|
+
* `Unpacker#feed` is now an alias of `Unpacker#feed_reference`.
|
34
|
+
* Implement `Factory::Pool#unpacker` and `Factory::Pool#packer` to allow for more precise serialization.
|
35
|
+
* Require Ruby 2.5+.
|
36
|
+
|
37
|
+
2023-03-03 1.6.1:
|
38
|
+
|
39
|
+
* Undefine `#clone` and `#dup` on `MessagePack::Buffer`, `MessagePack::Packer` and `MessagePack::Unpacker`.
|
40
|
+
These methods were never intended, and using them could cause leaks or crashes or worse.
|
41
|
+
* Fix a possible GC crash when GC trigger inside `MessagePack::Buffer.new` (#314).
|
42
|
+
|
43
|
+
2022-09-30 1.6.0:
|
44
|
+
|
45
|
+
* Fix a potential use-after-free bug in Buffer_free when accessing a packer or unpacker buffer.
|
46
|
+
* `old-style-definition` compilation warnings.
|
47
|
+
* Restore zero-copy buffer feed when provided a Ruby string. This was accidentally broken in 1.5.4.
|
48
|
+
* Provide implementations for `ObjectSpace.memsize`. Message pack objects now properly report their size to Ruby.
|
49
|
+
* Fix an endianess bug on Windows platform.
|
50
|
+
|
1
51
|
2022-08-23 1.5.6:
|
2
52
|
|
3
53
|
* No actual code change, just re-release the `java` version properly.
|
data/README.md
CHANGED
@@ -8,15 +8,24 @@ and typical short strings only require an extra byte in addition to the strings
|
|
8
8
|
If you ever wished to use JSON for convenience (storing an image with metadata) but could
|
9
9
|
not for technical reasons (binary data, size, speed...), MessagePack is a perfect replacement.
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
```ruby
|
12
|
+
require 'msgpack'
|
13
|
+
msg = [1,2,3].to_msgpack #=> "\x93\x01\x02\x03"
|
14
|
+
MessagePack.unpack(msg) #=> [1,2,3]
|
15
|
+
```
|
16
|
+
|
17
|
+
Add msgpack to your Gemfile to install with Bundler:
|
14
18
|
|
15
|
-
|
19
|
+
```ruby
|
20
|
+
# Gemfile
|
21
|
+
gem 'msgpack'
|
22
|
+
```
|
23
|
+
|
24
|
+
Or, use RubyGems to install:
|
16
25
|
|
17
26
|
gem install msgpack
|
18
27
|
|
19
|
-
|
28
|
+
Or, build msgpack-ruby and install from a checked-out msgpack-ruby repository:
|
20
29
|
|
21
30
|
bundle
|
22
31
|
rake
|
@@ -27,11 +36,11 @@ or build msgpack-ruby and install:
|
|
27
36
|
|
28
37
|
* Create REST API returing MessagePack using Rails + [RABL](https://github.com/nesquena/rabl)
|
29
38
|
* Store objects efficiently serialized by msgpack on memcached or Redis
|
30
|
-
* In fact Redis supports msgpack in [EVAL-scripts](
|
39
|
+
* In fact Redis supports msgpack in [EVAL-scripts](https://redis.io/docs/latest/commands/eval/)
|
31
40
|
* Upload data in efficient format from mobile devices such as smartphones
|
32
41
|
* MessagePack works on iPhone/iPad and Android. See also [Objective-C](https://github.com/msgpack/msgpack-objectivec) and [Java](https://github.com/msgpack/msgpack-java) implementations
|
33
42
|
* Design a portable protocol to communicate with embedded devices
|
34
|
-
* Check also [Fluentd](
|
43
|
+
* Check also [Fluentd](https://www.fluentd.org) which is a log collector which uses msgpack for the log format (they say it uses JSON but actually it's msgpack, which is compatible with JSON)
|
35
44
|
* Exchange objects between software components written in different languages
|
36
45
|
* You'll need a flexible but efficient format so that components exchange objects while keeping compatibility
|
37
46
|
|
@@ -128,9 +137,9 @@ being serialized altogether by throwing an exception:
|
|
128
137
|
|
129
138
|
```ruby
|
130
139
|
class Symbol
|
131
|
-
|
132
|
-
|
133
|
-
|
140
|
+
def to_msgpack_ext
|
141
|
+
raise "Serialization of symbols prohibited"
|
142
|
+
end
|
134
143
|
end
|
135
144
|
|
136
145
|
MessagePack::DefaultFactory.register_type(0x00, Symbol)
|
@@ -211,6 +220,33 @@ factory.register_type(
|
|
211
220
|
factory.load(factory.dump(Point.new(12, 34))) # => #<struct Point x=12, y=34>
|
212
221
|
```
|
213
222
|
|
223
|
+
## Pooling
|
224
|
+
|
225
|
+
Creating `Packer` and `Unpacker` objects is expensive. For best performance it is preferable to re-use these objects.
|
226
|
+
|
227
|
+
`MessagePack::Factory#pool` makes that easier:
|
228
|
+
|
229
|
+
```ruby
|
230
|
+
factory = MessagePack::Factory.new
|
231
|
+
factory.register_type(
|
232
|
+
0x01,
|
233
|
+
Point,
|
234
|
+
packer: ->(point, packer) {
|
235
|
+
packer.write(point.x)
|
236
|
+
packer.write(point.y)
|
237
|
+
},
|
238
|
+
unpacker: ->(unpacker) {
|
239
|
+
x = unpacker.read
|
240
|
+
y = unpacker.read
|
241
|
+
Point.new(x, y)
|
242
|
+
},
|
243
|
+
recursive: true,
|
244
|
+
)
|
245
|
+
pool = factory.pool(5) # The pool size should match the number of threads expected to use the factory concurrently.
|
246
|
+
|
247
|
+
pool.load(pool.dump(Point.new(12, 34))) # => #<struct Point x=12, y=34>
|
248
|
+
```
|
249
|
+
|
214
250
|
## Buffer API
|
215
251
|
|
216
252
|
MessagePack for Ruby provides a buffer API so that you can read or write data by hand, not via Packer or Unpacker API.
|
@@ -249,8 +285,8 @@ If this directory has Gemfile.lock (generated with MRI), remove it beforehand.
|
|
249
285
|
|
250
286
|
## Updating documents
|
251
287
|
|
252
|
-
Online
|
253
|
-
|
288
|
+
Online documentation (https://ruby.msgpack.org) is generated from the gh-pages branch.
|
289
|
+
To update documents in gh-pages branch:
|
254
290
|
|
255
291
|
bundle exec rake doc
|
256
292
|
git checkout gh-pages
|
@@ -22,10 +22,10 @@ import org.jcodings.Encoding;
|
|
22
22
|
@JRubyClass(name="MessagePack::Buffer")
|
23
23
|
public class Buffer extends RubyObject {
|
24
24
|
private static final long serialVersionUID = 8441244627425629412L;
|
25
|
-
private IRubyObject io;
|
26
|
-
private ByteBuffer buffer;
|
25
|
+
private transient IRubyObject io;
|
26
|
+
private transient ByteBuffer buffer;
|
27
27
|
private boolean writeMode;
|
28
|
-
private Encoding binaryEncoding;
|
28
|
+
private transient Encoding binaryEncoding;
|
29
29
|
|
30
30
|
private static final int CACHE_LINE_SIZE = 64;
|
31
31
|
private static final int ARRAY_HEADER_SIZE = 24;
|
@@ -18,22 +18,17 @@ public class ExtensionRegistry {
|
|
18
18
|
private final ExtensionEntry[] extensionsByTypeId;
|
19
19
|
|
20
20
|
public ExtensionRegistry() {
|
21
|
-
this(new HashMap<RubyModule, ExtensionEntry>());
|
21
|
+
this(new HashMap<RubyModule, ExtensionEntry>(), new ExtensionEntry[256]);
|
22
22
|
}
|
23
23
|
|
24
|
-
private ExtensionRegistry(Map<RubyModule, ExtensionEntry> extensionsByModule) {
|
24
|
+
private ExtensionRegistry(Map<RubyModule, ExtensionEntry> extensionsByModule, ExtensionEntry[] extensionsByTypeId) {
|
25
25
|
this.extensionsByModule = new HashMap<RubyModule, ExtensionEntry>(extensionsByModule);
|
26
26
|
this.extensionsByAncestor = new HashMap<RubyModule, ExtensionEntry>();
|
27
|
-
this.extensionsByTypeId =
|
28
|
-
for (ExtensionEntry entry : extensionsByModule.values()) {
|
29
|
-
if (entry.hasUnpacker()) {
|
30
|
-
extensionsByTypeId[entry.getTypeId() + 128] = entry;
|
31
|
-
}
|
32
|
-
}
|
27
|
+
this.extensionsByTypeId = extensionsByTypeId.clone();
|
33
28
|
}
|
34
29
|
|
35
30
|
public ExtensionRegistry dup() {
|
36
|
-
return new ExtensionRegistry(extensionsByModule);
|
31
|
+
return new ExtensionRegistry(extensionsByModule, extensionsByTypeId);
|
37
32
|
}
|
38
33
|
|
39
34
|
public IRubyObject toInternalPackerRegistry(ThreadContext ctx) {
|
@@ -59,8 +54,8 @@ public class ExtensionRegistry {
|
|
59
54
|
return hash;
|
60
55
|
}
|
61
56
|
|
62
|
-
public void put(RubyModule mod, int typeId, boolean recursive, IRubyObject packerProc, IRubyObject
|
63
|
-
ExtensionEntry entry = new ExtensionEntry(mod, typeId, recursive, packerProc,
|
57
|
+
public void put(RubyModule mod, int typeId, boolean recursive, IRubyObject packerProc, IRubyObject unpackerProc) {
|
58
|
+
ExtensionEntry entry = new ExtensionEntry(mod, typeId, recursive, packerProc, unpackerProc);
|
64
59
|
extensionsByModule.put(mod, entry);
|
65
60
|
extensionsByTypeId[typeId + 128] = entry;
|
66
61
|
extensionsByAncestor.clear();
|
@@ -119,18 +114,14 @@ public class ExtensionRegistry {
|
|
119
114
|
private final int typeId;
|
120
115
|
private final boolean recursive;
|
121
116
|
private final IRubyObject packerProc;
|
122
|
-
private final IRubyObject packerArg;
|
123
117
|
private final IRubyObject unpackerProc;
|
124
|
-
private final IRubyObject unpackerArg;
|
125
118
|
|
126
|
-
public ExtensionEntry(RubyModule mod, int typeId, boolean recursive, IRubyObject packerProc, IRubyObject
|
119
|
+
public ExtensionEntry(RubyModule mod, int typeId, boolean recursive, IRubyObject packerProc, IRubyObject unpackerProc) {
|
127
120
|
this.mod = mod;
|
128
121
|
this.typeId = typeId;
|
129
122
|
this.recursive = recursive;
|
130
123
|
this.packerProc = packerProc;
|
131
|
-
this.packerArg = packerArg;
|
132
124
|
this.unpackerProc = unpackerProc;
|
133
|
-
this.unpackerArg = unpackerArg;
|
134
125
|
}
|
135
126
|
|
136
127
|
public RubyModule getExtensionModule() {
|
@@ -146,11 +137,11 @@ public class ExtensionRegistry {
|
|
146
137
|
}
|
147
138
|
|
148
139
|
public boolean hasPacker() {
|
149
|
-
return packerProc != null;
|
140
|
+
return packerProc != null && !packerProc.isNil();
|
150
141
|
}
|
151
142
|
|
152
143
|
public boolean hasUnpacker() {
|
153
|
-
return unpackerProc != null;
|
144
|
+
return unpackerProc != null && !unpackerProc.isNil();
|
154
145
|
}
|
155
146
|
|
156
147
|
public IRubyObject getPackerProc() {
|
@@ -162,11 +153,11 @@ public class ExtensionRegistry {
|
|
162
153
|
}
|
163
154
|
|
164
155
|
public RubyArray<?> toPackerTuple(ThreadContext ctx) {
|
165
|
-
return ctx.runtime.newArray(new IRubyObject[] {ctx.runtime.newFixnum(typeId), packerProc
|
156
|
+
return ctx.runtime.newArray(new IRubyObject[] {ctx.runtime.newFixnum(typeId), packerProc});
|
166
157
|
}
|
167
158
|
|
168
159
|
public RubyArray<?> toUnpackerTuple(ThreadContext ctx) {
|
169
|
-
return ctx.runtime.newArray(new IRubyObject[] {mod, unpackerProc
|
160
|
+
return ctx.runtime.newArray(new IRubyObject[] {mod, unpackerProc});
|
170
161
|
}
|
171
162
|
|
172
163
|
public IRubyObject[] toPackerProcTypeIdPair(ThreadContext ctx) {
|
@@ -26,7 +26,7 @@ import static org.msgpack.jruby.Types.*;
|
|
26
26
|
@JRubyClass(name="MessagePack::ExtensionValue")
|
27
27
|
public class ExtensionValue extends RubyObject {
|
28
28
|
private static final long serialVersionUID = 8451274621449322492L;
|
29
|
-
private final Encoding binaryEncoding;
|
29
|
+
private transient final Encoding binaryEncoding;
|
30
30
|
|
31
31
|
private RubyFixnum type;
|
32
32
|
private RubyString payload;
|
@@ -26,8 +26,8 @@ import static org.jruby.runtime.Visibility.PRIVATE;
|
|
26
26
|
@JRubyClass(name="MessagePack::Factory")
|
27
27
|
public class Factory extends RubyObject {
|
28
28
|
private static final long serialVersionUID = 8441284623445322492L;
|
29
|
-
private final Ruby runtime;
|
30
|
-
private ExtensionRegistry extensionRegistry;
|
29
|
+
private transient final Ruby runtime;
|
30
|
+
private transient ExtensionRegistry extensionRegistry;
|
31
31
|
private boolean hasSymbolExtType;
|
32
32
|
private boolean hasBigIntExtType;
|
33
33
|
|
@@ -80,39 +80,15 @@ public class Factory extends RubyObject {
|
|
80
80
|
});
|
81
81
|
}
|
82
82
|
|
83
|
-
@JRubyMethod(name = "
|
84
|
-
public IRubyObject
|
85
|
-
|
86
|
-
IRubyObject type = args[0];
|
87
|
-
IRubyObject mod = args[1];
|
88
|
-
|
89
|
-
IRubyObject packerArg;
|
90
|
-
IRubyObject unpackerArg;
|
91
|
-
|
92
|
-
RubyHash options = null;
|
83
|
+
@JRubyMethod(name = "register_type_internal", required = 3, visibility = PRIVATE)
|
84
|
+
public IRubyObject registerTypeInternal(ThreadContext ctx, IRubyObject type, IRubyObject mod, IRubyObject opts) {
|
85
|
+
testFrozen("MessagePack::Factory");
|
93
86
|
|
94
|
-
|
95
|
-
|
96
|
-
}
|
87
|
+
Ruby runtime = ctx.runtime;
|
88
|
+
RubyHash options = (RubyHash) opts;
|
97
89
|
|
98
|
-
|
99
|
-
|
100
|
-
unpackerArg = runtime.newSymbol("from_msgpack_ext");
|
101
|
-
} else if (args.length == 3) {
|
102
|
-
if (args[args.length - 1] instanceof RubyHash) {
|
103
|
-
options = (RubyHash) args[args.length - 1];
|
104
|
-
packerArg = options.fastARef(runtime.newSymbol("packer"));
|
105
|
-
unpackerArg = options.fastARef(runtime.newSymbol("unpacker"));
|
106
|
-
IRubyObject optimizedSymbolsParsingArg = options.fastARef(runtime.newSymbol("optimized_symbols_parsing"));
|
107
|
-
if (optimizedSymbolsParsingArg != null && optimizedSymbolsParsingArg.isTrue()) {
|
108
|
-
throw runtime.newArgumentError("JRuby implementation does not support the optimized_symbols_parsing option");
|
109
|
-
}
|
110
|
-
} else {
|
111
|
-
throw runtime.newArgumentError(String.format("expected Hash but found %s.", args[args.length - 1].getType().getName()));
|
112
|
-
}
|
113
|
-
} else {
|
114
|
-
throw runtime.newArgumentError(String.format("wrong number of arguments (%d for 2..3)", 2 + args.length));
|
115
|
-
}
|
90
|
+
IRubyObject packerProc = options.fastARef(runtime.newSymbol("packer"));
|
91
|
+
IRubyObject unpackerProc = options.fastARef(runtime.newSymbol("unpacker"));
|
116
92
|
|
117
93
|
long typeId = ((RubyFixnum) type).getLongValue();
|
118
94
|
if (typeId < -128 || typeId > 127) {
|
@@ -124,21 +100,6 @@ public class Factory extends RubyObject {
|
|
124
100
|
}
|
125
101
|
RubyModule extModule = (RubyModule) mod;
|
126
102
|
|
127
|
-
IRubyObject packerProc = runtime.getNil();
|
128
|
-
IRubyObject unpackerProc = runtime.getNil();
|
129
|
-
if (packerArg != null) {
|
130
|
-
packerProc = packerArg.callMethod(ctx, "to_proc");
|
131
|
-
}
|
132
|
-
if (unpackerArg != null) {
|
133
|
-
if (unpackerArg instanceof RubyString || unpackerArg instanceof RubySymbol) {
|
134
|
-
unpackerProc = extModule.method(unpackerArg.callMethod(ctx, "to_sym"));
|
135
|
-
} else if (unpackerArg instanceof RubyProc || unpackerArg instanceof RubyMethod) {
|
136
|
-
unpackerProc = unpackerArg;
|
137
|
-
} else {
|
138
|
-
unpackerProc = unpackerArg.callMethod(ctx, "method", runtime.newSymbol("call"));
|
139
|
-
}
|
140
|
-
}
|
141
|
-
|
142
103
|
boolean recursive = false;
|
143
104
|
if (options != null) {
|
144
105
|
IRubyObject recursiveExtensionArg = options.fastARef(runtime.newSymbol("recursive"));
|
@@ -147,9 +108,9 @@ public class Factory extends RubyObject {
|
|
147
108
|
}
|
148
109
|
}
|
149
110
|
|
150
|
-
extensionRegistry.put(extModule, (int) typeId, recursive, packerProc,
|
111
|
+
extensionRegistry.put(extModule, (int) typeId, recursive, packerProc, unpackerProc);
|
151
112
|
|
152
|
-
if (extModule == runtime.getSymbol()) {
|
113
|
+
if (extModule == runtime.getSymbol() && !packerProc.isNil()) {
|
153
114
|
hasSymbolExtType = true;
|
154
115
|
}
|
155
116
|
|
@@ -28,12 +28,12 @@ import static org.jruby.runtime.Visibility.PRIVATE;
|
|
28
28
|
@JRubyClass(name="MessagePack::Packer")
|
29
29
|
public class Packer extends RubyObject {
|
30
30
|
private static final long serialVersionUID = 8451274621499362492L;
|
31
|
-
public ExtensionRegistry registry;
|
31
|
+
public transient ExtensionRegistry registry;
|
32
32
|
private Buffer buffer;
|
33
|
-
private Encoder encoder;
|
33
|
+
private transient Encoder encoder;
|
34
34
|
private boolean hasSymbolExtType;
|
35
35
|
private boolean hasBigintExtType;
|
36
|
-
private Encoding binaryEncoding;
|
36
|
+
private transient Encoding binaryEncoding;
|
37
37
|
|
38
38
|
public Packer(Ruby runtime, RubyClass type, ExtensionRegistry registry, boolean hasSymbolExtType, boolean hasBigintExtType) {
|
39
39
|
super(runtime, type);
|
@@ -93,26 +93,11 @@ public class Packer extends RubyObject {
|
|
93
93
|
return registry.toInternalPackerRegistry(ctx);
|
94
94
|
}
|
95
95
|
|
96
|
-
@JRubyMethod(name = "
|
97
|
-
public IRubyObject registerType(ThreadContext ctx, IRubyObject
|
96
|
+
@JRubyMethod(name = "register_type_internal", required = 3, visibility = PRIVATE)
|
97
|
+
public IRubyObject registerType(ThreadContext ctx, IRubyObject type, IRubyObject mod, IRubyObject proc) {
|
98
|
+
testFrozen("MessagePack::Packer");
|
99
|
+
|
98
100
|
Ruby runtime = ctx.runtime;
|
99
|
-
IRubyObject type = args[0];
|
100
|
-
IRubyObject mod = args[1];
|
101
|
-
|
102
|
-
IRubyObject arg;
|
103
|
-
IRubyObject proc;
|
104
|
-
if (args.length == 2) {
|
105
|
-
if (! block.isGiven()) {
|
106
|
-
throw runtime.newLocalJumpErrorNoBlock();
|
107
|
-
}
|
108
|
-
proc = block.getProcObject();
|
109
|
-
arg = proc;
|
110
|
-
} else if (args.length == 3) {
|
111
|
-
arg = args[2];
|
112
|
-
proc = arg.callMethod(ctx, "to_proc");
|
113
|
-
} else {
|
114
|
-
throw runtime.newArgumentError(String.format("wrong number of arguments (%d for 2..3)", 2 + args.length));
|
115
|
-
}
|
116
101
|
|
117
102
|
long typeId = ((RubyFixnum) type).getLongValue();
|
118
103
|
if (typeId < -128 || typeId > 127) {
|
@@ -124,9 +109,9 @@ public class Packer extends RubyObject {
|
|
124
109
|
}
|
125
110
|
RubyModule extModule = (RubyModule) mod;
|
126
111
|
|
127
|
-
registry.put(extModule, (int) typeId, false, proc,
|
112
|
+
registry.put(extModule, (int) typeId, false, proc, null);
|
128
113
|
|
129
|
-
if (extModule == runtime.getSymbol()) {
|
114
|
+
if (extModule == runtime.getSymbol() && !proc.isNil()) {
|
130
115
|
encoder.hasSymbolExtType = true;
|
131
116
|
}
|
132
117
|
|
@@ -21,18 +21,17 @@ import org.jruby.runtime.ThreadContext;
|
|
21
21
|
import org.jruby.anno.JRubyClass;
|
22
22
|
import org.jruby.anno.JRubyMethod;
|
23
23
|
import org.jruby.util.ByteList;
|
24
|
-
import org.jruby.ext.stringio.StringIO;
|
25
24
|
|
26
25
|
import static org.jruby.runtime.Visibility.PRIVATE;
|
27
26
|
|
28
27
|
@JRubyClass(name="MessagePack::Unpacker")
|
29
28
|
public class Unpacker extends RubyObject {
|
30
29
|
private static final long serialVersionUID = 8451264671199362492L;
|
31
|
-
private final ExtensionRegistry registry;
|
30
|
+
private transient final ExtensionRegistry registry;
|
32
31
|
|
33
|
-
private IRubyObject stream;
|
34
|
-
private IRubyObject data;
|
35
|
-
private Decoder decoder;
|
32
|
+
private transient IRubyObject stream;
|
33
|
+
private transient IRubyObject data;
|
34
|
+
private transient Decoder decoder;
|
36
35
|
private final RubyClass underflowErrorClass;
|
37
36
|
private boolean symbolizeKeys;
|
38
37
|
private boolean freeze;
|
@@ -127,37 +126,23 @@ public class Unpacker extends RubyObject {
|
|
127
126
|
return registry.toInternalUnpackerRegistry(ctx);
|
128
127
|
}
|
129
128
|
|
130
|
-
@JRubyMethod(name = "
|
131
|
-
public IRubyObject
|
129
|
+
@JRubyMethod(name = "register_type_internal", required = 3, visibility = PRIVATE)
|
130
|
+
public IRubyObject registerTypeInternal(ThreadContext ctx, IRubyObject type, IRubyObject mod, IRubyObject proc) {
|
131
|
+
testFrozen("MessagePack::Unpacker");
|
132
|
+
|
132
133
|
Ruby runtime = ctx.runtime;
|
133
|
-
IRubyObject type = args[0];
|
134
|
-
|
135
|
-
RubyModule extModule;
|
136
|
-
IRubyObject arg;
|
137
|
-
IRubyObject proc;
|
138
|
-
if (args.length == 1) {
|
139
|
-
if (! block.isGiven()) {
|
140
|
-
throw runtime.newLocalJumpErrorNoBlock();
|
141
|
-
}
|
142
|
-
proc = RubyProc.newProc(runtime, block, block.type);
|
143
|
-
if (proc == null)
|
144
|
-
System.err.println("proc from Block is null");
|
145
|
-
arg = proc;
|
146
|
-
extModule = null;
|
147
|
-
} else if (args.length == 3) {
|
148
|
-
extModule = (RubyModule) args[1];
|
149
|
-
arg = args[2];
|
150
|
-
proc = extModule.method(arg);
|
151
|
-
} else {
|
152
|
-
throw runtime.newArgumentError(String.format("wrong number of arguments (%d for 1 or 3)", 2 + args.length));
|
153
|
-
}
|
154
134
|
|
155
135
|
long typeId = ((RubyFixnum) type).getLongValue();
|
156
136
|
if (typeId < -128 || typeId > 127) {
|
157
137
|
throw runtime.newRangeError(String.format("integer %d too big to convert to `signed char'", typeId));
|
158
138
|
}
|
159
139
|
|
160
|
-
|
140
|
+
RubyModule extModule = null;
|
141
|
+
if (mod != runtime.getNil()) {
|
142
|
+
extModule = (RubyModule)mod;
|
143
|
+
}
|
144
|
+
|
145
|
+
registry.put(extModule, (int) typeId, false, null, proc);
|
161
146
|
return runtime.getNil();
|
162
147
|
}
|
163
148
|
|
@@ -331,9 +316,7 @@ public class Unpacker extends RubyObject {
|
|
331
316
|
@JRubyMethod(name = "stream=", required = 1)
|
332
317
|
public IRubyObject setStream(ThreadContext ctx, IRubyObject stream) {
|
333
318
|
RubyString str;
|
334
|
-
if (stream instanceof
|
335
|
-
str = stream.callMethod(ctx, "string").asString();
|
336
|
-
} else if (stream instanceof RubyIO) {
|
319
|
+
if (stream instanceof RubyIO) {
|
337
320
|
str = stream.callMethod(ctx, "read").asString();
|
338
321
|
} else if (stream.respondsTo("read")) {
|
339
322
|
str = stream.callMethod(ctx, "read").asString();
|