msgpack 1.3.3 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yaml +57 -0
- data/.rubocop.yml +2 -2
- data/ChangeLog +74 -0
- data/Gemfile +1 -1
- data/README.md +266 -0
- data/Rakefile +1 -9
- data/bench/bench.rb +78 -0
- data/bin/console +8 -0
- data/doclib/msgpack/factory.rb +47 -3
- data/doclib/msgpack/packer.rb +5 -4
- data/doclib/msgpack/unpacker.rb +2 -2
- data/ext/java/org/msgpack/jruby/Buffer.java +23 -16
- data/ext/java/org/msgpack/jruby/Decoder.java +46 -23
- data/ext/java/org/msgpack/jruby/Encoder.java +68 -30
- data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +37 -49
- data/ext/java/org/msgpack/jruby/ExtensionValue.java +5 -8
- data/ext/java/org/msgpack/jruby/Factory.java +47 -7
- data/ext/java/org/msgpack/jruby/Packer.java +29 -17
- data/ext/java/org/msgpack/jruby/Unpacker.java +72 -37
- data/ext/msgpack/buffer.c +42 -68
- data/ext/msgpack/buffer.h +59 -14
- data/ext/msgpack/buffer_class.c +90 -52
- data/ext/msgpack/compat.h +1 -111
- data/ext/msgpack/extconf.rb +45 -19
- data/ext/msgpack/factory_class.c +133 -43
- data/ext/msgpack/packer.c +60 -36
- data/ext/msgpack/packer.h +27 -25
- data/ext/msgpack/packer_class.c +84 -77
- data/ext/msgpack/packer_class.h +11 -0
- data/ext/msgpack/packer_ext_registry.c +24 -32
- data/ext/msgpack/packer_ext_registry.h +40 -33
- data/ext/msgpack/sysdep.h +5 -2
- data/ext/msgpack/unpacker.c +132 -115
- data/ext/msgpack/unpacker.h +23 -10
- data/ext/msgpack/unpacker_class.c +83 -78
- data/ext/msgpack/unpacker_class.h +11 -0
- data/ext/msgpack/unpacker_ext_registry.c +42 -18
- data/ext/msgpack/unpacker_ext_registry.h +23 -16
- data/lib/msgpack/bigint.rb +69 -0
- data/lib/msgpack/factory.rb +103 -0
- data/lib/msgpack/symbol.rb +21 -4
- data/lib/msgpack/time.rb +1 -1
- data/lib/msgpack/version.rb +4 -8
- data/lib/msgpack.rb +6 -12
- data/msgpack.gemspec +4 -6
- data/spec/bigint_spec.rb +26 -0
- data/spec/cruby/buffer_spec.rb +17 -0
- data/spec/factory_spec.rb +351 -12
- data/spec/msgpack_spec.rb +1 -1
- data/spec/packer_spec.rb +18 -0
- data/spec/spec_helper.rb +37 -3
- data/spec/timestamp_spec.rb +38 -0
- data/spec/unpacker_spec.rb +157 -4
- metadata +31 -61
- data/.travis.yml +0 -43
- data/README.rdoc +0 -225
- data/bench/pack.rb +0 -23
- data/bench/pack_log.rb +0 -33
- data/bench/pack_log_long.rb +0 -65
- data/bench/pack_symbols.rb +0 -28
- data/bench/run.sh +0 -14
- data/bench/run_long.sh +0 -35
- data/bench/run_symbols.sh +0 -26
- data/bench/unpack.rb +0 -21
- data/bench/unpack_log.rb +0 -34
- data/bench/unpack_log_long.rb +0 -67
@@ -12,6 +12,8 @@ import org.jruby.RubyInteger;
|
|
12
12
|
import org.jruby.RubyFixnum;
|
13
13
|
import org.jruby.RubyString;
|
14
14
|
import org.jruby.RubySymbol;
|
15
|
+
import org.jruby.RubyProc;
|
16
|
+
import org.jruby.RubyMethod;
|
15
17
|
import org.jruby.runtime.builtin.IRubyObject;
|
16
18
|
import org.jruby.anno.JRubyClass;
|
17
19
|
import org.jruby.anno.JRubyMethod;
|
@@ -23,15 +25,18 @@ import static org.jruby.runtime.Visibility.PRIVATE;
|
|
23
25
|
|
24
26
|
@JRubyClass(name="MessagePack::Factory")
|
25
27
|
public class Factory extends RubyObject {
|
28
|
+
private static final long serialVersionUID = 8441284623445322492L;
|
26
29
|
private final Ruby runtime;
|
27
|
-
private
|
30
|
+
private ExtensionRegistry extensionRegistry;
|
28
31
|
private boolean hasSymbolExtType;
|
32
|
+
private boolean hasBigIntExtType;
|
29
33
|
|
30
34
|
public Factory(Ruby runtime, RubyClass type) {
|
31
35
|
super(runtime, type);
|
32
36
|
this.runtime = runtime;
|
33
37
|
this.extensionRegistry = new ExtensionRegistry();
|
34
38
|
this.hasSymbolExtType = false;
|
39
|
+
this.hasBigIntExtType = false;
|
35
40
|
}
|
36
41
|
|
37
42
|
static class FactoryAllocator implements ObjectAllocator {
|
@@ -49,9 +54,17 @@ public class Factory extends RubyObject {
|
|
49
54
|
return this;
|
50
55
|
}
|
51
56
|
|
52
|
-
@JRubyMethod(name = "
|
57
|
+
@JRubyMethod(name = "dup")
|
58
|
+
public IRubyObject dup() {
|
59
|
+
Factory clone = (Factory)super.dup();
|
60
|
+
clone.extensionRegistry = extensionRegistry();
|
61
|
+
clone.hasSymbolExtType = hasSymbolExtType;
|
62
|
+
return clone;
|
63
|
+
}
|
64
|
+
|
65
|
+
@JRubyMethod(name = "packer", optional = 2)
|
53
66
|
public Packer packer(ThreadContext ctx, IRubyObject[] args) {
|
54
|
-
return Packer.newPacker(ctx, extensionRegistry(), hasSymbolExtType, args);
|
67
|
+
return Packer.newPacker(ctx, extensionRegistry(), hasSymbolExtType, hasBigIntExtType, args);
|
55
68
|
}
|
56
69
|
|
57
70
|
@JRubyMethod(name = "unpacker", optional = 2)
|
@@ -61,7 +74,7 @@ public class Factory extends RubyObject {
|
|
61
74
|
|
62
75
|
@JRubyMethod(name = "registered_types_internal", visibility = PRIVATE)
|
63
76
|
public IRubyObject registeredTypesInternal(ThreadContext ctx) {
|
64
|
-
return RubyArray.newArray(ctx.
|
77
|
+
return RubyArray.newArray(ctx.runtime, new IRubyObject[] {
|
65
78
|
extensionRegistry.toInternalPackerRegistry(ctx),
|
66
79
|
extensionRegistry.toInternalUnpackerRegistry(ctx)
|
67
80
|
});
|
@@ -69,13 +82,15 @@ public class Factory extends RubyObject {
|
|
69
82
|
|
70
83
|
@JRubyMethod(name = "register_type", required = 2, optional = 1)
|
71
84
|
public IRubyObject registerType(ThreadContext ctx, IRubyObject[] args) {
|
72
|
-
Ruby runtime = ctx.
|
85
|
+
Ruby runtime = ctx.runtime;
|
73
86
|
IRubyObject type = args[0];
|
74
87
|
IRubyObject mod = args[1];
|
75
88
|
|
76
89
|
IRubyObject packerArg;
|
77
90
|
IRubyObject unpackerArg;
|
78
91
|
|
92
|
+
RubyHash options = null;
|
93
|
+
|
79
94
|
if (isFrozen()) {
|
80
95
|
throw runtime.newRuntimeError("can't modify frozen Factory");
|
81
96
|
}
|
@@ -85,9 +100,13 @@ public class Factory extends RubyObject {
|
|
85
100
|
unpackerArg = runtime.newSymbol("from_msgpack_ext");
|
86
101
|
} else if (args.length == 3) {
|
87
102
|
if (args[args.length - 1] instanceof RubyHash) {
|
88
|
-
|
103
|
+
options = (RubyHash) args[args.length - 1];
|
89
104
|
packerArg = options.fastARef(runtime.newSymbol("packer"));
|
90
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
|
+
}
|
91
110
|
} else {
|
92
111
|
throw runtime.newArgumentError(String.format("expected Hash but found %s.", args[args.length - 1].getType().getName()));
|
93
112
|
}
|
@@ -113,17 +132,38 @@ public class Factory extends RubyObject {
|
|
113
132
|
if (unpackerArg != null) {
|
114
133
|
if (unpackerArg instanceof RubyString || unpackerArg instanceof RubySymbol) {
|
115
134
|
unpackerProc = extModule.method(unpackerArg.callMethod(ctx, "to_sym"));
|
135
|
+
} else if (unpackerArg instanceof RubyProc || unpackerArg instanceof RubyMethod) {
|
136
|
+
unpackerProc = unpackerArg;
|
116
137
|
} else {
|
117
138
|
unpackerProc = unpackerArg.callMethod(ctx, "method", runtime.newSymbol("call"));
|
118
139
|
}
|
119
140
|
}
|
120
141
|
|
121
|
-
|
142
|
+
boolean recursive = false;
|
143
|
+
if (options != null) {
|
144
|
+
IRubyObject recursiveExtensionArg = options.fastARef(runtime.newSymbol("recursive"));
|
145
|
+
if (recursiveExtensionArg != null && recursiveExtensionArg.isTrue()) {
|
146
|
+
recursive = true;
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
extensionRegistry.put(extModule, (int) typeId, recursive, packerProc, packerArg, unpackerProc, unpackerArg);
|
122
151
|
|
123
152
|
if (extModule == runtime.getSymbol()) {
|
124
153
|
hasSymbolExtType = true;
|
125
154
|
}
|
126
155
|
|
156
|
+
if (options != null) {
|
157
|
+
IRubyObject oversizedIntegerExtensionArg = options.fastARef(runtime.newSymbol("oversized_integer_extension"));
|
158
|
+
if (oversizedIntegerExtensionArg != null && oversizedIntegerExtensionArg.isTrue()) {
|
159
|
+
if (extModule == runtime.getModule("Integer")) {
|
160
|
+
hasBigIntExtType = true;
|
161
|
+
} else {
|
162
|
+
throw runtime.newArgumentError("oversized_integer_extension: true is only for Integer class");
|
163
|
+
}
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
127
167
|
return runtime.getNil();
|
128
168
|
}
|
129
169
|
}
|
@@ -27,53 +27,65 @@ import static org.jruby.runtime.Visibility.PRIVATE;
|
|
27
27
|
|
28
28
|
@JRubyClass(name="MessagePack::Packer")
|
29
29
|
public class Packer extends RubyObject {
|
30
|
+
private static final long serialVersionUID = 8451274621499362492L;
|
30
31
|
public ExtensionRegistry registry;
|
31
32
|
private Buffer buffer;
|
32
33
|
private Encoder encoder;
|
33
34
|
private boolean hasSymbolExtType;
|
35
|
+
private boolean hasBigintExtType;
|
34
36
|
private Encoding binaryEncoding;
|
35
37
|
|
36
|
-
public Packer(Ruby runtime, RubyClass type, ExtensionRegistry registry, boolean hasSymbolExtType) {
|
38
|
+
public Packer(Ruby runtime, RubyClass type, ExtensionRegistry registry, boolean hasSymbolExtType, boolean hasBigintExtType) {
|
37
39
|
super(runtime, type);
|
38
40
|
this.registry = registry;
|
39
41
|
this.hasSymbolExtType = hasSymbolExtType;
|
42
|
+
this.hasBigintExtType = hasBigintExtType;
|
40
43
|
}
|
41
44
|
|
42
45
|
static class PackerAllocator implements ObjectAllocator {
|
43
46
|
public IRubyObject allocate(Ruby runtime, RubyClass type) {
|
44
|
-
return new Packer(runtime, type, null, false);
|
47
|
+
return new Packer(runtime, type, null, false, false);
|
45
48
|
}
|
46
49
|
}
|
47
50
|
|
48
51
|
@JRubyMethod(name = "initialize", optional = 2)
|
49
52
|
public IRubyObject initialize(ThreadContext ctx, IRubyObject[] args) {
|
50
53
|
boolean compatibilityMode = false;
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
54
|
+
Ruby runtime = ctx.runtime;
|
55
|
+
if (args.length > 0) {
|
56
|
+
RubyHash options = null;
|
57
|
+
if (args[args.length - 1] instanceof RubyHash) {
|
58
|
+
options = (RubyHash) args[args.length - 1];
|
59
|
+
} else if (args.length > 1 && args[args.length - 2] instanceof RubyHash) {
|
60
|
+
options = (RubyHash) args[args.length - 2];
|
61
|
+
}
|
62
|
+
|
63
|
+
if (options != null) {
|
64
|
+
IRubyObject mode = options.fastARef(runtime.newSymbol("compatibility_mode"));
|
65
|
+
compatibilityMode = (mode != null) && mode.isTrue();
|
66
|
+
}
|
55
67
|
}
|
56
68
|
if (registry == null) {
|
57
69
|
// registry is null when allocate -> initialize
|
58
70
|
// registry is already initialized (and somthing might be registered) when newPacker from Factory
|
59
71
|
this.registry = new ExtensionRegistry();
|
60
72
|
}
|
61
|
-
this.encoder = new Encoder(
|
62
|
-
this.buffer = new Buffer(
|
73
|
+
this.encoder = new Encoder(runtime, this, compatibilityMode, registry, hasSymbolExtType, hasBigintExtType);
|
74
|
+
this.buffer = new Buffer(runtime, runtime.getModule("MessagePack").getClass("Buffer"));
|
63
75
|
this.buffer.initialize(ctx, args);
|
64
|
-
this.binaryEncoding =
|
76
|
+
this.binaryEncoding = runtime.getEncodingService().getAscii8bitEncoding();
|
65
77
|
return this;
|
66
78
|
}
|
67
79
|
|
68
|
-
public static Packer newPacker(ThreadContext ctx, ExtensionRegistry extRegistry, boolean hasSymbolExtType, IRubyObject[] args) {
|
69
|
-
Packer packer = new Packer(ctx.
|
80
|
+
public static Packer newPacker(ThreadContext ctx, ExtensionRegistry extRegistry, boolean hasSymbolExtType, boolean hasBigintExtType, IRubyObject[] args) {
|
81
|
+
Packer packer = new Packer(ctx.runtime, ctx.runtime.getModule("MessagePack").getClass("Packer"), extRegistry, hasSymbolExtType, hasBigintExtType);
|
70
82
|
packer.initialize(ctx, args);
|
71
83
|
return packer;
|
72
84
|
}
|
73
85
|
|
74
86
|
@JRubyMethod(name = "compatibility_mode?")
|
75
87
|
public IRubyObject isCompatibilityMode(ThreadContext ctx) {
|
76
|
-
return encoder.isCompatibilityMode() ? ctx.
|
88
|
+
return encoder.isCompatibilityMode() ? ctx.runtime.getTrue() : ctx.runtime.getFalse();
|
77
89
|
}
|
78
90
|
|
79
91
|
@JRubyMethod(name = "registered_types_internal", visibility = PRIVATE)
|
@@ -83,7 +95,7 @@ public class Packer extends RubyObject {
|
|
83
95
|
|
84
96
|
@JRubyMethod(name = "register_type", required = 2, optional = 1)
|
85
97
|
public IRubyObject registerType(ThreadContext ctx, IRubyObject[] args, final Block block) {
|
86
|
-
Ruby runtime = ctx.
|
98
|
+
Ruby runtime = ctx.runtime;
|
87
99
|
IRubyObject type = args[0];
|
88
100
|
IRubyObject mod = args[1];
|
89
101
|
|
@@ -112,7 +124,7 @@ public class Packer extends RubyObject {
|
|
112
124
|
}
|
113
125
|
RubyModule extModule = (RubyModule) mod;
|
114
126
|
|
115
|
-
registry.put(extModule, (int) typeId, proc, arg, null, null);
|
127
|
+
registry.put(extModule, (int) typeId, false, proc, arg, null, null);
|
116
128
|
|
117
129
|
if (extModule == runtime.getSymbol()) {
|
118
130
|
encoder.hasSymbolExtType = true;
|
@@ -182,12 +194,12 @@ public class Packer extends RubyObject {
|
|
182
194
|
|
183
195
|
@JRubyMethod(name = "write_true")
|
184
196
|
public IRubyObject writeTrue(ThreadContext ctx) {
|
185
|
-
return write(ctx, ctx.
|
197
|
+
return write(ctx, ctx.runtime.getTrue());
|
186
198
|
}
|
187
199
|
|
188
200
|
@JRubyMethod(name = "write_false")
|
189
201
|
public IRubyObject writeFalse(ThreadContext ctx) {
|
190
|
-
return write(ctx, ctx.
|
202
|
+
return write(ctx, ctx.runtime.getFalse());
|
191
203
|
}
|
192
204
|
|
193
205
|
@JRubyMethod(name = "write_nil")
|
@@ -255,7 +267,7 @@ public class Packer extends RubyObject {
|
|
255
267
|
return buffer.size(ctx);
|
256
268
|
}
|
257
269
|
|
258
|
-
@JRubyMethod(name = "clear")
|
270
|
+
@JRubyMethod(name = "clear", alias = { "reset" })
|
259
271
|
public IRubyObject clear(ThreadContext ctx) {
|
260
272
|
return buffer.clear(ctx);
|
261
273
|
}
|
@@ -27,6 +27,7 @@ import static org.jruby.runtime.Visibility.PRIVATE;
|
|
27
27
|
|
28
28
|
@JRubyClass(name="MessagePack::Unpacker")
|
29
29
|
public class Unpacker extends RubyObject {
|
30
|
+
private static final long serialVersionUID = 8451264671199362492L;
|
30
31
|
private final ExtensionRegistry registry;
|
31
32
|
|
32
33
|
private IRubyObject stream;
|
@@ -34,6 +35,7 @@ public class Unpacker extends RubyObject {
|
|
34
35
|
private Decoder decoder;
|
35
36
|
private final RubyClass underflowErrorClass;
|
36
37
|
private boolean symbolizeKeys;
|
38
|
+
private boolean freeze;
|
37
39
|
private boolean allowUnknownExt;
|
38
40
|
|
39
41
|
public Unpacker(Ruby runtime, RubyClass type) {
|
@@ -54,41 +56,70 @@ public class Unpacker extends RubyObject {
|
|
54
56
|
|
55
57
|
@JRubyMethod(name = "initialize", optional = 2, visibility = PRIVATE)
|
56
58
|
public IRubyObject initialize(ThreadContext ctx, IRubyObject[] args) {
|
59
|
+
Ruby runtime = ctx.runtime;
|
60
|
+
|
57
61
|
symbolizeKeys = false;
|
58
62
|
allowUnknownExt = false;
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
63
|
+
freeze = false;
|
64
|
+
|
65
|
+
IRubyObject io = null;
|
66
|
+
RubyHash options = null;
|
67
|
+
|
68
|
+
if (args.length >= 1) {
|
69
|
+
io = args[0];
|
70
|
+
}
|
71
|
+
|
72
|
+
if (args.length >= 2 && args[1] != runtime.getNil()) {
|
73
|
+
options = (RubyHash)args[1];
|
74
|
+
}
|
75
|
+
|
76
|
+
if (options == null && io != null && io instanceof RubyHash) {
|
77
|
+
options = (RubyHash)io;
|
78
|
+
io = null;
|
79
|
+
}
|
80
|
+
|
81
|
+
if (options != null) {
|
82
|
+
IRubyObject sk = options.fastARef(runtime.newSymbol("symbolize_keys"));
|
83
|
+
if (sk != null) {
|
84
|
+
symbolizeKeys = sk.isTrue();
|
85
|
+
}
|
86
|
+
IRubyObject f = options.fastARef(runtime.newSymbol("freeze"));
|
87
|
+
if (f != null) {
|
88
|
+
freeze = f.isTrue();
|
70
89
|
}
|
71
|
-
|
72
|
-
|
90
|
+
IRubyObject au = options.fastARef(runtime.newSymbol("allow_unknown_ext"));
|
91
|
+
if (au != null) {
|
92
|
+
allowUnknownExt = au.isTrue();
|
73
93
|
}
|
94
|
+
|
95
|
+
}
|
96
|
+
|
97
|
+
if (io != null && io != runtime.getNil()) {
|
98
|
+
setStream(ctx, io);
|
74
99
|
}
|
100
|
+
|
75
101
|
return this;
|
76
102
|
}
|
77
103
|
|
78
104
|
public static Unpacker newUnpacker(ThreadContext ctx, ExtensionRegistry extRegistry, IRubyObject[] args) {
|
79
|
-
Unpacker unpacker = new Unpacker(ctx.
|
105
|
+
Unpacker unpacker = new Unpacker(ctx.runtime, ctx.runtime.getModule("MessagePack").getClass("Unpacker"), extRegistry);
|
80
106
|
unpacker.initialize(ctx, args);
|
81
107
|
return unpacker;
|
82
108
|
}
|
83
109
|
|
84
110
|
@JRubyMethod(name = "symbolize_keys?")
|
85
111
|
public IRubyObject isSymbolizeKeys(ThreadContext ctx) {
|
86
|
-
return symbolizeKeys ? ctx.
|
112
|
+
return symbolizeKeys ? ctx.runtime.getTrue() : ctx.runtime.getFalse();
|
113
|
+
}
|
114
|
+
|
115
|
+
@JRubyMethod(name = "freeze?")
|
116
|
+
public IRubyObject isFreeze(ThreadContext ctx) {
|
117
|
+
return freeze ? ctx.runtime.getTrue() : ctx.runtime.getFalse();
|
87
118
|
}
|
88
119
|
|
89
120
|
@JRubyMethod(name = "allow_unknown_ext?")
|
90
121
|
public IRubyObject isAllowUnknownExt(ThreadContext ctx) {
|
91
|
-
return allowUnknownExt ? ctx.
|
122
|
+
return allowUnknownExt ? ctx.runtime.getTrue() : ctx.runtime.getFalse();
|
92
123
|
}
|
93
124
|
|
94
125
|
@JRubyMethod(name = "registered_types_internal", visibility = PRIVATE)
|
@@ -98,7 +129,7 @@ public class Unpacker extends RubyObject {
|
|
98
129
|
|
99
130
|
@JRubyMethod(name = "register_type", required = 1, optional = 2)
|
100
131
|
public IRubyObject registerType(ThreadContext ctx, IRubyObject[] args, final Block block) {
|
101
|
-
Ruby runtime = ctx.
|
132
|
+
Ruby runtime = ctx.runtime;
|
102
133
|
IRubyObject type = args[0];
|
103
134
|
|
104
135
|
RubyModule extModule;
|
@@ -126,7 +157,7 @@ public class Unpacker extends RubyObject {
|
|
126
157
|
throw runtime.newRangeError(String.format("integer %d too big to convert to `signed char'", typeId));
|
127
158
|
}
|
128
159
|
|
129
|
-
registry.put(extModule, (int) typeId, null, null, proc, arg);
|
160
|
+
registry.put(extModule, (int) typeId, false, null, null, proc, arg);
|
130
161
|
return runtime.getNil();
|
131
162
|
}
|
132
163
|
|
@@ -144,7 +175,7 @@ public class Unpacker extends RubyObject {
|
|
144
175
|
if (limit == -1) {
|
145
176
|
limit = byteList.length() - offset;
|
146
177
|
}
|
147
|
-
Decoder decoder = new Decoder(ctx.
|
178
|
+
Decoder decoder = new Decoder(ctx.runtime, this, byteList.unsafeBytes(), byteList.begin() + offset, limit, symbolizeKeys, freeze, allowUnknownExt);
|
148
179
|
try {
|
149
180
|
data = null;
|
150
181
|
data = decoder.next();
|
@@ -153,13 +184,13 @@ public class Unpacker extends RubyObject {
|
|
153
184
|
throw re;
|
154
185
|
}
|
155
186
|
}
|
156
|
-
return ctx.
|
187
|
+
return ctx.runtime.newFixnum(decoder.offset());
|
157
188
|
}
|
158
189
|
|
159
190
|
@JRubyMethod(name = "data")
|
160
191
|
public IRubyObject getData(ThreadContext ctx) {
|
161
192
|
if (data == null) {
|
162
|
-
return ctx.
|
193
|
+
return ctx.runtime.getNil();
|
163
194
|
} else {
|
164
195
|
return data;
|
165
196
|
}
|
@@ -167,14 +198,14 @@ public class Unpacker extends RubyObject {
|
|
167
198
|
|
168
199
|
@JRubyMethod(name = "finished?")
|
169
200
|
public IRubyObject finished_p(ThreadContext ctx) {
|
170
|
-
return data == null ? ctx.
|
201
|
+
return data == null ? ctx.runtime.getFalse() : ctx.runtime.getTrue();
|
171
202
|
}
|
172
203
|
|
173
204
|
@JRubyMethod(required = 1, name = "feed", alias = { "feed_reference" })
|
174
205
|
public IRubyObject feed(ThreadContext ctx, IRubyObject data) {
|
175
206
|
ByteList byteList = data.asString().getByteList();
|
176
207
|
if (decoder == null) {
|
177
|
-
decoder = new Decoder(ctx.
|
208
|
+
decoder = new Decoder(ctx.runtime, this, byteList.unsafeBytes(), byteList.begin(), byteList.length(), symbolizeKeys, freeze, allowUnknownExt);
|
178
209
|
} else {
|
179
210
|
decoder.feed(byteList.unsafeBytes(), byteList.begin(), byteList.length());
|
180
211
|
}
|
@@ -191,7 +222,7 @@ public class Unpacker extends RubyObject {
|
|
191
222
|
feed(ctx, data);
|
192
223
|
if (block.isGiven()) {
|
193
224
|
each(ctx, block);
|
194
|
-
return ctx.
|
225
|
+
return ctx.runtime.getNil();
|
195
226
|
} else {
|
196
227
|
return callMethod(ctx, "to_enum");
|
197
228
|
}
|
@@ -219,7 +250,7 @@ public class Unpacker extends RubyObject {
|
|
219
250
|
|
220
251
|
@JRubyMethod
|
221
252
|
public IRubyObject fill(ThreadContext ctx) {
|
222
|
-
return ctx.
|
253
|
+
return ctx.runtime.getNil();
|
223
254
|
}
|
224
255
|
|
225
256
|
@JRubyMethod
|
@@ -227,13 +258,13 @@ public class Unpacker extends RubyObject {
|
|
227
258
|
if (decoder != null) {
|
228
259
|
decoder.reset();
|
229
260
|
}
|
230
|
-
return ctx.
|
261
|
+
return ctx.runtime.getNil();
|
231
262
|
}
|
232
263
|
|
233
264
|
@JRubyMethod(name = "read", alias = { "unpack" })
|
234
265
|
public IRubyObject read(ThreadContext ctx) {
|
235
266
|
if (decoder == null) {
|
236
|
-
throw ctx.
|
267
|
+
throw ctx.runtime.newEOFError();
|
237
268
|
}
|
238
269
|
try {
|
239
270
|
return decoder.next();
|
@@ -241,19 +272,19 @@ public class Unpacker extends RubyObject {
|
|
241
272
|
if (re.getException().getType() != underflowErrorClass) {
|
242
273
|
throw re;
|
243
274
|
} else {
|
244
|
-
throw ctx.
|
275
|
+
throw ctx.runtime.newEOFError();
|
245
276
|
}
|
246
277
|
}
|
247
278
|
}
|
248
279
|
|
249
280
|
@JRubyMethod(name = "skip")
|
250
281
|
public IRubyObject skip(ThreadContext ctx) {
|
251
|
-
throw ctx.
|
282
|
+
throw ctx.runtime.newNotImplementedError("Not supported yet in JRuby implementation");
|
252
283
|
}
|
253
284
|
|
254
285
|
@JRubyMethod(name = "skip_nil")
|
255
286
|
public IRubyObject skipNil(ThreadContext ctx) {
|
256
|
-
throw ctx.
|
287
|
+
throw ctx.runtime.newNotImplementedError("Not supported yet in JRuby implementation");
|
257
288
|
}
|
258
289
|
|
259
290
|
@JRubyMethod
|
@@ -265,11 +296,11 @@ public class Unpacker extends RubyObject {
|
|
265
296
|
if (re.getException().getType() != underflowErrorClass) {
|
266
297
|
throw re;
|
267
298
|
} else {
|
268
|
-
throw ctx.
|
299
|
+
throw ctx.runtime.newEOFError();
|
269
300
|
}
|
270
301
|
}
|
271
302
|
}
|
272
|
-
return ctx.
|
303
|
+
return ctx.runtime.getNil();
|
273
304
|
}
|
274
305
|
|
275
306
|
@JRubyMethod
|
@@ -281,17 +312,17 @@ public class Unpacker extends RubyObject {
|
|
281
312
|
if (re.getException().getType() != underflowErrorClass) {
|
282
313
|
throw re;
|
283
314
|
} else {
|
284
|
-
throw ctx.
|
315
|
+
throw ctx.runtime.newEOFError();
|
285
316
|
}
|
286
317
|
}
|
287
318
|
}
|
288
|
-
return ctx.
|
319
|
+
return ctx.runtime.getNil();
|
289
320
|
}
|
290
321
|
|
291
322
|
@JRubyMethod(name = "stream")
|
292
323
|
public IRubyObject getStream(ThreadContext ctx) {
|
293
324
|
if (stream == null) {
|
294
|
-
return ctx.
|
325
|
+
return ctx.runtime.getNil();
|
295
326
|
} else {
|
296
327
|
return stream;
|
297
328
|
}
|
@@ -307,12 +338,16 @@ public class Unpacker extends RubyObject {
|
|
307
338
|
} else if (stream.respondsTo("read")) {
|
308
339
|
str = stream.callMethod(ctx, "read").asString();
|
309
340
|
} else {
|
310
|
-
throw ctx.
|
341
|
+
throw ctx.runtime.newTypeError(stream, "IO");
|
311
342
|
}
|
312
343
|
ByteList byteList = str.getByteList();
|
313
344
|
this.stream = stream;
|
314
345
|
this.decoder = null;
|
315
|
-
this.decoder = new Decoder(ctx.
|
346
|
+
this.decoder = new Decoder(ctx.runtime, this, byteList.unsafeBytes(), byteList.begin(), byteList.length(), symbolizeKeys, freeze, allowUnknownExt);
|
316
347
|
return getStream(ctx);
|
317
348
|
}
|
349
|
+
|
350
|
+
public ExtensionRegistry.ExtensionEntry lookupExtensionByTypeId(int typeId) {
|
351
|
+
return registry.lookupExtensionByTypeId(typeId);
|
352
|
+
}
|
318
353
|
}
|