From 25c50b105d551221434ae810acb2132b9969b801 Mon Sep 17 00:00:00 2001 From: Vaci Koblizek Date: Thu, 3 Dec 2020 15:06:17 +0000 Subject: [PATCH] moar capTable context maintenance --- .../main/java/org/capnproto/ListBuilder.java | 7 ++++ .../main/java/org/capnproto/ListReader.java | 23 ++++++---- .../main/java/org/capnproto/StructList.java | 42 ++++++++++++++++++- .../main/java/org/capnproto/WireHelpers.java | 5 ++- 4 files changed, 67 insertions(+), 10 deletions(-) diff --git a/runtime/src/main/java/org/capnproto/ListBuilder.java b/runtime/src/main/java/org/capnproto/ListBuilder.java index 7af8840..19f3c59 100644 --- a/runtime/src/main/java/org/capnproto/ListBuilder.java +++ b/runtime/src/main/java/org/capnproto/ListBuilder.java @@ -49,12 +49,19 @@ public class ListBuilder extends Capability.BuilderContext { public ListBuilder(SegmentBuilder segment, int ptr, int elementCount, int step, int structDataSize, short structPointerCount) { + this(segment, null, ptr, elementCount, step, structDataSize, structPointerCount); + } + + public ListBuilder(SegmentBuilder segment, CapTableBuilder capTable, int ptr, + int elementCount, int step, + int structDataSize, short structPointerCount) { this.segment = segment; this.ptr = ptr; this.elementCount = elementCount; this.step = step; this.structDataSize = structDataSize; this.structPointerCount = structPointerCount; + this.capTable = capTable; } public int size() { diff --git a/runtime/src/main/java/org/capnproto/ListReader.java b/runtime/src/main/java/org/capnproto/ListReader.java index 79bb865..bf1f45c 100644 --- a/runtime/src/main/java/org/capnproto/ListReader.java +++ b/runtime/src/main/java/org/capnproto/ListReader.java @@ -28,9 +28,9 @@ public class ListReader extends Capability.ReaderContext { int elementCount, int step, int structDataSize, short structPointerCount, int nestingLimit); - default T constructReader(SegmentBuilder segment, CapTableReader capTable, int ptr, - int elementCount, int step, - int structDataSize, short structPointerCount, int nestingLimit) { + default T constructReader(SegmentReader segment, CapTableReader capTable, int ptr, + int elementCount, int step, + int structDataSize, short structPointerCount, int nestingLimit) { var result = constructReader(segment, ptr, elementCount, step, structDataSize, structPointerCount, nestingLimit); if (result instanceof Capability.ReaderContext) { ((Capability.ReaderContext) result).capTable = capTable; @@ -55,12 +55,22 @@ public class ListReader extends Capability.ReaderContext { this.structDataSize = 0; this.structPointerCount = 0; this.nestingLimit = 0x7fffffff; + this.capTable = null; } public ListReader(SegmentReader segment, int ptr, int elementCount, int step, int structDataSize, short structPointerCount, int nestingLimit) { + this(segment, null, ptr, elementCount, step, structDataSize, structPointerCount, nestingLimit); + } + + public ListReader(SegmentReader segment, + CapTableReader capTable, + int ptr, + int elementCount, int step, + int structDataSize, short structPointerCount, + int nestingLimit) { this.segment = segment; this.ptr = ptr; this.elementCount = elementCount; @@ -68,12 +78,11 @@ public class ListReader extends Capability.ReaderContext { this.structDataSize = structDataSize; this.structPointerCount = structPointerCount; this.nestingLimit = nestingLimit; + this.capTable = capTable; } ListReader imbue(CapTableReader capTable) { - var result = new ListReader(segment, ptr, elementCount, step, structDataSize, structPointerCount, nestingLimit); - result.capTable = capTable; - return result; + return new ListReader(segment, capTable, ptr, elementCount, step, structDataSize, structPointerCount, nestingLimit); } public int size() { @@ -117,7 +126,7 @@ public class ListReader extends Capability.ReaderContext { int structData = this.ptr + (int)(indexBit / Constants.BITS_PER_BYTE); int structPointers = structData + (this.structDataSize / Constants.BITS_PER_BYTE); - return factory.constructReader(this.segment, structData, structPointers / 8, this.structDataSize, + return factory.constructReader(this.segment, this.capTable, structData, structPointers / 8, this.structDataSize, this.structPointerCount, this.nestingLimit - 1); } diff --git a/runtime/src/main/java/org/capnproto/StructList.java b/runtime/src/main/java/org/capnproto/StructList.java index df80387..414fcb6 100644 --- a/runtime/src/main/java/org/capnproto/StructList.java +++ b/runtime/src/main/java/org/capnproto/StructList.java @@ -55,6 +55,27 @@ public final class StructList { return new Builder (factory, segment, ptr, elementCount, step, structDataSize, structPointerCount); } + @Override + public final Reader constructReader(SegmentReader segment, + CapTableReader capTable, + int ptr, + int elementCount, int step, + int structDataSize, short structPointerCount, + int nestingLimit) { + return new Reader(factory, capTable, + segment, ptr, elementCount, step, structDataSize, structPointerCount, nestingLimit); + } + + @Override + public final Builder constructBuilder(SegmentBuilder segment, + CapTableBuilder capTable, + int ptr, + int elementCount, int step, + int structDataSize, short structPointerCount) { + return new Builder (factory, capTable, + segment, ptr, elementCount, step, structDataSize, structPointerCount); + } + @Override public final Builder fromPointerBuilderRefDefault(SegmentBuilder segment, CapTableBuilder capTable, int pointer, SegmentReader defaultSegment, int defaultOffset) { @@ -97,6 +118,17 @@ public final class StructList { this.factory = factory; } + public Reader(StructReader.Factory factory, + CapTableReader capTable, + SegmentReader segment, + int ptr, + int elementCount, int step, + int structDataSize, short structPointerCount, + int nestingLimit) { + super(segment, capTable, ptr, elementCount, step, structDataSize, structPointerCount, nestingLimit); + this.factory = factory; + } + public T get(int index) { return _getStructElement(factory, index); } @@ -132,7 +164,15 @@ public final class StructList { SegmentBuilder segment, int ptr, int elementCount, int step, int structDataSize, short structPointerCount){ - super(segment, ptr, elementCount, step, structDataSize, structPointerCount); + this(factory, null, segment, ptr, elementCount, step, structDataSize, structPointerCount); + } + + public Builder(StructBuilder.Factory factory, + CapTableBuilder capTable, + SegmentBuilder segment, int ptr, + int elementCount, int step, + int structDataSize, short structPointerCount) { + super(segment, capTable, ptr, elementCount, step, structDataSize, structPointerCount); this.factory = factory; } diff --git a/runtime/src/main/java/org/capnproto/WireHelpers.java b/runtime/src/main/java/org/capnproto/WireHelpers.java index 956883e..6ca38a2 100644 --- a/runtime/src/main/java/org/capnproto/WireHelpers.java +++ b/runtime/src/main/java/org/capnproto/WireHelpers.java @@ -1222,7 +1222,7 @@ final class WireHelpers { if (WirePointer.isNull(ref)) { if (defaultSegment == null) { - return factory.constructReader(SegmentReader.EMPTY, 0, 0, 0, 0, (short) 0, 0x7fffffff); + return factory.constructReader(SegmentReader.EMPTY, capTable, 0, 0, 0, 0, (short) 0, 0x7fffffff); } else { segment = defaultSegment; refOffset = defaultOffset; @@ -1264,7 +1264,7 @@ final class WireHelpers { // TODO check whether the size is compatible - return factory.constructReader(resolved.segment, + return factory.constructReader(resolved.segment, capTable, ptr * Constants.BYTES_PER_WORD, size, wordsPerElement * Constants.BITS_PER_WORD, @@ -1311,6 +1311,7 @@ final class WireHelpers { } return factory.constructReader(resolved.segment, + capTable, resolved.ptr * Constants.BYTES_PER_WORD, ListPointer.elementCount(resolved.ref), step,