From 25c9e6af0dbd31d7b7945268fc49b49dc64b50cd Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Sun, 28 Sep 2014 13:09:18 -0400 Subject: [PATCH] fix some bugs --- .../org/capnproto/examples/AddressbookMain.java | 5 +++-- .../java/org/capnproto/PackedOutputStream.java | 14 +++++--------- .../scala/org/capnproto/SerializePackedTest.scala | 1 + 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/examples/src/main/java/org/capnproto/examples/AddressbookMain.java b/examples/src/main/java/org/capnproto/examples/AddressbookMain.java index d0570e6..810db0d 100644 --- a/examples/src/main/java/org/capnproto/examples/AddressbookMain.java +++ b/examples/src/main/java/org/capnproto/examples/AddressbookMain.java @@ -8,6 +8,7 @@ import org.capnproto.MessageBuilder; import org.capnproto.MessageReader; import org.capnproto.ByteChannelMessageReader; import org.capnproto.Serialize; +import org.capnproto.SerializePacked; import org.capnproto.StructList; import org.capnproto.Text; @@ -43,8 +44,8 @@ public class AddressbookMain { bobPhones.get(1).setType(Person.PhoneNumber.Type.WORK); bob.getEmployment().setUnemployed(org.capnproto.Void.VOID); - Serialize.writeMessage((new FileOutputStream(FileDescriptor.out)).getChannel(), - message); + SerializePacked.writeMessageUnbuffered((new FileOutputStream(FileDescriptor.out)).getChannel(), + message); } public static void printAddressBook() throws java.io.IOException { diff --git a/runtime/src/main/java/org/capnproto/PackedOutputStream.java b/runtime/src/main/java/org/capnproto/PackedOutputStream.java index d8c8247..481e16c 100644 --- a/runtime/src/main/java/org/capnproto/PackedOutputStream.java +++ b/runtime/src/main/java/org/capnproto/PackedOutputStream.java @@ -20,7 +20,6 @@ public final class PackedOutputStream implements WritableByteChannel { int inPtr = inBuf.position(); int inEnd = inPtr + length; while (inPtr < inEnd) { - if (out.remaining() < 10) { //# Oops, we're out of space. We need at least 10 //# bytes for the fast path, since we don't @@ -100,19 +99,15 @@ public final class PackedOutputStream implements WritableByteChannel { //# An all-zero word is followed by a count of //# consecutive zero words (not including the first //# one). - - inBuf.position(inPtr); - - long inWord = inBuf.getLong(); + int runStart = inPtr; int limit = inEnd; if (limit - inPtr > 255 * 8) { limit = inPtr + 255 * 8; } - while(inBuf.position() < limit && inWord == 0) { - inWord = inBuf.getLong(); + while(inPtr < limit && inBuf.getLong(inPtr) == 0){ + inPtr += 8; } - out.put((byte)((inBuf.position() - inPtr)/8 - 1)); - inPtr = inBuf.position() - 8; + out.put((byte)((inPtr - runStart)/8)); } else if (tag == (byte)0xff) { //# An all-nonzero word is followed by a count of @@ -184,6 +179,7 @@ public final class PackedOutputStream implements WritableByteChannel { this.inner.write(out); } + inBuf.position(inPtr); return length; } diff --git a/runtime/src/test/scala/org/capnproto/SerializePackedTest.scala b/runtime/src/test/scala/org/capnproto/SerializePackedTest.scala index b71cefe..97d3135 100644 --- a/runtime/src/test/scala/org/capnproto/SerializePackedTest.scala +++ b/runtime/src/test/scala/org/capnproto/SerializePackedTest.scala @@ -36,6 +36,7 @@ class SerializePackedSuite extends FunSuite { test("SimplePacking") { expectPacksTo(Array(), Array()); + expectPacksTo(Array(0,0,0,0,0,0,0,0), Array(0,0)); expectPacksTo(Array(0,0,12,0,0,34,0,0), Array(0x24,12,34)); expectPacksTo(Array(1,3,2,4,5,7,6,8), Array(0xff.toByte,1,3,2,4,5,7,6,8,0)); expectPacksTo(Array(0,0,0,0,0,0,0,0, 1,3,2,4,5,7,6,8),