| import * as assert from '../assert.js' |
| import Builder from '../Builder.js' |
| |
| const b = new Builder(); |
| b.Type().End() |
| .Import().End() |
| .Function().End() |
| .Export() |
| .Function("fac") |
| .End() |
| .Code() |
| .Function("fac", { params: ["i32"], ret: "i32" }) |
| .GetLocal(0) |
| .I32Const(0) |
| .I32Eq() |
| .If("void", b => |
| b.I32Const(1) |
| .Return() |
| ) |
| .GetLocal(0) |
| .GetLocal(0) |
| .I32Const(1) |
| .I32Sub() |
| .Call(0) |
| .I32Mul() |
| .Return() |
| .End() |
| .End() |
| |
| const m = new WebAssembly.Module(b.WebAssembly().get()); |
| const fac = (new WebAssembly.Instance(m)).exports.fac; |
| assert.eq(fac(0), 1); |
| assert.eq(fac(1), 1); |
| assert.eq(fac(2), 2); |
| assert.eq(fac(4), 24); |
| assert.throws(() => fac(1e7), RangeError, "Maximum call stack size exceeded."); |