Skip to content

Commit 65aa33b

Browse files
committed
implement the correct abort() for AssemblyScript env
inspired by https://github.com/AssemblyScript/assemblyscript/blob/master/lib/loader/index.js
1 parent 2589c87 commit 65aa33b

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

tools/pack-wasm.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@ for (const basename of fs.readdirSync(artifactDir)) {
1212
}
1313

1414
const blob = fs.readFileSync(file);
15-
fs.writeFileSync(
16-
`${file}.js`,
17-
`// generated from ${basename}
15+
16+
const source = `// generated from ${basename}
1817
"use strict";
1918
2019
var base64 = require("base64-js");
@@ -25,14 +24,26 @@ var wasmModule = new WebAssembly.Module(
2524
);
2625
var wasmInstance = new WebAssembly.Instance(wasmModule, {
2726
env: {
28-
abort: function (filename, line, column) {
29-
// FIXME: filename is just a number (pointer?)
30-
throw new Error("abort called at " + filename + ":" + line + ":" + column);
31-
},
27+
abort: abort,
3228
},
3329
});
3430
31+
// from getStringImpl() in AssemblyScript/lib/loader/index.js
32+
function getString(ptr) {
33+
const buffer = wasmInstance.exports.memory.buffer;
34+
var u32 = new Uint32Array(buffer);
35+
var u16 = new Uint16Array(buffer);
36+
var offset = (ptr + 4) >>> 1;
37+
var length = u32[ptr >>> 2];
38+
return String.fromCharCode(...u16.subarray(offset, offset + length))
39+
}
40+
41+
function abort(message, filename, line, column) {
42+
throw new Error("abort: " + getString(message) + " at " + getString(filename) + ":" + line + ":" + column);
43+
}
44+
3545
module.exports = wasmInstance.exports;
36-
`,
37-
);
46+
`;
47+
48+
fs.writeFileSync(`${file}.js`, source);
3849
}

0 commit comments

Comments
 (0)