diff --git a/runtime/src/main/java/org/capnproto/PackedInputStream.java b/runtime/src/main/java/org/capnproto/PackedInputStream.java index 6d14eae..03a8880 100644 --- a/runtime/src/main/java/org/capnproto/PackedInputStream.java +++ b/runtime/src/main/java/org/capnproto/PackedInputStream.java @@ -25,13 +25,10 @@ public final class PackedInputStream implements ReadableByteChannel { ByteBuffer inBuf = this.inner.getReadBuffer(); - while (true) { byte tag = 0; - //if (outBuf - if (inBuf.remaining() < 10) { if (outBuf.remaining() == 0) { return len; @@ -91,11 +88,29 @@ public final class PackedInputStream implements ReadableByteChannel { if (inBuf.remaining() >= runLength) { - + //# Fast path. + ByteBuffer slice = inBuf.slice(); + slice.limit(runLength); + outBuf.put(slice); + inBuf.position(inBuf.position() + runLength); } else { + //# Copy over the first buffer, then do one big read for the rest. + runLength -= inBuf.remaining(); + outBuf.put(inBuf); + ByteBuffer slice = outBuf.slice(); + slice.limit(runLength); + + this.inner.read(slice); + outBuf.position(outBuf.position() + runLength); + + if (outBuf.remaining() == 0) { + return len; + } else { + inBuf = this.inner.getReadBuffer(); + continue; + } } - } if (outBuf.remaining() == 0) { diff --git a/runtime/src/test/scala/org/capnproto/SerializePackedTest.scala b/runtime/src/test/scala/org/capnproto/SerializePackedTest.scala index bcca6ea..b71cefe 100644 --- a/runtime/src/test/scala/org/capnproto/SerializePackedTest.scala +++ b/runtime/src/test/scala/org/capnproto/SerializePackedTest.scala @@ -26,9 +26,9 @@ class SerializePackedSuite extends FunSuite { val bytes = new Array[Byte](unpacked.length); val n = packedInputStream.read(ByteBuffer.wrap(bytes)); - //(n) should equal (unpacked.length); + (n) should equal (unpacked.length); - //(bytes) should equal (unpacked); + (bytes) should equal (unpacked); }