d4dcd35976905b1736684d8a5fedc4815f2b3174
[WebKit-https.git] / JSTests / wasm / function-tests / nameSection.js
1 import * as assert from '../assert.js'
2
3 /*
4 This test loads a WebAssembly file compiled by Emscripten with:
5   ./emsdk-portable/emscripten/incoming/em++ ./nameSection.cc -O2 -g4 -s WASM=1 -o nameSection.js -s EXPORTED_FUNCTIONS="['_parrot']"
6
7 From the following C++ source file:
8   extern "C" {
9   int silly(int);
10   __attribute__((noinline)) int eggs(int i) { return silly(i); }
11   __attribute__((noinline)) int bacon(int i) { return eggs(i); }
12   __attribute__((noinline)) int spam(int i) { return bacon(i); }
13   __attribute__((noinline)) int parrot(int i) { return spam(i); }
14   }
15 */
16
17 const verbose = false;
18 const wasmFile = 'nameSection.wasm';
19
20 const compile = (location, importObject = {}) => {
21     if (verbose)
22         print(`Processing ${location}`);
23     let buf = typeof readbuffer !== "undefined"? readbuffer(location) : read(location, 'binary');
24     if (verbose)
25         print(`  Size: ${buf.byteLength}`);
26
27     let t0 = Date.now();
28     let module = new WebAssembly.Module(buf);
29     let t1 = Date.now();
30     if (verbose)
31         print(`new WebAssembly.Module(buf) took ${t1-t0} ms.`);
32
33     if (verbose)
34         print(`Creating fake import object with ${WebAssembly.Module.imports(module).length} imports`);
35     for (let imp of WebAssembly.Module.imports(module)) {
36         if (typeof importObject[imp.module] === "undefined")
37             importObject[imp.module] = {};
38         if (typeof importObject[imp.module][imp.name] === "undefined") {
39             switch (imp.kind) {
40             case "function": importObject[imp.module][imp.name] = () => {}; break;
41             case "table": importObject[imp.module][imp.name] = new WebAssembly.Table({ initial: 6, maximum: 6, element: "anyfunc" }); break;
42             case "memory": importObject[imp.module][imp.name] = new WebAssembly.Memory({ initial: 16777216 / (64 * 1024), maximum: 16777216 / (64 * 1024) }); break;
43             case "global": importObject[imp.module][imp.name] = 0; break;
44             }
45         }
46
47     }
48
49     let t2 = Date.now();
50     let instance = new WebAssembly.Instance(module, importObject);
51     let t3 = Date.now();
52     if (verbose)
53         print(`new WebAssembly.Module(buf) took ${t3-t2} ms.`);
54
55     return instance;
56 };
57
58 let stacktrace;
59 const importObject = { env: { _silly: i => { stacktrace = (new Error).stack; return i + 42; } } };
60 const instance = compile(wasmFile, importObject);
61 const result = instance.exports._parrot(1);
62 assert.eq(result, 1 + 42);
63
64 assert.truthy(stacktrace);
65 stacktrace = stacktrace.split("\n");
66 assert.falsy(stacktrace[0].indexOf("_silly") === -1);
67 assert.eq(stacktrace[1], "wasm-stub@[wasm code]"); // the wasm->js stub
68 assert.eq(stacktrace[2], "<?>.wasm-function[_eggs]@[wasm code]");
69 assert.eq(stacktrace[3], "<?>.wasm-function[_bacon]@[wasm code]");
70 assert.eq(stacktrace[4], "<?>.wasm-function[_spam]@[wasm code]");
71 assert.eq(stacktrace[5], "<?>.wasm-function[_parrot]@[wasm code]");
72 assert.eq(stacktrace[6], "wasm-stub@[wasm code]"); // wasm entry