浏览代码

correctly load/store uint&int in the runtime.js for wasm64p32

Laytan Laats 1 年之前
父节点
当前提交
e08b51ed73
共有 1 个文件被更改,包括 45 次插入13 次删除
  1. 45 13
      vendor/wasm/js/runtime.js

+ 45 - 13
vendor/wasm/js/runtime.js

@@ -13,7 +13,8 @@ function stripNewline(str) {
     return str.replace(/\n/, ' ')
 }
 
-const STRING_SIZE = 2*4;
+const INT_SIZE    = 4; // NOTE: set to `8` if the target has 64 bit ints (`wasm64p32` for example).
+const STRING_SIZE = 2*INT_SIZE;
 
 class WasmMemoryInterface {
 	constructor() {
@@ -69,19 +70,34 @@ class WasmMemoryInterface {
 		const hi = this.mem.getInt32 (addr + 4, true);
 		return lo + hi*4294967296;
 	};
-	loadF32(addr)  { return this.mem.getFloat32(addr, true); }
-	loadF64(addr)  { return this.mem.getFloat64(addr, true); }
-	loadInt(addr)  { return this.mem.getInt32  (addr, true); }
-	loadUint(addr) { return this.mem.getUint32 (addr, true); }
-
-	loadPtr(addr) { return this.loadUint(addr); }
+	loadF32(addr) { return this.mem.getFloat32(addr, true); }
+	loadF64(addr) { return this.mem.getFloat64(addr, true); }
+	loadInt(addr) {
+		if (INT_SIZE == 8) {
+			return this.loadI64(addr);
+		} else if (INT_SIZE == 4) {
+			return this.loadI32(addr);
+		} else {
+			throw new Error('Unhandled `INT_SIZE`, expected `4` or `8`');
+		}
+	};
+	loadUint(addr) {
+		if (INT_SIZE == 8) {
+			return this.loadU64(addr);
+		} else if (INT_SIZE == 4) {
+			return this.loadU32(addr);
+		} else {
+			throw new Error('Unhandled `INT_SIZE`, expected `4` or `8`');
+		}
+	};
+	loadPtr(addr) { return this.loadU32(addr); }
 
 	loadBytes(ptr, len) {
-		return new Uint8Array(this.memory.buffer, ptr, len);
+		return new Uint8Array(this.memory.buffer, ptr, Number(len));
 	}
 
 	loadString(ptr, len) {
-		const bytes = this.loadBytes(ptr, len);
+		const bytes = this.loadBytes(ptr, Number(len));
 		return new TextDecoder().decode(bytes);
 	}
 
@@ -99,10 +115,26 @@ class WasmMemoryInterface {
 		this.mem.setUint32(addr + 0, value, true);
 		this.mem.setInt32 (addr + 4, Math.floor(value / 4294967296), true);
 	}
-	storeF32(addr, value)  { this.mem.setFloat32(addr, value, true); }
-	storeF64(addr, value)  { this.mem.setFloat64(addr, value, true); }
-	storeInt(addr, value)  { this.mem.setInt32  (addr, value, true); }
-	storeUint(addr, value) { this.mem.setUint32 (addr, value, true); }
+	storeF32(addr, value) { this.mem.setFloat32(addr, value, true); }
+	storeF64(addr, value) { this.mem.setFloat64(addr, value, true); }
+	storeInt(addr, value) {
+		if (INT_SIZE == 8) {
+			this.storeI64(addr, value);
+		} else if (INT_SIZE == 4) {
+			this.storeI32(addr, value);
+		} else {
+			throw new Error('Unhandled `INT_SIZE`, expected `4` or `8`');
+		}
+	}
+	storeUint(addr, value) {
+		if (INT_SIZE == 8) {
+			this.storeU64(addr, value);
+		} else if (INT_SIZE == 4) {
+			this.storeU32(addr, value);
+		} else {
+			throw new Error('Unhandled `INT_SIZE`, expected `4` or `8`');
+		}
+	}
 
 	// Returned length might not be the same as `value.length` if non-ascii strings are given.
 	storeString(addr, value) {