-
Notifications
You must be signed in to change notification settings - Fork 746
/
hello-world.js
49 lines (38 loc) · 1.59 KB
/
hello-world.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
// "hello world" type example: create a function that adds two i32s and
// returns the result
// Create a module to work on
var module = new binaryen.Module();
// Start to create the function, starting with the contents: Get the 0 and
// 1 arguments, and add them, then return them
var left = module.local.get(0, binaryen.i32);
var right = module.local.get(1, binaryen.i32);
var add = module.i32.add(left, right);
var ret = module.return(add);
// Create the add function
// Note: no additional local variables (that's the [])
var ii = binaryen.createType([binaryen.i32, binaryen.i32])
module.addFunction('adder', ii, binaryen.i32, [], ret);
// Export the function, so we can call it later (for simplicity we
// export it as the same name as it has internally)
module.addFunctionExport('adder', 'adder');
// Print out the text
console.log(module.emitText());
// Optimize the module! This removes the 'return', since the
// output of the add can just fall through
module.optimize();
// Print out the optimized module's text
console.log('optimized:\n\n' + module.emitText());
// Get the binary in typed array form
var binary = module.emitBinary();
console.log('binary size: ' + binary.length);
console.log();
assert(module.validate());
// We don't need the Binaryen module anymore, so we can tell it to
// clean itself up
module.dispose();
// Compile the binary and create an instance
var wasm = new WebAssembly.Instance(new WebAssembly.Module(binary), {})
console.log("exports: " + Object.keys(wasm.exports).sort().join(","));
console.log();
// Call the code!
console.log('an addition: ' + wasm.exports.adder(40, 2));