diff --git a/compiler/src/test/scala/org/capnproto/EncodingTest.scala b/compiler/src/test/scala/org/capnproto/EncodingTest.scala index 48a3a4e..3bb8fc1 100644 --- a/compiler/src/test/scala/org/capnproto/EncodingTest.scala +++ b/compiler/src/test/scala/org/capnproto/EncodingTest.scala @@ -12,6 +12,7 @@ class EncodingSuite extends FunSuite { val allTypes = message.initRoot(TestAllTypes.Builder.factory); TestUtil.initTestMessage(allTypes); TestUtil.checkTestMessage(allTypes); + //TestUtil.checkTestMessage(allTypes.asReader()); } test("AllTypesMultiSegment") { diff --git a/compiler/src/test/scala/org/capnproto/TestUtil.scala b/compiler/src/test/scala/org/capnproto/TestUtil.scala index 4813a55..eca6983 100644 --- a/compiler/src/test/scala/org/capnproto/TestUtil.scala +++ b/compiler/src/test/scala/org/capnproto/TestUtil.scala @@ -89,4 +89,44 @@ object TestUtil { assert(builder.getVoidList().size() == 6); } + def checkTestMessage(reader : TestAllTypes.Reader) { + reader.getVoidField(); + assert(reader.getBoolField() == true); + assert(reader.getInt8Field() == -123); + assert(reader.getInt16Field() == -12345); + assert(reader.getInt32Field() == -12345678); + assert(reader.getInt64Field() == -123456789012345L); + assert(reader.getUInt8Field() == 0xef.toByte); + assert(reader.getUInt16Field() == 0x4567); + assert(reader.getUInt32Field() == 0x34567890); + assert(reader.getUInt64Field() == 0x1234567890123456L); + assert(reader.getFloat32Field() == 1234.5f); + assert(reader.getFloat64Field() == -123e45); + assert(reader.getTextField().toString() == "foo"); + + { + val subReader = reader.getStructField(); + subReader.getVoidField(); + assert(subReader.getBoolField() == true); + assert(subReader.getInt8Field() == -12); + assert(subReader.getInt16Field() == 3456); + assert(subReader.getInt32Field() == -78901234); + assert(subReader.getInt64Field() == 56789012345678L); + assert(subReader.getUInt8Field() == 90); + assert(subReader.getUInt16Field() == 1234); + assert(subReader.getUInt32Field() == 56789012); + assert(subReader.getUInt64Field() == 345678901234567890L); + assert(subReader.getFloat32Field() == -1.25e-10f); + assert(subReader.getFloat64Field() == 345); + + { + val subSubReader = subReader.getStructField(); + assert(subSubReader.getTextField().toString() == "nested") + } + } + + assert(reader.getVoidList().size() == 6); + } + + } diff --git a/runtime/src/main/java/org/capnproto/BuilderArena.java b/runtime/src/main/java/org/capnproto/BuilderArena.java index 6e7e61f..ff17f79 100644 --- a/runtime/src/main/java/org/capnproto/BuilderArena.java +++ b/runtime/src/main/java/org/capnproto/BuilderArena.java @@ -33,7 +33,7 @@ public final class BuilderArena implements Arena { } public SegmentReader tryGetSegment(int id) { - throw new Error("unimplemented"); + return this.segments.get(id); } public SegmentBuilder getSegment(int id) { return this.segments.get(id); diff --git a/runtime/src/main/java/org/capnproto/InputStreamMessageReader.java b/runtime/src/main/java/org/capnproto/InputStreamMessageReader.java index 489b865..5435d0b 100644 --- a/runtime/src/main/java/org/capnproto/InputStreamMessageReader.java +++ b/runtime/src/main/java/org/capnproto/InputStreamMessageReader.java @@ -4,7 +4,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.util.Vector; +import java.util.ArrayList; public final class InputStreamMessageReader { @@ -47,7 +47,7 @@ public final class InputStreamMessageReader { } // in words - Vector moreSizes = new Vector(); + ArrayList moreSizes = new ArrayList(); if (segmentCount > 1) { ByteBuffer moreSizesRaw = makeByteBuffer(readExact(is, 4 * (segmentCount & ~1))); diff --git a/runtime/src/main/java/org/capnproto/MessageReader.java b/runtime/src/main/java/org/capnproto/MessageReader.java index 3aed7ce..fa2e564 100644 --- a/runtime/src/main/java/org/capnproto/MessageReader.java +++ b/runtime/src/main/java/org/capnproto/MessageReader.java @@ -3,14 +3,14 @@ package org.capnproto; import java.nio.ByteBuffer; public final class MessageReader { - final ByteBuffer[] segmentSlices; + final ReaderArena arena; public MessageReader(ByteBuffer[] segmentSlices) { - this.segmentSlices = segmentSlices; + this.arena = new ReaderArena(segmentSlices); } public T getRoot(FromStructReader factory) { - SegmentReader segment = new SegmentReader(this.segmentSlices[0], new ReaderArena()); + SegmentReader segment = this.arena.tryGetSegment(0); PointerReader pointerReader = PointerReader.getRoot(segment, 0, 0x7fffffff /* XXX */); AnyPointer.Reader any = new AnyPointer.Reader(pointerReader); diff --git a/runtime/src/main/java/org/capnproto/ReaderArena.java b/runtime/src/main/java/org/capnproto/ReaderArena.java index a90d740..c40fc1b 100644 --- a/runtime/src/main/java/org/capnproto/ReaderArena.java +++ b/runtime/src/main/java/org/capnproto/ReaderArena.java @@ -1,7 +1,20 @@ package org.capnproto; +import java.util.ArrayList; +import java.nio.ByteBuffer; + public final class ReaderArena implements Arena { + + public final ArrayList segments; + + public ReaderArena(ByteBuffer[] segmentSlices) { + this.segments = new ArrayList(); + for(int ii = 0; ii < segmentSlices.length; ++ii) { + this.segments.add(new SegmentReader(segmentSlices[ii], this)); + } + } + public SegmentReader tryGetSegment(int id) { - throw new Error("unimplemented"); + return segments.get(id); } } diff --git a/runtime/src/test/scala/org/capnproto/LayoutTest.scala b/runtime/src/test/scala/org/capnproto/LayoutTest.scala index fa1b639..c7ac0c2 100644 --- a/runtime/src/test/scala/org/capnproto/LayoutTest.scala +++ b/runtime/src/test/scala/org/capnproto/LayoutTest.scala @@ -13,7 +13,8 @@ class LayoutSuite extends FunSuite { val buffer = java.nio.ByteBuffer.wrap(data); buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN); - val pointerReader = new PointerReader(new SegmentReader(buffer, new ReaderArena()), 0, 0x7fffffff); + val arena = new ReaderArena(Array(buffer)); + val pointerReader = new PointerReader(arena.tryGetSegment(0), 0, 0x7fffffff); val reader = pointerReader.getStruct(); assert(reader.getLongField(0) === 0xefcdab8967452301L);