msgpack 1.4.2 → 1.7.3

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.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +89 -0
  3. data/README.md +73 -13
  4. data/ext/java/org/msgpack/jruby/Buffer.java +26 -19
  5. data/ext/java/org/msgpack/jruby/Decoder.java +29 -21
  6. data/ext/java/org/msgpack/jruby/Encoder.java +68 -30
  7. data/ext/java/org/msgpack/jruby/ExtensionRegistry.java +43 -64
  8. data/ext/java/org/msgpack/jruby/ExtensionValue.java +6 -9
  9. data/ext/java/org/msgpack/jruby/Factory.java +43 -42
  10. data/ext/java/org/msgpack/jruby/Packer.java +37 -40
  11. data/ext/java/org/msgpack/jruby/Unpacker.java +80 -73
  12. data/ext/msgpack/buffer.c +54 -74
  13. data/ext/msgpack/buffer.h +21 -18
  14. data/ext/msgpack/buffer_class.c +161 -52
  15. data/ext/msgpack/buffer_class.h +1 -0
  16. data/ext/msgpack/compat.h +0 -99
  17. data/ext/msgpack/extconf.rb +25 -46
  18. data/ext/msgpack/factory_class.c +143 -87
  19. data/ext/msgpack/packer.c +66 -43
  20. data/ext/msgpack/packer.h +25 -20
  21. data/ext/msgpack/packer_class.c +102 -130
  22. data/ext/msgpack/packer_class.h +11 -0
  23. data/ext/msgpack/packer_ext_registry.c +35 -40
  24. data/ext/msgpack/packer_ext_registry.h +41 -38
  25. data/ext/msgpack/rbinit.c +1 -1
  26. data/ext/msgpack/rmem.c +3 -4
  27. data/ext/msgpack/sysdep.h +5 -2
  28. data/ext/msgpack/unpacker.c +136 -111
  29. data/ext/msgpack/unpacker.h +16 -13
  30. data/ext/msgpack/unpacker_class.c +86 -126
  31. data/ext/msgpack/unpacker_class.h +11 -0
  32. data/ext/msgpack/unpacker_ext_registry.c +40 -28
  33. data/ext/msgpack/unpacker_ext_registry.h +21 -18
  34. data/lib/msgpack/bigint.rb +69 -0
  35. data/lib/msgpack/buffer.rb +9 -0
  36. data/lib/msgpack/factory.rb +140 -10
  37. data/lib/msgpack/packer.rb +10 -1
  38. data/lib/msgpack/symbol.rb +21 -4
  39. data/lib/msgpack/time.rb +1 -1
  40. data/lib/msgpack/unpacker.rb +14 -1
  41. data/lib/msgpack/version.rb +1 -1
  42. data/lib/msgpack.rb +6 -7
  43. data/msgpack.gemspec +8 -5
  44. metadata +37 -82
  45. data/.gitignore +0 -23
  46. data/.rubocop.yml +0 -36
  47. data/.travis.yml +0 -39
  48. data/Gemfile +0 -9
  49. data/Rakefile +0 -71
  50. data/appveyor.yml +0 -18
  51. data/bench/pack.rb +0 -23
  52. data/bench/pack_log.rb +0 -33
  53. data/bench/pack_log_long.rb +0 -65
  54. data/bench/pack_symbols.rb +0 -28
  55. data/bench/run.sh +0 -14
  56. data/bench/run_long.sh +0 -35
  57. data/bench/run_symbols.sh +0 -26
  58. data/bench/unpack.rb +0 -21
  59. data/bench/unpack_log.rb +0 -34
  60. data/bench/unpack_log_long.rb +0 -67
  61. data/doclib/msgpack/buffer.rb +0 -193
  62. data/doclib/msgpack/core_ext.rb +0 -101
  63. data/doclib/msgpack/error.rb +0 -19
  64. data/doclib/msgpack/extension_value.rb +0 -9
  65. data/doclib/msgpack/factory.rb +0 -101
  66. data/doclib/msgpack/packer.rb +0 -208
  67. data/doclib/msgpack/time.rb +0 -22
  68. data/doclib/msgpack/timestamp.rb +0 -44
  69. data/doclib/msgpack/unpacker.rb +0 -183
  70. data/doclib/msgpack.rb +0 -87
  71. data/msgpack.org.md +0 -46
  72. data/spec/cases.json +0 -1
  73. data/spec/cases.msg +0 -0
  74. data/spec/cases_compact.msg +0 -0
  75. data/spec/cases_spec.rb +0 -39
  76. data/spec/cruby/buffer_io_spec.rb +0 -255
  77. data/spec/cruby/buffer_packer.rb +0 -29
  78. data/spec/cruby/buffer_spec.rb +0 -575
  79. data/spec/cruby/buffer_unpacker.rb +0 -19
  80. data/spec/cruby/unpacker_spec.rb +0 -70
  81. data/spec/ext_value_spec.rb +0 -99
  82. data/spec/exttypes.rb +0 -51
  83. data/spec/factory_spec.rb +0 -367
  84. data/spec/format_spec.rb +0 -301
  85. data/spec/jruby/benchmarks/shootout_bm.rb +0 -73
  86. data/spec/jruby/benchmarks/symbolize_keys_bm.rb +0 -25
  87. data/spec/jruby/unpacker_spec.rb +0 -186
  88. data/spec/msgpack_spec.rb +0 -214
  89. data/spec/pack_spec.rb +0 -61
  90. data/spec/packer_spec.rb +0 -557
  91. data/spec/random_compat.rb +0 -24
  92. data/spec/spec_helper.rb +0 -55
  93. data/spec/timestamp_spec.rb +0 -121
  94. data/spec/unpack_spec.rb +0 -57
  95. data/spec/unpacker_spec.rb +0 -819
@@ -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
- public ExtensionRegistry registry;
30
+ private static final long serialVersionUID = 8451274621499362492L;
31
+ public transient ExtensionRegistry registry;
31
32
  private Buffer buffer;
32
- private Encoder encoder;
33
+ private transient Encoder encoder;
33
34
  private boolean hasSymbolExtType;
34
- private Encoding binaryEncoding;
35
+ private boolean hasBigintExtType;
36
+ private transient 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
- if (args.length > 0 && args[args.length - 1] instanceof RubyHash) {
52
- RubyHash options = (RubyHash) args[args.length - 1];
53
- IRubyObject mode = options.fastARef(ctx.getRuntime().newSymbol("compatibility_mode"));
54
- compatibilityMode = (mode != null) && mode.isTrue();
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(ctx.getRuntime(), compatibilityMode, registry, hasSymbolExtType);
62
- this.buffer = new Buffer(ctx.getRuntime(), ctx.getRuntime().getModule("MessagePack").getClass("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 = ctx.getRuntime().getEncodingService().getAscii8bitEncoding();
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.getRuntime(), ctx.getRuntime().getModule("MessagePack").getClass("Packer"), extRegistry, hasSymbolExtType);
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.getRuntime().getTrue() : ctx.getRuntime().getFalse();
88
+ return encoder.isCompatibilityMode() ? ctx.runtime.getTrue() : ctx.runtime.getFalse();
77
89
  }
78
90
 
79
91
  @JRubyMethod(name = "registered_types_internal", visibility = PRIVATE)
@@ -81,26 +93,11 @@ public class Packer extends RubyObject {
81
93
  return registry.toInternalPackerRegistry(ctx);
82
94
  }
83
95
 
84
- @JRubyMethod(name = "register_type", required = 2, optional = 1)
85
- public IRubyObject registerType(ThreadContext ctx, IRubyObject[] args, final Block block) {
86
- Ruby runtime = ctx.getRuntime();
87
- IRubyObject type = args[0];
88
- IRubyObject mod = args[1];
89
-
90
- IRubyObject arg;
91
- IRubyObject proc;
92
- if (args.length == 2) {
93
- if (! block.isGiven()) {
94
- throw runtime.newLocalJumpErrorNoBlock();
95
- }
96
- proc = block.getProcObject();
97
- arg = proc;
98
- } else if (args.length == 3) {
99
- arg = args[2];
100
- proc = arg.callMethod(ctx, "to_proc");
101
- } else {
102
- throw runtime.newArgumentError(String.format("wrong number of arguments (%d for 2..3)", 2 + args.length));
103
- }
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
+
100
+ Ruby runtime = ctx.runtime;
104
101
 
105
102
  long typeId = ((RubyFixnum) type).getLongValue();
106
103
  if (typeId < -128 || typeId > 127) {
@@ -112,9 +109,9 @@ public class Packer extends RubyObject {
112
109
  }
113
110
  RubyModule extModule = (RubyModule) mod;
114
111
 
115
- registry.put(extModule, (int) typeId, proc, arg, null, null);
112
+ registry.put(extModule, (int) typeId, false, proc, null);
116
113
 
117
- if (extModule == runtime.getSymbol()) {
114
+ if (extModule == runtime.getSymbol() && !proc.isNil()) {
118
115
  encoder.hasSymbolExtType = true;
119
116
  }
120
117
 
@@ -182,12 +179,12 @@ public class Packer extends RubyObject {
182
179
 
183
180
  @JRubyMethod(name = "write_true")
184
181
  public IRubyObject writeTrue(ThreadContext ctx) {
185
- return write(ctx, ctx.getRuntime().getTrue());
182
+ return write(ctx, ctx.runtime.getTrue());
186
183
  }
187
184
 
188
185
  @JRubyMethod(name = "write_false")
189
186
  public IRubyObject writeFalse(ThreadContext ctx) {
190
- return write(ctx, ctx.getRuntime().getFalse());
187
+ return write(ctx, ctx.runtime.getFalse());
191
188
  }
192
189
 
193
190
  @JRubyMethod(name = "write_nil")
@@ -255,7 +252,7 @@ public class Packer extends RubyObject {
255
252
  return buffer.size(ctx);
256
253
  }
257
254
 
258
- @JRubyMethod(name = "clear")
255
+ @JRubyMethod(name = "clear", alias = { "reset" })
259
256
  public IRubyObject clear(ThreadContext ctx) {
260
257
  return buffer.clear(ctx);
261
258
  }
@@ -21,17 +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
- private final ExtensionRegistry registry;
29
+ private static final long serialVersionUID = 8451264671199362492L;
30
+ private transient final ExtensionRegistry registry;
31
31
 
32
- private IRubyObject stream;
33
- private IRubyObject data;
34
- private Decoder decoder;
32
+ private transient IRubyObject stream;
33
+ private transient IRubyObject data;
34
+ private transient Decoder decoder;
35
35
  private final RubyClass underflowErrorClass;
36
36
  private boolean symbolizeKeys;
37
37
  private boolean freeze;
@@ -55,51 +55,70 @@ public class Unpacker extends RubyObject {
55
55
 
56
56
  @JRubyMethod(name = "initialize", optional = 2, visibility = PRIVATE)
57
57
  public IRubyObject initialize(ThreadContext ctx, IRubyObject[] args) {
58
+ Ruby runtime = ctx.runtime;
59
+
58
60
  symbolizeKeys = false;
59
61
  allowUnknownExt = false;
60
62
  freeze = false;
61
- if (args.length > 0) {
62
- if (args[args.length - 1] instanceof RubyHash) {
63
- RubyHash options = (RubyHash) args[args.length - 1];
64
- IRubyObject sk = options.fastARef(ctx.getRuntime().newSymbol("symbolize_keys"));
65
- if (sk != null) {
66
- symbolizeKeys = sk.isTrue();
67
- }
68
- IRubyObject f = options.fastARef(ctx.getRuntime().newSymbol("freeze"));
69
- if (f != null) {
70
- freeze = f.isTrue();
71
- }
72
- IRubyObject au = options.fastARef(ctx.getRuntime().newSymbol("allow_unknown_ext"));
73
- if (au != null) {
74
- allowUnknownExt = au.isTrue();
75
- }
63
+
64
+ IRubyObject io = null;
65
+ RubyHash options = null;
66
+
67
+ if (args.length >= 1) {
68
+ io = args[0];
69
+ }
70
+
71
+ if (args.length >= 2 && args[1] != runtime.getNil()) {
72
+ options = (RubyHash)args[1];
73
+ }
74
+
75
+ if (options == null && io != null && io instanceof RubyHash) {
76
+ options = (RubyHash)io;
77
+ io = null;
78
+ }
79
+
80
+ if (options != null) {
81
+ IRubyObject sk = options.fastARef(runtime.newSymbol("symbolize_keys"));
82
+ if (sk != null) {
83
+ symbolizeKeys = sk.isTrue();
84
+ }
85
+ IRubyObject f = options.fastARef(runtime.newSymbol("freeze"));
86
+ if (f != null) {
87
+ freeze = f.isTrue();
76
88
  }
77
- if (args[0] != ctx.getRuntime().getNil() && !(args[0] instanceof RubyHash)) {
78
- setStream(ctx, args[0]);
89
+ IRubyObject au = options.fastARef(runtime.newSymbol("allow_unknown_ext"));
90
+ if (au != null) {
91
+ allowUnknownExt = au.isTrue();
79
92
  }
93
+
94
+ }
95
+
96
+ if (io != null && io != runtime.getNil()) {
97
+ setStream(ctx, io);
80
98
  }
99
+
81
100
  return this;
82
101
  }
83
102
 
84
103
  public static Unpacker newUnpacker(ThreadContext ctx, ExtensionRegistry extRegistry, IRubyObject[] args) {
85
- Unpacker unpacker = new Unpacker(ctx.getRuntime(), ctx.getRuntime().getModule("MessagePack").getClass("Unpacker"), extRegistry);
104
+ Unpacker unpacker = new Unpacker(ctx.runtime, ctx.runtime.getModule("MessagePack").getClass("Unpacker"), extRegistry);
86
105
  unpacker.initialize(ctx, args);
87
106
  return unpacker;
88
107
  }
89
108
 
90
109
  @JRubyMethod(name = "symbolize_keys?")
91
110
  public IRubyObject isSymbolizeKeys(ThreadContext ctx) {
92
- return symbolizeKeys ? ctx.getRuntime().getTrue() : ctx.getRuntime().getFalse();
111
+ return symbolizeKeys ? ctx.runtime.getTrue() : ctx.runtime.getFalse();
93
112
  }
94
113
 
95
114
  @JRubyMethod(name = "freeze?")
96
115
  public IRubyObject isFreeze(ThreadContext ctx) {
97
- return freeze ? ctx.getRuntime().getTrue() : ctx.getRuntime().getFalse();
116
+ return freeze ? ctx.runtime.getTrue() : ctx.runtime.getFalse();
98
117
  }
99
118
 
100
119
  @JRubyMethod(name = "allow_unknown_ext?")
101
120
  public IRubyObject isAllowUnknownExt(ThreadContext ctx) {
102
- return allowUnknownExt ? ctx.getRuntime().getTrue() : ctx.getRuntime().getFalse();
121
+ return allowUnknownExt ? ctx.runtime.getTrue() : ctx.runtime.getFalse();
103
122
  }
104
123
 
105
124
  @JRubyMethod(name = "registered_types_internal", visibility = PRIVATE)
@@ -107,37 +126,23 @@ public class Unpacker extends RubyObject {
107
126
  return registry.toInternalUnpackerRegistry(ctx);
108
127
  }
109
128
 
110
- @JRubyMethod(name = "register_type", required = 1, optional = 2)
111
- public IRubyObject registerType(ThreadContext ctx, IRubyObject[] args, final Block block) {
112
- Ruby runtime = ctx.getRuntime();
113
- IRubyObject type = args[0];
114
-
115
- RubyModule extModule;
116
- IRubyObject arg;
117
- IRubyObject proc;
118
- if (args.length == 1) {
119
- if (! block.isGiven()) {
120
- throw runtime.newLocalJumpErrorNoBlock();
121
- }
122
- proc = RubyProc.newProc(runtime, block, block.type);
123
- if (proc == null)
124
- System.err.println("proc from Block is null");
125
- arg = proc;
126
- extModule = null;
127
- } else if (args.length == 3) {
128
- extModule = (RubyModule) args[1];
129
- arg = args[2];
130
- proc = extModule.method(arg);
131
- } else {
132
- throw runtime.newArgumentError(String.format("wrong number of arguments (%d for 1 or 3)", 2 + args.length));
133
- }
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
+
133
+ Ruby runtime = ctx.runtime;
134
134
 
135
135
  long typeId = ((RubyFixnum) type).getLongValue();
136
136
  if (typeId < -128 || typeId > 127) {
137
137
  throw runtime.newRangeError(String.format("integer %d too big to convert to `signed char'", typeId));
138
138
  }
139
139
 
140
- registry.put(extModule, (int) typeId, null, null, proc, arg);
140
+ RubyModule extModule = null;
141
+ if (mod != runtime.getNil()) {
142
+ extModule = (RubyModule)mod;
143
+ }
144
+
145
+ registry.put(extModule, (int) typeId, false, null, proc);
141
146
  return runtime.getNil();
142
147
  }
143
148
 
@@ -155,7 +160,7 @@ public class Unpacker extends RubyObject {
155
160
  if (limit == -1) {
156
161
  limit = byteList.length() - offset;
157
162
  }
158
- Decoder decoder = new Decoder(ctx.getRuntime(), registry, byteList.unsafeBytes(), byteList.begin() + offset, limit, symbolizeKeys, freeze, allowUnknownExt);
163
+ Decoder decoder = new Decoder(ctx.runtime, this, byteList.unsafeBytes(), byteList.begin() + offset, limit, symbolizeKeys, freeze, allowUnknownExt);
159
164
  try {
160
165
  data = null;
161
166
  data = decoder.next();
@@ -164,13 +169,13 @@ public class Unpacker extends RubyObject {
164
169
  throw re;
165
170
  }
166
171
  }
167
- return ctx.getRuntime().newFixnum(decoder.offset());
172
+ return ctx.runtime.newFixnum(decoder.offset());
168
173
  }
169
174
 
170
175
  @JRubyMethod(name = "data")
171
176
  public IRubyObject getData(ThreadContext ctx) {
172
177
  if (data == null) {
173
- return ctx.getRuntime().getNil();
178
+ return ctx.runtime.getNil();
174
179
  } else {
175
180
  return data;
176
181
  }
@@ -178,14 +183,14 @@ public class Unpacker extends RubyObject {
178
183
 
179
184
  @JRubyMethod(name = "finished?")
180
185
  public IRubyObject finished_p(ThreadContext ctx) {
181
- return data == null ? ctx.getRuntime().getFalse() : ctx.getRuntime().getTrue();
186
+ return data == null ? ctx.runtime.getFalse() : ctx.runtime.getTrue();
182
187
  }
183
188
 
184
189
  @JRubyMethod(required = 1, name = "feed", alias = { "feed_reference" })
185
190
  public IRubyObject feed(ThreadContext ctx, IRubyObject data) {
186
191
  ByteList byteList = data.asString().getByteList();
187
192
  if (decoder == null) {
188
- decoder = new Decoder(ctx.getRuntime(), registry, byteList.unsafeBytes(), byteList.begin(), byteList.length(), symbolizeKeys, freeze, allowUnknownExt);
193
+ decoder = new Decoder(ctx.runtime, this, byteList.unsafeBytes(), byteList.begin(), byteList.length(), symbolizeKeys, freeze, allowUnknownExt);
189
194
  } else {
190
195
  decoder.feed(byteList.unsafeBytes(), byteList.begin(), byteList.length());
191
196
  }
@@ -202,7 +207,7 @@ public class Unpacker extends RubyObject {
202
207
  feed(ctx, data);
203
208
  if (block.isGiven()) {
204
209
  each(ctx, block);
205
- return ctx.getRuntime().getNil();
210
+ return ctx.runtime.getNil();
206
211
  } else {
207
212
  return callMethod(ctx, "to_enum");
208
213
  }
@@ -230,7 +235,7 @@ public class Unpacker extends RubyObject {
230
235
 
231
236
  @JRubyMethod
232
237
  public IRubyObject fill(ThreadContext ctx) {
233
- return ctx.getRuntime().getNil();
238
+ return ctx.runtime.getNil();
234
239
  }
235
240
 
236
241
  @JRubyMethod
@@ -238,13 +243,13 @@ public class Unpacker extends RubyObject {
238
243
  if (decoder != null) {
239
244
  decoder.reset();
240
245
  }
241
- return ctx.getRuntime().getNil();
246
+ return ctx.runtime.getNil();
242
247
  }
243
248
 
244
249
  @JRubyMethod(name = "read", alias = { "unpack" })
245
250
  public IRubyObject read(ThreadContext ctx) {
246
251
  if (decoder == null) {
247
- throw ctx.getRuntime().newEOFError();
252
+ throw ctx.runtime.newEOFError();
248
253
  }
249
254
  try {
250
255
  return decoder.next();
@@ -252,19 +257,19 @@ public class Unpacker extends RubyObject {
252
257
  if (re.getException().getType() != underflowErrorClass) {
253
258
  throw re;
254
259
  } else {
255
- throw ctx.getRuntime().newEOFError();
260
+ throw ctx.runtime.newEOFError();
256
261
  }
257
262
  }
258
263
  }
259
264
 
260
265
  @JRubyMethod(name = "skip")
261
266
  public IRubyObject skip(ThreadContext ctx) {
262
- throw ctx.getRuntime().newNotImplementedError("Not supported yet in JRuby implementation");
267
+ throw ctx.runtime.newNotImplementedError("Not supported yet in JRuby implementation");
263
268
  }
264
269
 
265
270
  @JRubyMethod(name = "skip_nil")
266
271
  public IRubyObject skipNil(ThreadContext ctx) {
267
- throw ctx.getRuntime().newNotImplementedError("Not supported yet in JRuby implementation");
272
+ throw ctx.runtime.newNotImplementedError("Not supported yet in JRuby implementation");
268
273
  }
269
274
 
270
275
  @JRubyMethod
@@ -276,11 +281,11 @@ public class Unpacker extends RubyObject {
276
281
  if (re.getException().getType() != underflowErrorClass) {
277
282
  throw re;
278
283
  } else {
279
- throw ctx.getRuntime().newEOFError();
284
+ throw ctx.runtime.newEOFError();
280
285
  }
281
286
  }
282
287
  }
283
- return ctx.getRuntime().getNil();
288
+ return ctx.runtime.getNil();
284
289
  }
285
290
 
286
291
  @JRubyMethod
@@ -292,17 +297,17 @@ public class Unpacker extends RubyObject {
292
297
  if (re.getException().getType() != underflowErrorClass) {
293
298
  throw re;
294
299
  } else {
295
- throw ctx.getRuntime().newEOFError();
300
+ throw ctx.runtime.newEOFError();
296
301
  }
297
302
  }
298
303
  }
299
- return ctx.getRuntime().getNil();
304
+ return ctx.runtime.getNil();
300
305
  }
301
306
 
302
307
  @JRubyMethod(name = "stream")
303
308
  public IRubyObject getStream(ThreadContext ctx) {
304
309
  if (stream == null) {
305
- return ctx.getRuntime().getNil();
310
+ return ctx.runtime.getNil();
306
311
  } else {
307
312
  return stream;
308
313
  }
@@ -311,19 +316,21 @@ public class Unpacker extends RubyObject {
311
316
  @JRubyMethod(name = "stream=", required = 1)
312
317
  public IRubyObject setStream(ThreadContext ctx, IRubyObject stream) {
313
318
  RubyString str;
314
- if (stream instanceof StringIO) {
315
- str = stream.callMethod(ctx, "string").asString();
316
- } else if (stream instanceof RubyIO) {
319
+ if (stream instanceof RubyIO) {
317
320
  str = stream.callMethod(ctx, "read").asString();
318
321
  } else if (stream.respondsTo("read")) {
319
322
  str = stream.callMethod(ctx, "read").asString();
320
323
  } else {
321
- throw ctx.getRuntime().newTypeError(stream, "IO");
324
+ throw ctx.runtime.newTypeError(stream, "IO");
322
325
  }
323
326
  ByteList byteList = str.getByteList();
324
327
  this.stream = stream;
325
328
  this.decoder = null;
326
- this.decoder = new Decoder(ctx.getRuntime(), registry, byteList.unsafeBytes(), byteList.begin(), byteList.length(), symbolizeKeys, freeze, allowUnknownExt);
329
+ this.decoder = new Decoder(ctx.runtime, this, byteList.unsafeBytes(), byteList.begin(), byteList.length(), symbolizeKeys, freeze, allowUnknownExt);
327
330
  return getStream(ctx);
328
331
  }
332
+
333
+ public ExtensionRegistry.ExtensionEntry lookupExtensionByTypeId(int typeId) {
334
+ return registry.lookupExtensionByTypeId(typeId);
335
+ }
329
336
  }