package com.oracle.svm.core.genscavenge;
import java.nio.ByteBuffer;
import org.graalvm.compiler.word.Word;
import org.graalvm.word.Pointer;
import org.graalvm.word.WordFactory;
import sun.nio.ch.DirectBuffer;
public class RuntimeImageHeapChunkWriter implements ImageHeapChunkWriter {
private final Pointer heapBegin;
private final Word layoutToBufferOffsetAddend;
RuntimeImageHeapChunkWriter(ByteBuffer buffer, long layoutToBufferOffsetAddend) {
DirectBuffer direct = (DirectBuffer) buffer;
this.heapBegin = WordFactory.pointer(direct.address());
this.layoutToBufferOffsetAddend = WordFactory.signed(layoutToBufferOffsetAddend);
}
private Pointer getChunkPointerInBuffer(int chunkPosition) {
return heapBegin.add(chunkPosition).add(layoutToBufferOffsetAddend);
}
@Override
public void initializeAlignedChunk(int chunkPosition, long topOffset, long endOffset, long offsetToPreviousChunk, long offsetToNextChunk) {
AlignedHeapChunk.AlignedHeader header = (AlignedHeapChunk.AlignedHeader) getChunkPointerInBuffer(chunkPosition);
header.setTopOffset(WordFactory.unsigned(topOffset));
header.setEndOffset(WordFactory.unsigned(endOffset));
header.setSpace(null);
header.setOffsetToPreviousChunk(WordFactory.unsigned(offsetToPreviousChunk));
header.setOffsetToNextChunk(WordFactory.unsigned(offsetToNextChunk));
CardTable.cleanTableToPointer(AlignedHeapChunk.getCardTableStart(header), AlignedHeapChunk.getCardTableLimit(header));
FirstObjectTable.initializeTableToLimit(AlignedHeapChunk.getFirstObjectTableStart(header), AlignedHeapChunk.getFirstObjectTableLimit(header));
}
@Override
public void insertIntoAlignedChunkFirstObjectTable(int chunkPosition, long objectOffsetInChunk, long objectEndOffsetInChunk) {
AlignedHeapChunk.AlignedHeader header = (AlignedHeapChunk.AlignedHeader) getChunkPointerInBuffer(chunkPosition);
FirstObjectTable.setTableForObjectAtOffsetUnchecked(AlignedHeapChunk.getFirstObjectTableStart(header),
WordFactory.unsigned(objectOffsetInChunk).subtract(AlignedHeapChunk.getObjectsStartOffset()),
WordFactory.unsigned(objectEndOffsetInChunk).subtract(AlignedHeapChunk.getObjectsStartOffset()));
}
@Override
public void initializeUnalignedChunk(int chunkPosition, long topOffset, long endOffset, long offsetToPreviousChunk, long offsetToNextChunk) {
UnalignedHeapChunk.UnalignedHeader header = (UnalignedHeapChunk.UnalignedHeader) getChunkPointerInBuffer(chunkPosition);
header.setTopOffset(WordFactory.unsigned(topOffset));
header.setEndOffset(WordFactory.unsigned(endOffset));
header.setSpace(null);
header.setOffsetToPreviousChunk(WordFactory.unsigned(offsetToPreviousChunk));
header.setOffsetToNextChunk(WordFactory.unsigned(offsetToNextChunk));
CardTable.cleanTableToPointer(UnalignedHeapChunk.getCardTableStart(header), UnalignedHeapChunk.getCardTableLimit(header));
}
}