avoiding allocations of PointerReader and PointerBuilder

This commit is contained in:
David Renshaw 2014-10-08 09:24:48 -04:00
parent b884ad11c4
commit dce3c46cf1
12 changed files with 75 additions and 36 deletions

View file

@ -981,16 +981,16 @@ private:
spaces(indent), " public ", type, ".Reader get", titleCase, "() {\n", spaces(indent), " public ", type, ".Reader get", titleCase, "() {\n",
unionDiscrim.check, unionDiscrim.check,
spaces(indent), " return ", type, ".factory.fromPointerReader(", spaces(indent), " return ",
"_getPointerField(", offset,"),", defaultParams, ");\n", "_getPointerField(", type, ".factory,", offset,",", defaultParams, ");\n",
spaces(indent), " }\n", "\n"), spaces(indent), " }\n", "\n"),
kj::strTree( kj::strTree(
kj::mv(unionDiscrim.builderIsDecl), kj::mv(unionDiscrim.builderIsDecl),
spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n", spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n",
unionDiscrim.check, unionDiscrim.check,
spaces(indent), " return ", type, ".factory.fromPointerBuilder(" spaces(indent), " return ",
"_getPointerField(", offset, "),", defaultParams,");\n", "_getPointerField(", type, ".factory, ", offset, ", ", defaultParams, ");\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n", spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n",
unionDiscrim.set, unionDiscrim.set,
@ -1069,8 +1069,7 @@ private:
spaces(indent), " public final ", readerClass, spaces(indent), " public final ", readerClass,
" get", titleCase, "() {\n", " get", titleCase, "() {\n",
spaces(indent), " return (", listFactory, ").fromPointerReader(_getPointerField(", offset, "),", spaces(indent), " return _getPointerField(", listFactory, ", ", offset, ", ", defaultParams, ");\n",
defaultParams, ");\n",
spaces(indent), " }\n", spaces(indent), " }\n",
"\n"), "\n"),
@ -1082,8 +1081,7 @@ private:
spaces(indent), " public final ", builderClass, spaces(indent), " public final ", builderClass,
" get", titleCase, "() {\n", " get", titleCase, "() {\n",
spaces(indent), " return (", listFactory, ").fromPointerBuilder(_getPointerField(", offset, "),", spaces(indent), " return _getPointerField(", listFactory, ", ", offset, ", ", defaultParams, ");\n",
defaultParams, ");\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final void set", titleCase, "(", readerClass, " value) {\n", spaces(indent), " public final void set", titleCase, "(", readerClass, " value) {\n",
@ -1301,9 +1299,10 @@ private:
true, true,
kj::strTree(spaces(indent), kj::strTree(spaces(indent),
"public static final ", typeName_, ".Reader ", upperCase, " =\n", "public static final ", typeName_, ".Reader ", upperCase, " =\n",
spaces(indent), " ", typeName_, ".factory.fromPointerReader" spaces(indent), " ",
"(new org.capnproto.PointerReader(Schemas.b_", "new org.capnproto.AnyPointer.Reader(new org.capnproto.PointerReader(Schemas.b_",
kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff), null, 0);\n") kj::hex(proto.getId()), ",", schema.getValueSchemaOffset(), ",0x7fffffff)).getAs(",
typeName_, ".factory);\n")
}; };
} }

View file

@ -10,7 +10,7 @@ public final class AnyPointer {
} }
public final <T> T getAs(FromPointerReader<T> factory) { public final <T> T getAs(FromPointerReader<T> factory) {
return factory.fromPointerReader(this.reader, null, 0); return factory.fromPointerReader(this.reader.segment, this.reader.pointer, null, 0, this.reader.nestingLimit);
} }
} }

View file

@ -1,5 +1,5 @@
package org.capnproto; package org.capnproto;
public interface FromPointerBuilder<T> { public interface FromPointerBuilder<T> {
T fromPointerBuilder(PointerBuilder builder, SegmentReader defaultSegment, int defaultOffset); T fromPointerBuilder(SegmentBuilder segment, int pointer, SegmentReader defaultSegment, int defaultOffset);
} }

View file

@ -1,5 +1,5 @@
package org.capnproto; package org.capnproto;
public interface FromPointerReader<T> { public interface FromPointerReader<T> {
T fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset); T fromPointerReader(SegmentReader segment, int pointer, SegmentReader defaultSegment, int defaultOffset, int nestingLimit);
} }

View file

@ -111,4 +111,10 @@ public class ListBuilder {
(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);
} }
protected final <T> T _getPointerElement(FromPointerBuilder<T> factory, int index, SegmentReader defaultSegment, int defaultOffset) {
return factory.fromPointerBuilder(
this.segment,
(this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD,
defaultSegment, defaultOffset);
}
} }

View file

@ -6,20 +6,22 @@ public abstract class ListFactory<Builder, Reader> implements ListBuilder.Factor
final byte elementSize; final byte elementSize;
ListFactory(byte elementSize) {this.elementSize = elementSize;} ListFactory(byte elementSize) {this.elementSize = elementSize;}
public final Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) { public final Reader fromPointerReader(SegmentReader segment, int pointer,
SegmentReader defaultSegment, int defaultOffset,
int nestingLimit) {
return WireHelpers.readListPointer(this, return WireHelpers.readListPointer(this,
reader.segment, segment,
reader.pointer, pointer,
defaultSegment, defaultSegment,
defaultOffset, defaultOffset,
this.elementSize, this.elementSize,
reader.nestingLimit); nestingLimit);
} }
public Builder fromPointerBuilder(PointerBuilder builder, SegmentReader defaultSegment, int defaultOffset) { public Builder fromPointerBuilder(SegmentBuilder segment, int pointer, SegmentReader defaultSegment, int defaultOffset) {
return WireHelpers.getWritableListPointer(this, return WireHelpers.getWritableListPointer(this,
builder.pointer, pointer,
builder.segment, segment,
this.elementSize, this.elementSize,
defaultSegment, defaultSegment,
defaultOffset); defaultOffset);

View file

@ -41,7 +41,7 @@ public final class ListList {
} }
public T get(int index) { public T get(int index) {
return this.factory.fromPointerReader(_getPointerElement(index), null, 0); return _getPointerElement(this.factory, index, null, 0);
} }
} }
@ -62,7 +62,7 @@ public final class ListList {
} }
public final T get(int index) { public final T get(int index) {
return this.factory.fromPointerBuilder(_getPointerElement(index), null, 0); return _getPointerElement(this.factory, index, null, 0);
} }
} }
} }

View file

@ -91,4 +91,12 @@ public class ListReader {
(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,
this.nestingLimit); 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,
defaultSegment,
defaultOffset,
this.nestingLimit);
}
} }

View file

@ -153,4 +153,8 @@ public class StructBuilder {
return new PointerBuilder(this.segment, this.pointers + index); return new PointerBuilder(this.segment, this.pointers + index);
} }
protected final <T> T _getPointerField(FromPointerBuilder<T> factory, int index, SegmentReader defaultSegment, int defaultOffset) {
return factory.fromPointerBuilder(this.segment, this.pointers + index, defaultSegment, defaultOffset);
}
} }

View file

@ -3,19 +3,22 @@ package org.capnproto;
public abstract class StructFactory<Builder, Reader> implements FromPointerBuilder<Builder>, StructBuilder.Factory<Builder>, public abstract class StructFactory<Builder, Reader> implements FromPointerBuilder<Builder>, StructBuilder.Factory<Builder>,
InitFromPointerBuilder<Builder>, InitFromPointerBuilder<Builder>,
FromPointerReader<Reader>, StructReader.Factory<Reader> { FromPointerReader<Reader>, StructReader.Factory<Reader> {
public Builder fromPointerBuilder(PointerBuilder builder, SegmentReader defaultSegment, int defaultOffset) { public final Reader fromPointerReader(SegmentReader segment, int pointer,
return WireHelpers.getWritableStructPointer(this, builder.pointer, builder.segment, this.structSize(), SegmentReader defaultSegment, int defaultOffset,
int nestingLimit) {
return WireHelpers.readStructPointer(this,
segment,
pointer,
defaultSegment, defaultOffset,
nestingLimit);
}
public final Builder fromPointerBuilder(SegmentBuilder segment, int pointer, SegmentReader defaultSegment, int defaultOffset) {
return WireHelpers.getWritableStructPointer(this, pointer, segment, this.structSize(),
defaultSegment, defaultOffset); defaultSegment, defaultOffset);
} }
public Builder initFromPointerBuilder(PointerBuilder builder) { public final Builder initFromPointerBuilder(PointerBuilder builder) {
return WireHelpers.initStructPointer(this, builder.pointer, builder.segment, this.structSize()); return WireHelpers.initStructPointer(this, builder.pointer, builder.segment, this.structSize());
} }
public Reader fromPointerReader(PointerReader reader, SegmentReader defaultSegment, int defaultOffset) {
return WireHelpers.readStructPointer(this,
reader.segment,
reader.pointer,
defaultSegment, defaultOffset,
reader.nestingLimit);
}
public abstract Reader asReader(Builder builder); public abstract Reader asReader(Builder builder);
} }

View file

@ -27,10 +27,11 @@ public final class StructList {
return new Builder<ElementBuilder> (factory, segment, ptr, elementCount, step, structDataSize, structPointerCount); return new Builder<ElementBuilder> (factory, segment, ptr, elementCount, step, structDataSize, structPointerCount);
} }
public final Builder<ElementBuilder> fromPointerBuilder(PointerBuilder builder, SegmentReader defaultSegment, int defaultOffset) { public final Builder<ElementBuilder> fromPointerBuilder(SegmentBuilder segment, int pointer,
SegmentReader defaultSegment, int defaultOffset) {
return WireHelpers.getWritableStructListPointer(this, return WireHelpers.getWritableStructListPointer(this,
builder.pointer, pointer,
builder.segment, segment,
factory.structSize(), factory.structSize(),
defaultSegment, defaultSegment,
defaultOffset); defaultOffset);

View file

@ -144,4 +144,20 @@ public class StructReader {
return new PointerReader(); return new PointerReader();
} }
} }
protected final <T> T _getPointerField(FromPointerReader<T> factory, int ptrIndex, SegmentReader defaultSegment, int defaultOffset) {
if (ptrIndex < this.pointerCount) {
return factory.fromPointerReader(this.segment,
this.pointers + ptrIndex,
defaultSegment,
defaultOffset,
this.nestingLimit);
} else {
return factory.fromPointerReader(SegmentReader.EMPTY,
0,
defaultSegment,
defaultOffset,
this.nestingLimit);
}
}
} }