get rid of PointerReader
This commit is contained in:
parent
1cef64e2da
commit
b876c52ecd
7 changed files with 23 additions and 64 deletions
|
@ -935,13 +935,13 @@ private:
|
||||||
kj::mv(unionDiscrim.readerIsDecl),
|
kj::mv(unionDiscrim.readerIsDecl),
|
||||||
spaces(indent), " public boolean has", titleCase, "() {\n",
|
spaces(indent), " public boolean has", titleCase, "() {\n",
|
||||||
unionDiscrim.has,
|
unionDiscrim.has,
|
||||||
spaces(indent), " return !_getPointerField(", offset, ").isNull();\n",
|
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n",
|
||||||
spaces(indent), " }\n",
|
spaces(indent), " }\n",
|
||||||
|
|
||||||
spaces(indent), " public org.capnproto.AnyPointer.Reader get", titleCase, "() {\n",
|
spaces(indent), " public org.capnproto.AnyPointer.Reader get", titleCase, "() {\n",
|
||||||
unionDiscrim.check,
|
unionDiscrim.check,
|
||||||
spaces(indent), " return new org.capnproto.AnyPointer.Reader(_getPointerField(",
|
spaces(indent), " return new org.capnproto.AnyPointer.Reader(this.segment, this.pointers + ", offset,
|
||||||
offset,"));\n",
|
", this.nestingLimit);\n",
|
||||||
spaces(indent), " }\n"),
|
spaces(indent), " }\n"),
|
||||||
|
|
||||||
kj::strTree(
|
kj::strTree(
|
||||||
|
@ -976,7 +976,7 @@ private:
|
||||||
kj::strTree(
|
kj::strTree(
|
||||||
kj::mv(unionDiscrim.readerIsDecl),
|
kj::mv(unionDiscrim.readerIsDecl),
|
||||||
spaces(indent), " public boolean has", titleCase, "() {\n",
|
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), " }\n",
|
||||||
|
|
||||||
spaces(indent), " public ", type, ".Reader get", titleCase, "() {\n",
|
spaces(indent), " public ", type, ".Reader get", titleCase, "() {\n",
|
||||||
|
@ -1018,7 +1018,7 @@ private:
|
||||||
kj::mv(unionDiscrim.readerIsDecl),
|
kj::mv(unionDiscrim.readerIsDecl),
|
||||||
spaces(indent), " public boolean has", titleCase, "() {\n",
|
spaces(indent), " public boolean has", titleCase, "() {\n",
|
||||||
unionDiscrim.has,
|
unionDiscrim.has,
|
||||||
spaces(indent), " return !_getPointerField(", offset, ").isNull();\n",
|
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n",
|
||||||
spaces(indent), " }\n",
|
spaces(indent), " }\n",
|
||||||
|
|
||||||
spaces(indent), " public ", type, ".Reader",
|
spaces(indent), " public ", type, ".Reader",
|
||||||
|
@ -1065,7 +1065,7 @@ private:
|
||||||
kj::strTree(
|
kj::strTree(
|
||||||
kj::mv(unionDiscrim.readerIsDecl),
|
kj::mv(unionDiscrim.readerIsDecl),
|
||||||
spaces(indent), " public final boolean has", titleCase, "() {\n",
|
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), " }\n",
|
||||||
|
|
||||||
spaces(indent), " public final ", readerClass,
|
spaces(indent), " public final ", readerClass,
|
||||||
|
@ -1301,8 +1301,8 @@ private:
|
||||||
kj::strTree(spaces(indent),
|
kj::strTree(spaces(indent),
|
||||||
"public static final ", typeName_, ".Reader ", upperCase, " =\n",
|
"public static final ", typeName_, ".Reader ", upperCase, " =\n",
|
||||||
spaces(indent), " ",
|
spaces(indent), " ",
|
||||||
"new org.capnproto.AnyPointer.Reader(new org.capnproto.PointerReader(Schemas.b_",
|
"new org.capnproto.AnyPointer.Reader(Schemas.b_",
|
||||||
kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff)).getAs(",
|
kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff).getAs(",
|
||||||
typeName_, ".factory);\n")
|
typeName_, ".factory);\n")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1315,8 +1315,8 @@ private:
|
||||||
spaces(indent),
|
spaces(indent),
|
||||||
"public static final ", constType, ' ', upperCase, " =\n",
|
"public static final ", constType, ' ', upperCase, " =\n",
|
||||||
spaces(indent), " (",
|
spaces(indent), " (",
|
||||||
"new org.capnproto.AnyPointer.Reader(new org.capnproto.PointerReader(Schemas.b_",
|
"new org.capnproto.AnyPointer.Reader(Schemas.b_",
|
||||||
kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff)).getAs(",
|
kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff).getAs(",
|
||||||
makeListFactoryArg(type), "));\n")
|
makeListFactoryArg(type), "));\n")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,14 +3,18 @@ package org.capnproto;
|
||||||
public final class AnyPointer {
|
public final class AnyPointer {
|
||||||
|
|
||||||
public final static class Reader {
|
public final static class Reader {
|
||||||
public final PointerReader reader;
|
final SegmentReader segment;
|
||||||
|
final int pointer;
|
||||||
|
final int nestingLimit;
|
||||||
|
|
||||||
public Reader(PointerReader reader) {
|
public Reader(SegmentReader segment, int pointer, int nestingLimit) {
|
||||||
this.reader = reader;
|
this.segment = segment;
|
||||||
|
this.pointer = pointer;
|
||||||
|
this.nestingLimit = nestingLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final <T> T getAs(FromPointerReader<T> factory) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,12 +86,6 @@ public class ListReader {
|
||||||
this.structPointerCount, (byte) (indexBit % 8), this.nestingLimit - 1);
|
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) {
|
protected <T> T _getPointerElement(FromPointerReader<T> factory, int index, SegmentReader defaultSegment, int defaultOffset) {
|
||||||
return factory.fromPointerReader(this.segment,
|
return factory.fromPointerReader(this.segment,
|
||||||
(this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD,
|
(this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD,
|
||||||
|
|
|
@ -11,9 +11,7 @@ public final class MessageReader {
|
||||||
|
|
||||||
public <T> T getRoot(FromPointerReader<T> factory) {
|
public <T> T getRoot(FromPointerReader<T> factory) {
|
||||||
SegmentReader segment = this.arena.tryGetSegment(0);
|
SegmentReader segment = this.arena.tryGetSegment(0);
|
||||||
PointerReader pointerReader = PointerReader.getRoot(segment, 0,
|
AnyPointer.Reader any = new AnyPointer.Reader(segment, 0, 0x7fffffff);
|
||||||
0x7fffffff /* XXX */);
|
|
||||||
AnyPointer.Reader any = new AnyPointer.Reader(pointerReader);
|
|
||||||
return any.getAs(factory);
|
return any.getAs(factory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -135,14 +135,8 @@ public class StructReader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final PointerReader _getPointerField(int ptrIndex) {
|
protected final boolean _pointerFieldIsNull(int ptrIndex) {
|
||||||
if (ptrIndex < this.pointerCount) {
|
return this.segment.buffer.getLong(this.pointers + ptrIndex) == 0;
|
||||||
return new PointerReader(this.segment,
|
|
||||||
this.pointers + ptrIndex,
|
|
||||||
this.nestingLimit);
|
|
||||||
} else {
|
|
||||||
return new PointerReader();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final <T> T _getPointerField(FromPointerReader<T> factory, int ptrIndex, SegmentReader defaultSegment, int defaultOffset) {
|
protected final <T> T _getPointerField(FromPointerReader<T> factory, int ptrIndex, SegmentReader defaultSegment, int defaultOffset) {
|
||||||
|
|
|
@ -22,11 +22,10 @@ class LayoutSuite extends FunSuite {
|
||||||
buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN);
|
buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN);
|
||||||
|
|
||||||
val arena = new ReaderArena(Array(buffer));
|
val arena = new ReaderArena(Array(buffer));
|
||||||
val pointerReader = new PointerReader(arena.tryGetSegment(0), 0, 0x7fffffff);
|
|
||||||
|
|
||||||
val reader = WireHelpers.readStructPointer(new BareStructReader(),
|
val reader = WireHelpers.readStructPointer(new BareStructReader(),
|
||||||
pointerReader.segment,
|
arena.tryGetSegment(0),
|
||||||
pointerReader.pointer, null, 0, 0x7fffffff);
|
0, null, 0, 0x7fffffff);
|
||||||
|
|
||||||
assert(reader._getLongField(0) === 0xefcdab8967452301L);
|
assert(reader._getLongField(0) === 0xefcdab8967452301L);
|
||||||
assert(reader._getLongField(1) === 0L);
|
assert(reader._getLongField(1) === 0L);
|
||||||
|
|
Loading…
Reference in a new issue