diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index 86b9b1b..fd542ec 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -935,13 +935,13 @@ private: kj::mv(unionDiscrim.readerIsDecl), spaces(indent), " public boolean has", titleCase, "() {\n", unionDiscrim.has, - spaces(indent), " return !_getPointerField(", offset, ").isNull();\n", + spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n", spaces(indent), " }\n", spaces(indent), " public org.capnproto.AnyPointer.Reader get", titleCase, "() {\n", unionDiscrim.check, - spaces(indent), " return new org.capnproto.AnyPointer.Reader(_getPointerField(", - offset,"));\n", + spaces(indent), " return new org.capnproto.AnyPointer.Reader(this.segment, this.pointers + ", offset, + ", this.nestingLimit);\n", spaces(indent), " }\n"), kj::strTree( @@ -976,7 +976,7 @@ private: kj::strTree( kj::mv(unionDiscrim.readerIsDecl), spaces(indent), " public boolean has", titleCase, "() {\n", - spaces(indent), " return !_getPointerField(", offset, ").isNull();\n", + spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n", spaces(indent), " }\n", spaces(indent), " public ", type, ".Reader get", titleCase, "() {\n", @@ -1018,7 +1018,7 @@ private: kj::mv(unionDiscrim.readerIsDecl), spaces(indent), " public boolean has", titleCase, "() {\n", unionDiscrim.has, - spaces(indent), " return !_getPointerField(", offset, ").isNull();\n", + spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n", spaces(indent), " }\n", spaces(indent), " public ", type, ".Reader", @@ -1065,7 +1065,7 @@ private: kj::strTree( kj::mv(unionDiscrim.readerIsDecl), spaces(indent), " public final boolean has", titleCase, "() {\n", - spaces(indent), " return !_getPointerField(", offset, ").isNull();\n", + spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n", spaces(indent), " }\n", spaces(indent), " public final ", readerClass, @@ -1301,8 +1301,8 @@ private: kj::strTree(spaces(indent), "public static final ", typeName_, ".Reader ", upperCase, " =\n", spaces(indent), " ", - "new org.capnproto.AnyPointer.Reader(new org.capnproto.PointerReader(Schemas.b_", - kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff)).getAs(", + "new org.capnproto.AnyPointer.Reader(Schemas.b_", + kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff).getAs(", typeName_, ".factory);\n") }; } @@ -1315,8 +1315,8 @@ private: spaces(indent), "public static final ", constType, ' ', upperCase, " =\n", spaces(indent), " (", - "new org.capnproto.AnyPointer.Reader(new org.capnproto.PointerReader(Schemas.b_", - kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff)).getAs(", + "new org.capnproto.AnyPointer.Reader(Schemas.b_", + kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff).getAs(", makeListFactoryArg(type), "));\n") }; } diff --git a/runtime/src/main/java/org/capnproto/AnyPointer.java b/runtime/src/main/java/org/capnproto/AnyPointer.java index 41d7534..09e81e1 100644 --- a/runtime/src/main/java/org/capnproto/AnyPointer.java +++ b/runtime/src/main/java/org/capnproto/AnyPointer.java @@ -3,14 +3,18 @@ package org.capnproto; public final class AnyPointer { public final static class Reader { - public final PointerReader reader; + final SegmentReader segment; + final int pointer; + final int nestingLimit; - public Reader(PointerReader reader) { - this.reader = reader; + public Reader(SegmentReader segment, int pointer, int nestingLimit) { + this.segment = segment; + this.pointer = pointer; + this.nestingLimit = nestingLimit; } public final T getAs(FromPointerReader factory) { - return factory.fromPointerReader(this.reader.segment, this.reader.pointer, null, 0, this.reader.nestingLimit); + return factory.fromPointerReader(this.segment, this.pointer, null, 0, this.nestingLimit); } } diff --git a/runtime/src/main/java/org/capnproto/ListReader.java b/runtime/src/main/java/org/capnproto/ListReader.java index e2a4bf6..9bcbdb4 100644 --- a/runtime/src/main/java/org/capnproto/ListReader.java +++ b/runtime/src/main/java/org/capnproto/ListReader.java @@ -86,12 +86,6 @@ public class ListReader { this.structPointerCount, (byte) (indexBit % 8), this.nestingLimit - 1); } - protected PointerReader _getPointerElement(int index) { - return new PointerReader(this.segment, - (this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD, - this.nestingLimit); - } - protected T _getPointerElement(FromPointerReader factory, int index, SegmentReader defaultSegment, int defaultOffset) { return factory.fromPointerReader(this.segment, (this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD, diff --git a/runtime/src/main/java/org/capnproto/MessageReader.java b/runtime/src/main/java/org/capnproto/MessageReader.java index 0749beb..1dd29b6 100644 --- a/runtime/src/main/java/org/capnproto/MessageReader.java +++ b/runtime/src/main/java/org/capnproto/MessageReader.java @@ -11,9 +11,7 @@ public final class MessageReader { public T getRoot(FromPointerReader factory) { SegmentReader segment = this.arena.tryGetSegment(0); - PointerReader pointerReader = PointerReader.getRoot(segment, 0, - 0x7fffffff /* XXX */); - AnyPointer.Reader any = new AnyPointer.Reader(pointerReader); + AnyPointer.Reader any = new AnyPointer.Reader(segment, 0, 0x7fffffff); return any.getAs(factory); } } diff --git a/runtime/src/main/java/org/capnproto/PointerReader.java b/runtime/src/main/java/org/capnproto/PointerReader.java deleted file mode 100644 index 0604b7a..0000000 --- a/runtime/src/main/java/org/capnproto/PointerReader.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.capnproto; - -public final class PointerReader { - final SegmentReader segment; - final int pointer; // word offset - final int nestingLimit; - - public PointerReader() { - this.segment = SegmentReader.EMPTY; - this.pointer = 0; - this.nestingLimit = 0x7fffffff; - } - - public PointerReader(SegmentReader segment, int pointer, int nestingLimit) { - this.segment = segment; - this.pointer = pointer; - this.nestingLimit = nestingLimit; - } - - public static PointerReader getRoot(SegmentReader segment, - int location, - int nestingLimit) { - // TODO bounds check - return new PointerReader(segment, location, nestingLimit); - } - - public boolean isNull() { - return this.segment.buffer.getLong(this.pointer) == 0; - } -} diff --git a/runtime/src/main/java/org/capnproto/StructReader.java b/runtime/src/main/java/org/capnproto/StructReader.java index b017d62..d73e6cd 100644 --- a/runtime/src/main/java/org/capnproto/StructReader.java +++ b/runtime/src/main/java/org/capnproto/StructReader.java @@ -135,14 +135,8 @@ public class StructReader { } } - protected final PointerReader _getPointerField(int ptrIndex) { - if (ptrIndex < this.pointerCount) { - return new PointerReader(this.segment, - this.pointers + ptrIndex, - this.nestingLimit); - } else { - return new PointerReader(); - } + protected final boolean _pointerFieldIsNull(int ptrIndex) { + return this.segment.buffer.getLong(this.pointers + ptrIndex) == 0; } protected final T _getPointerField(FromPointerReader factory, int ptrIndex, SegmentReader defaultSegment, int defaultOffset) { diff --git a/runtime/src/test/scala/org/capnproto/LayoutTest.scala b/runtime/src/test/scala/org/capnproto/LayoutTest.scala index 9da3a99..729378e 100644 --- a/runtime/src/test/scala/org/capnproto/LayoutTest.scala +++ b/runtime/src/test/scala/org/capnproto/LayoutTest.scala @@ -22,11 +22,10 @@ class LayoutSuite extends FunSuite { buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN); val arena = new ReaderArena(Array(buffer)); - val pointerReader = new PointerReader(arena.tryGetSegment(0), 0, 0x7fffffff); val reader = WireHelpers.readStructPointer(new BareStructReader(), - pointerReader.segment, - pointerReader.pointer, null, 0, 0x7fffffff); + arena.tryGetSegment(0), + 0, null, 0, 0x7fffffff); assert(reader._getLongField(0) === 0xefcdab8967452301L); assert(reader._getLongField(1) === 0L);