59 lines
1.7 KiB
JavaScript
59 lines
1.7 KiB
JavaScript
import Builder from '../Builder.js'
|
|
import * as assert from '../assert.js'
|
|
|
|
const builder = (new Builder())
|
|
.Type().End()
|
|
.Import()
|
|
.Function("imp", "f", { params: [], ret: "void" })
|
|
.End()
|
|
.Function().End()
|
|
.Export().Function("entry").End()
|
|
.Code()
|
|
// idx 1
|
|
.Function("entry", {params: []})
|
|
.Call(3)
|
|
.End()
|
|
// idx 2
|
|
.Function({params: []})
|
|
.Call(4)
|
|
.End()
|
|
// idx 3
|
|
.Function({params: []})
|
|
.Call(2)
|
|
.End()
|
|
// idx 4
|
|
.Function({params: []})
|
|
.Call(0)
|
|
.End()
|
|
.End();
|
|
|
|
let stacktrace;
|
|
let imp = () => {
|
|
stacktrace = (new Error).stack;
|
|
}
|
|
|
|
|
|
const bin = builder.WebAssembly().get();
|
|
const module = new WebAssembly.Module(bin);
|
|
let instance = new WebAssembly.Instance(module, {imp: {f: imp}});
|
|
assert.falsy(stacktrace);
|
|
for (let i = 0; i < 10000; ++i) {
|
|
instance.exports.entry();
|
|
assert.truthy(stacktrace);
|
|
stacktrace = stacktrace.split("\n");
|
|
assert.truthy(stacktrace[0].indexOf("imp") !== -1); // the arrow function import named "imp".
|
|
assert.eq(stacktrace[1], "wasm-stub@[wasm code]"); // the wasm->js stub
|
|
let found = false;
|
|
for (let i = 0; i < stacktrace.length; ++i) {
|
|
let str = stacktrace[i];
|
|
if (str !== "<?>.wasm-function[4]@[wasm code]")
|
|
continue;
|
|
found = true;
|
|
assert.eq(stacktrace[i + 1], "<?>.wasm-function[2]@[wasm code]");
|
|
assert.eq(stacktrace[i + 2], "<?>.wasm-function[3]@[wasm code]");
|
|
assert.eq(stacktrace[i + 3], "<?>.wasm-function[1]@[wasm code]");
|
|
}
|
|
assert.truthy(found);
|
|
stacktrace = null;
|
|
}
|