finish implementation of transferPointer
This commit is contained in:
parent
57f8a5cdfc
commit
9ba6f3970c
2 changed files with 37 additions and 1 deletions
|
@ -343,7 +343,39 @@ final class WireHelpers {
|
||||||
//# Need to create a far pointer. Try to allocate it in the same segment as the source,
|
//# Need to create a far pointer. Try to allocate it in the same segment as the source,
|
||||||
//# so that it doesn't need to be a double-far.
|
//# so that it doesn't need to be a double-far.
|
||||||
|
|
||||||
throw new Error("unimplemented");
|
int landingPadOffset = srcSegment.allocate(1);
|
||||||
|
if (landingPadOffset == SegmentBuilder.FAILED_ALLOCATION) {
|
||||||
|
//# Darn, need a double-far.
|
||||||
|
|
||||||
|
BuilderArena.AllocateResult allocation = srcSegment.getArena().allocate(2);
|
||||||
|
SegmentBuilder farSegment = allocation.segment;
|
||||||
|
landingPadOffset = allocation.offset;
|
||||||
|
|
||||||
|
FarPointer.set(farSegment.buffer, landingPadOffset, false, srcTargetOffset);
|
||||||
|
FarPointer.setSegmentId(farSegment.buffer, landingPadOffset, srcSegment.id);
|
||||||
|
|
||||||
|
WirePointer.setKindWithZeroOffset(farSegment.buffer, landingPadOffset + 1,
|
||||||
|
WirePointer.kind(srcTarget));
|
||||||
|
|
||||||
|
farSegment.buffer.putInt((landingPadOffset + 1) * Constants.BYTES_PER_WORD + 4,
|
||||||
|
srcSegment.buffer.getInt(srcOffset * Constants.BYTES_PER_WORD + 4));
|
||||||
|
|
||||||
|
FarPointer.set(dstSegment.buffer, dstOffset,
|
||||||
|
true, landingPadOffset);
|
||||||
|
FarPointer.setSegmentId(dstSegment.buffer, dstOffset,
|
||||||
|
farSegment.id);
|
||||||
|
} else {
|
||||||
|
//# Simple landing pad is just a pointer.
|
||||||
|
WirePointer.setKindAndTarget(srcSegment.buffer, landingPadOffset,
|
||||||
|
WirePointer.kind(srcTarget), srcTargetOffset);
|
||||||
|
srcSegment.buffer.putInt(landingPadOffset * Constants.BYTES_PER_WORD + 4,
|
||||||
|
srcSegment.buffer.getInt(srcOffset * Constants.BYTES_PER_WORD + 4));
|
||||||
|
|
||||||
|
FarPointer.set(dstSegment.buffer, dstOffset,
|
||||||
|
false, landingPadOffset);
|
||||||
|
FarPointer.setSegmentId(dstSegment.buffer, dstOffset,
|
||||||
|
srcSegment.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,10 @@ final class WirePointer {
|
||||||
(((targetOffset - offset) - 1) << 2) | kind);
|
(((targetOffset - offset) - 1) << 2) | kind);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setKindWithZeroOffset(ByteBuffer buffer, int offset, byte kind) {
|
||||||
|
buffer.putInt(offset * Constants.BYTES_PER_WORD, kind);
|
||||||
|
}
|
||||||
|
|
||||||
public static void setKindAndTargetForEmptyStruct(ByteBuffer buffer, int offset) {
|
public static void setKindAndTargetForEmptyStruct(ByteBuffer buffer, int offset) {
|
||||||
//# This pointer points at an empty struct. Assuming the
|
//# This pointer points at an empty struct. Assuming the
|
||||||
//# WirePointer itself is in-bounds, we can set the target to
|
//# WirePointer itself is in-bounds, we can set the target to
|
||||||
|
|
Loading…
Reference in a new issue