ensure StructBuilders and StructLists maintain capTable context

This commit is contained in:
Vaci Koblizek 2020-12-03 14:19:35 +00:00
parent f74ad80dea
commit 196b82515c
5 changed files with 19 additions and 17 deletions

View file

@ -1,6 +1,6 @@
package org.capnproto;
interface CapTableBuilder extends CapTableReader {
public interface CapTableBuilder extends CapTableReader {
int injectCap(ClientHook cap);
void dropCap(int index);

View file

@ -10,12 +10,12 @@ public final class Capability {
static final Object NULL_CAPABILITY_BRAND = new Object();
static final Object BROKEN_CAPABILITY_BRAND = new Object();
static class BuilderContext {
CapTableBuilder capTable;
public static class BuilderContext {
public CapTableBuilder capTable;
}
static class ReaderContext {
CapTableReader capTable;
public static class ReaderContext {
public CapTableReader capTable;
}
public static abstract class Factory<T extends ClientBase>

View file

@ -44,11 +44,17 @@ public class StructBuilder extends Capability.BuilderContext {
public StructBuilder(SegmentBuilder segment, int data,
int pointers, int dataSize, short pointerCount) {
this(segment, null, data, pointers, dataSize, pointerCount);
}
public StructBuilder(SegmentBuilder segment, CapTableBuilder capTable, int data,
int pointers, int dataSize, short pointerCount) {
this.segment = segment;
this.data = data;
this.pointers = pointers;
this.dataSize = dataSize;
this.pointerCount = pointerCount;
this.capTable = capTable;
}
protected final boolean _getBooleanField(int offset) {

View file

@ -51,17 +51,13 @@ public class StructReader extends Capability.ReaderContext {
this.dataSize = 0;
this.pointerCount = 0;
this.nestingLimit = 0x7fffffff;
this.capTable = null;
}
public StructReader(SegmentReader segment, int data,
int pointers, int dataSize, short pointerCount,
int nestingLimit) {
this.segment = segment;
this.data = data;
this.pointers = pointers;
this.dataSize = dataSize;
this.pointerCount = pointerCount;
this.nestingLimit = nestingLimit;
this(segment, null, data, pointers, dataSize, pointerCount, nestingLimit);
}
public StructReader(SegmentReader segment, CapTableReader capTable,

View file

@ -503,7 +503,7 @@ final class WireHelpers {
ListPointer.set(allocation.segment.buffer, allocation.refOffset, elementSize, elementCount);
return factory.constructBuilder(allocation.segment,
return factory.constructBuilder(allocation.segment, capTable,
allocation.ptr * Constants.BYTES_PER_WORD,
elementCount, step, dataSize, (short)pointerCount);
}
@ -527,7 +527,7 @@ final class WireHelpers {
WirePointer.STRUCT, elementCount);
StructPointer.setFromStructSize(allocation.segment.buffer, allocation.ptr, elementSize);
return factory.constructBuilder(allocation.segment,
return factory.constructBuilder(allocation.segment, capTable,
(allocation.ptr + 1) * Constants.BYTES_PER_WORD,
elementCount, wordsPerElement * Constants.BITS_PER_WORD,
elementSize.data * Constants.BITS_PER_WORD, elementSize.pointers);
@ -586,7 +586,7 @@ final class WireHelpers {
int step = dataSize + pointerCount * Constants.BITS_PER_POINTER;
return factory.constructBuilder(resolved.segment, resolved.ptr * Constants.BYTES_PER_WORD,
return factory.constructBuilder(resolved.segment, capTable, resolved.ptr * Constants.BYTES_PER_WORD,
ListPointer.elementCount(resolved.ref),
step, dataSize, (short) pointerCount);
}
@ -629,7 +629,7 @@ final class WireHelpers {
if (oldDataSize >= elementSize.data && oldPointerCount >= elementSize.pointers) {
//# Old size is at least as large as we need. Ship it.
return factory.constructBuilder(resolved.segment, oldPtr * Constants.BYTES_PER_WORD,
return factory.constructBuilder(resolved.segment, capTable, oldPtr * Constants.BYTES_PER_WORD,
elementCount,
oldStep * Constants.BITS_PER_WORD,
oldDataSize * Constants.BITS_PER_WORD, oldPointerCount);
@ -685,7 +685,7 @@ final class WireHelpers {
memset(resolved.segment.buffer, resolved.ptr * Constants.BYTES_PER_WORD,
(byte)0, (1 + oldStep * elementCount) * Constants.BYTES_PER_WORD);
return factory.constructBuilder(allocation.segment, newPtr * Constants.BYTES_PER_WORD,
return factory.constructBuilder(allocation.segment, capTable, newPtr * Constants.BYTES_PER_WORD,
elementCount,
newStep * Constants.BITS_PER_WORD,
newDataSize * Constants.BITS_PER_WORD,
@ -764,7 +764,7 @@ final class WireHelpers {
memset(resolved.segment.buffer, resolved.ptr * Constants.BYTES_PER_WORD,
(byte)0, roundBitsUpToBytes(oldStep * elementCount));
return factory.constructBuilder(allocation.segment, newPtr * Constants.BYTES_PER_WORD,
return factory.constructBuilder(allocation.segment, capTable, newPtr * Constants.BYTES_PER_WORD,
elementCount,
newStep * Constants.BITS_PER_WORD,
newDataSize * Constants.BITS_PER_WORD,