get rid of PointerReader

This commit is contained in:
David Renshaw 2014-10-08 11:12:52 -04:00
parent 1cef64e2da
commit b876c52ecd
7 changed files with 23 additions and 64 deletions

View file

@ -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")
};
}

View file

@ -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> T getAs(FromPointerReader<T> 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);
}
}

View file

@ -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> T _getPointerElement(FromPointerReader<T> 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,

View file

@ -11,9 +11,7 @@ public final class MessageReader {
public <T> T getRoot(FromPointerReader<T> 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);
}
}

View file

@ -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;
}
}

View file

@ -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> T _getPointerField(FromPointerReader<T> factory, int ptrIndex, SegmentReader defaultSegment, int defaultOffset) {

View file

@ -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);