| Index: test/mjsunit/wasm/indirect-calls.js
|
| diff --git a/test/mjsunit/wasm/indirect-calls.js b/test/mjsunit/wasm/indirect-calls.js
|
| index 7d7f135ae478083c21ad40e9a71e2e039a54a526..b07ce0d58a8448de9058438318181b5da9c98698 100644
|
| --- a/test/mjsunit/wasm/indirect-calls.js
|
| +++ b/test/mjsunit/wasm/indirect-calls.js
|
| @@ -127,3 +127,111 @@ assertEquals(35, module.exports.main(2, 1));
|
| assertEquals(32, module.exports.main(1, 2));
|
| assertEquals(31, module.exports.main(2, 2));
|
| assertTraps(kTrapFuncInvalid, "module.exports.main(12, 3)");
|
| +
|
| +(function ConstBaseTest() {
|
| + print("ConstBaseTest...");
|
| + function instanceWithTable(base, length) {
|
| + var builder = new WasmModuleBuilder();
|
| +
|
| + var mul = builder.addFunction("mul", kSig_i_ii)
|
| + .addBody([
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprI32Mul // --
|
| + ]);
|
| + var add = builder.addFunction("add", kSig_i_ii)
|
| + .addBody([
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprI32Add // --
|
| + ]);
|
| + var sub = builder.addFunction("sub", kSig_i_ii)
|
| + .addBody([
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprI32Sub // --
|
| + ]);
|
| + builder.addFunction("main", kSig_i_ii)
|
| + .addBody([
|
| + kExprI32Const, 33, // --
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprCallIndirect, 0]) // --
|
| + .exportAs("main");
|
| +
|
| + builder.setFunctionTableLength(length);
|
| + builder.addFunctionTableInit(base, false, [add.index, sub.index, mul.index]);
|
| +
|
| + return builder.instantiate();
|
| + }
|
| +
|
| + for (var i = 0; i < 5; i++) {
|
| + print(" base = " + i);
|
| + var module = instanceWithTable(i, 10);
|
| + main = module.exports.main;
|
| + for (var j = 0; j < i; j++) {
|
| + assertTraps(kTrapFuncSigMismatch, "main(12, " + j + ")");
|
| + }
|
| + assertEquals(34, main(1, i + 0));
|
| + assertEquals(35, main(2, i + 0));
|
| + assertEquals(32, main(1, i + 1));
|
| + assertEquals(31, main(2, i + 1));
|
| + assertEquals(33, main(1, i + 2));
|
| + assertEquals(66, main(2, i + 2));
|
| + assertTraps(kTrapFuncInvalid, "main(12, 10)");
|
| + }
|
| +})();
|
| +
|
| +(function GlobalBaseTest() {
|
| + print("GlobalBaseTest...");
|
| +
|
| + var builder = new WasmModuleBuilder();
|
| +
|
| + var mul = builder.addFunction("mul", kSig_i_ii)
|
| + .addBody([
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprI32Mul // --
|
| + ]);
|
| + var add = builder.addFunction("add", kSig_i_ii)
|
| + .addBody([
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprI32Add // --
|
| + ]);
|
| + var sub = builder.addFunction("sub", kSig_i_ii)
|
| + .addBody([
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprI32Sub // --
|
| + ]);
|
| + builder.addFunction("main", kSig_i_ii)
|
| + .addBody([
|
| + kExprI32Const, 33, // --
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprCallIndirect, 0]) // --
|
| + .exportAs("main");
|
| +
|
| + builder.setFunctionTableLength(10);
|
| + var g = builder.addImportedGlobal("base", undefined, kAstI32);
|
| + builder.addFunctionTableInit(g, true, [mul.index, add.index, sub.index]);
|
| +
|
| + var module = new WebAssembly.Module(builder.toBuffer());
|
| +
|
| + for (var i = 0; i < 5; i++) {
|
| + print(" base = " + i);
|
| + var instance = new WebAssembly.Instance(module, {base: i});
|
| + main = instance.exports.main;
|
| + for (var j = 0; j < i; j++) {
|
| + assertTraps(kTrapFuncSigMismatch, "main(12, " + j + ")");
|
| + }
|
| + assertEquals(33, main(1, i + 0));
|
| + assertEquals(66, main(2, i + 0));
|
| + assertEquals(34, main(1, i + 1));
|
| + assertEquals(35, main(2, i + 1));
|
| + assertEquals(32, main(1, i + 2));
|
| + assertEquals(31, main(2, i + 2));
|
| + assertTraps(kTrapFuncInvalid, "main(12, 10)");
|
| + }
|
| +})();
|
|
|