more copyPointer

This commit is contained in:
David Renshaw 2014-10-15 20:25:45 -04:00
parent 1ab3601bf0
commit 561ca944c8
2 changed files with 33 additions and 6 deletions

View file

@ -45,7 +45,7 @@ public final class ElementSize {
} }
} }
public static final int pointersPerElement(byte size) { public static final short pointersPerElement(byte size) {
switch (size) { switch (size) {
case POINTER: return 1; case POINTER: return 1;
default: return 0; default: return 0;

View file

@ -552,7 +552,7 @@ final class WireHelpers {
} }
resolved.segment.arena.checkReadLimit(StructPointer.wordSize(resolved.ref)); resolved.segment.arena.checkReadLimit(StructPointer.wordSize(resolved.ref));
return setStructPointer(dstSegment, dstOffset, return setStructPointer(dstSegment, dstOffset,
new StructReader(srcSegment, new StructReader(resolved.segment,
resolved.ptr, resolved.ptr,
resolved.ptr + StructPointer.dataSize(resolved.ref), resolved.ptr + StructPointer.dataSize(resolved.ref),
StructPointer.dataSize(resolved.ref) * Constants.BITS_PER_WORD, StructPointer.dataSize(resolved.ref) * Constants.BITS_PER_WORD,
@ -575,17 +575,44 @@ final class WireHelpers {
} }
int elementCount = WirePointer.inlineCompositeListElementCount(tag); int elementCount = WirePointer.inlineCompositeListElementCount(tag);
// ... int wordsPerElement = StructPointer.wordSize(tag);
if (wordsPerElement * elementCount > wordCount) {
throw new DecodeException("INLINE_COMPOSITE list's elements overrun its word count.");
}
return setListPointer(dstSegment, dstOffset,
new ListReader(resolved.segment,
resolved.ptr,
elementCount,
wordsPerElement * Constants.BITS_PER_WORD,
StructPointer.dataSize(resolved.ref) * Constants.BITS_PER_WORD,
StructPointer.ptrCount(resolved.ref),
nestingLimit - 1));
} else { } else {
// ... int dataSize = ElementSize.dataBitsPerElement(elementSize);
short pointerCount = ElementSize.pointersPerElement(elementSize);
int step = dataSize + pointerCount * Constants.BITS_PER_POINTER;
int elementCount = ListPointer.elementCount(resolved.ref);
int wordCount = roundBitsUpToWords((long) elementCount * step);
resolved.segment.arena.checkReadLimit(wordCount);
return setListPointer(dstSegment, dstOffset,
new ListReader(resolved.segment,
resolved.ptr,
elementCount,
step,
dataSize,
pointerCount,
nestingLimit - 1));
} }
case WirePointer.FAR : case WirePointer.FAR :
throw new Error("Far pointer should have been handled above.");
case WirePointer.OTHER : case WirePointer.OTHER :
}
throw new Error("copyPointer is unimplemented"); throw new Error("copyPointer is unimplemented");
} }
throw new Error("unreachable");
}
static <T> T readListPointer(ListReader.Factory<T> factory, static <T> T readListPointer(ListReader.Factory<T> factory,
SegmentReader segment, SegmentReader segment,