diff --git a/wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/BinaryParser.java b/wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/BinaryParser.java index 417b253a08d6..9a49b9acbfea 100644 --- a/wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/BinaryParser.java +++ b/wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/BinaryParser.java @@ -156,7 +156,7 @@ private void readSymbolSections() { skipCodeSection(); break; case Section.DATA: - readDataSection(null); + readDataSection(null, null); break; default: Assert.fail("invalid section ID: " + sectionID); @@ -1134,7 +1134,7 @@ private void readGlobalSection() { } } - private void readDataSection(WasmInstance linkedInstance) { + private void readDataSection(WasmContext linkedContext, WasmInstance linkedInstance) { int numDataSegments = readVectorLength(); for (int dataSegmentId = 0; dataSegmentId != numDataSegments; ++dataSegmentId) { int memIndex = readUnsignedInt32(); @@ -1166,6 +1166,11 @@ private void readDataSection(WasmInstance linkedInstance) { int byteLength = readVectorLength(); if (linkedInstance != null) { + if (offsetGlobalIndex != -1) { + int offsetGlobalAddress = linkedInstance.globalAddress(offsetGlobalIndex); + offsetAddress = linkedContext.globals().loadAsInt(offsetGlobalAddress); + } + // Reading of the data segment is called after linking, so initialize the memory // directly. final WasmMemory memory = linkedInstance.memory(); @@ -1493,13 +1498,13 @@ void resetGlobalState(WasmContext context, WasmInstance instance) { } } - void resetMemoryState(WasmInstance instance, boolean zeroMemory) { + void resetMemoryState(WasmContext context, WasmInstance instance, boolean zeroMemory) { final WasmMemory memory = instance.memory(); if (memory != null && zeroMemory) { memory.clear(); } if (tryJumpToSection(Section.DATA)) { - readDataSection(instance); + readDataSection(context, instance); } } } diff --git a/wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/Linker.java b/wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/Linker.java index 8b3df1bf22ba..1f80648e66a1 100644 --- a/wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/Linker.java +++ b/wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/Linker.java @@ -174,7 +174,7 @@ private static void assignTypeEquivalenceClasses() { public void resetModuleState(WasmContext context, WasmInstance instance, byte[] data, boolean zeroMemory) { final BinaryParser reader = new BinaryParser(language, instance.module(), data); reader.resetGlobalState(context, instance); - reader.resetMemoryState(instance, zeroMemory); + reader.resetMemoryState(context, instance, zeroMemory); } void resolveGlobalImport(WasmContext context, WasmInstance instance, ImportDescriptor importDescriptor, int globalIndex, byte valueType, byte mutability) { @@ -208,6 +208,7 @@ void resolveGlobalImport(WasmContext context, WasmInstance instance, ImportDescr } int address = importedInstance.globalAddress(exportedGlobalIndex); + System.out.println("Yo! " + globalIndex + " -> " + address); instance.setGlobalAddress(globalIndex, address); }; final ImportGlobalSym importGlobalSym = new ImportGlobalSym(instance.name(), importDescriptor);