forked from AssemblyScript/assemblyscript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
58 lines (49 loc) · 1.75 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
import runner from "./runner.js";
const dirname = path.dirname(fileURLToPath(import.meta.url));
const COMMON_MAX = 1 << 30;
async function test(file) {
console.log("Testing '" + file + "' ...\n");
const { instance: { exports } } = await WebAssembly.instantiate(fs.readFileSync(dirname + "/" + file), {
env: {
abort(msg, file, line, column) {
throw Error("Assertion failed: " + (msg ? "'" + getString(msg) + "' " : "") + "at " + getString(file) + ":" + line + ":" + column);
},
log(ptr) { console.log(getString(ptr)); },
logi(i) { console.log(i); },
trace(...args) { console.log("trace", args); }
}
});
function getString(ptr) {
if (!ptr) return "null";
let U32 = new Uint32Array(exports.memory.buffer);
let U16 = new Uint16Array(exports.memory.buffer);
let length = U32[(ptr - 4) >>> 2] >>> 1;
let offset = ptr >>> 1;
return String.fromCharCode.apply(String, U16.subarray(offset, offset + length));
}
runner(exports, 20, 20000);
console.log("mem final: " + exports.memory.buffer.byteLength);
console.log();
const alloc = exports["__alloc"];
let overflow = false;
try {
alloc(COMMON_MAX + 1, 0); // unreachable
overflow = true;
} catch (e) { /* nop */ }
if (overflow) throw Error("allocation can overflow COMMON_MAX + 1");
try {
alloc(0xffffffff, 0); // unreachable
overflow = true;
} catch (e) { /* nop */ }
if (overflow) throw Error("allocation can overflow 0xffffffff");
}
if (process.argv.length > 2) {
await test(process.argv[2] + "/debug.wasm");
await test(process.argv[2] + "/release.wasm");
} else {
console.error("Usage: npm test <allocator>");
process.exit(1);
}