allow copyPointer to copy capabilities

This commit is contained in:
Vaci Koblizek 2020-11-09 17:29:00 +00:00
parent 7b79ab8ab2
commit f640a8ffd4

View file

@ -1127,6 +1127,7 @@ final class WireHelpers {
resolved.segment.arena.checkReadLimit(StructPointer.wordSize(resolved.ref)); resolved.segment.arena.checkReadLimit(StructPointer.wordSize(resolved.ref));
return setStructPointer(dstSegment, dstCapTable, dstOffset, return setStructPointer(dstSegment, dstCapTable, dstOffset,
new StructReader(resolved.segment, new StructReader(resolved.segment,
srcCapTable,
resolved.ptr * Constants.BYTES_PER_WORD, resolved.ptr * Constants.BYTES_PER_WORD,
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,
@ -1196,8 +1197,15 @@ final class WireHelpers {
case WirePointer.FAR : case WirePointer.FAR :
throw new DecodeException("Unexpected FAR pointer."); throw new DecodeException("Unexpected FAR pointer.");
case WirePointer.OTHER : case WirePointer.OTHER :
if (WirePointer.isCapability(srcRef)) {
var cap = readCapabilityPointer(srcSegment, srcCapTable, srcOffset, 0);
setCapabilityPointer(dstSegment, dstCapTable, dstOffset, cap);
return dstSegment;
}
else {
throw new RuntimeException("copyPointer is unimplemented for OTHER pointers"); throw new RuntimeException("copyPointer is unimplemented for OTHER pointers");
} }
}
throw new RuntimeException("unreachable"); throw new RuntimeException("unreachable");
} }