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) {
case POINTER: return 1;
default: return 0;

View file

@ -552,7 +552,7 @@ final class WireHelpers {
}
resolved.segment.arena.checkReadLimit(StructPointer.wordSize(resolved.ref));
return setStructPointer(dstSegment, dstOffset,
new StructReader(srcSegment,
new StructReader(resolved.segment,
resolved.ptr,
resolved.ptr + StructPointer.dataSize(resolved.ref),
StructPointer.dataSize(resolved.ref) * Constants.BITS_PER_WORD,
@ -575,17 +575,44 @@ final class WireHelpers {
}
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 {
// ...
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 :
throw new Error("Far pointer should have been handled above.");
case WirePointer.OTHER :
}
throw new Error("copyPointer is unimplemented");
}
throw new Error("unreachable");
}
static <T> T readListPointer(ListReader.Factory<T> factory,
SegmentReader segment,