use of org.graalvm.wasm.Linker.ResolutionDag.DataSym in project graal by oracle.
the class Linker method resolveDataSegment.
void resolveDataSegment(WasmContext context, WasmInstance instance, int dataSegmentId, int offsetAddress, int offsetGlobalIndex, int byteLength, byte[] data) {
assertTrue(instance.symbolTable().memoryExists(), String.format("No memory declared or imported in the module '%s'", instance.name()), Failure.UNSPECIFIED_MALFORMED);
final Runnable resolveAction = () -> {
WasmMemory memory = instance.memory();
Assert.assertNotNull(memory, String.format("No memory declared or imported in the module '%s'", instance.name()), Failure.UNSPECIFIED_MALFORMED);
int baseAddress;
if (offsetGlobalIndex != -1) {
final int offsetGlobalAddress = instance.globalAddress(offsetGlobalIndex);
assertTrue(offsetGlobalAddress != -1, "The global variable '" + offsetGlobalIndex + "' for the offset of the data segment " + dataSegmentId + " in module '" + instance.name() + "' was not initialized.", Failure.UNSPECIFIED_MALFORMED);
baseAddress = context.globals().loadAsInt(offsetGlobalAddress);
} else {
baseAddress = offsetAddress;
}
Assert.assertUnsignedIntLessOrEqual(baseAddress, WasmMath.toUnsignedIntExact(memory.byteSize()), Failure.DATA_SEGMENT_DOES_NOT_FIT);
Assert.assertUnsignedIntLessOrEqual(baseAddress + byteLength, WasmMath.toUnsignedIntExact(memory.byteSize()), Failure.DATA_SEGMENT_DOES_NOT_FIT);
for (int writeOffset = 0; writeOffset != byteLength; ++writeOffset) {
byte b = data[writeOffset];
memory.store_i32_8(null, baseAddress + writeOffset, b);
}
};
final ArrayList<Sym> dependencies = new ArrayList<>();
if (instance.symbolTable().importedMemory() != null) {
dependencies.add(new ImportMemorySym(instance.name(), instance.symbolTable().importedMemory()));
}
if (dataSegmentId > 0) {
dependencies.add(new DataSym(instance.name(), dataSegmentId - 1));
}
if (offsetGlobalIndex != -1) {
dependencies.add(new InitializeGlobalSym(instance.name(), offsetGlobalIndex));
}
resolutionDag.resolveLater(new DataSym(instance.name(), dataSegmentId), dependencies.toArray(new Sym[dependencies.size()]), resolveAction);
}
Aggregations