| Index: test/mjsunit/wasm/indirect-tables.js
|
| diff --git a/test/mjsunit/wasm/indirect-tables.js b/test/mjsunit/wasm/indirect-tables.js
|
| index 62b900586ce942d2c09899709d055332db2783b3..cdb489cb83514b48c57a4d6e189c2ba0dc852622 100644
|
| --- a/test/mjsunit/wasm/indirect-tables.js
|
| +++ b/test/mjsunit/wasm/indirect-tables.js
|
| @@ -30,8 +30,6 @@
|
| return {mul: mul, add: add, sub: sub};
|
| }
|
|
|
| -function js_div(a, b) { return (a / b) | 0; }
|
| -
|
| (function ExportedTableTest() {
|
| print("ExportedTableTest...");
|
|
|
| @@ -57,6 +55,8 @@
|
| builder.addExportOfKind("table", kExternalTable, 0);
|
|
|
| let module = new WebAssembly.Module(builder.toBuffer());
|
| +
|
| + function js_div(a, b) { return (a / b) | 0; }
|
|
|
| for (let i = 0; i < 5; i++) {
|
| print(" base = " + i);
|
| @@ -100,278 +100,3 @@
|
| assertEquals(-44, exp_div(-88.1, 2));
|
| }
|
| })();
|
| -
|
| -
|
| -(function ImportedTableTest() {
|
| - let kTableSize = 10;
|
| - print("ImportedTableTest...");
|
| - var builder = new WasmModuleBuilder();
|
| -
|
| - let d = builder.addImport("js_div", kSig_i_ii);
|
| - let f = AddFunctions(builder);
|
| - builder.setFunctionTableLength(kTableSize);
|
| - let g = builder.addImportedGlobal("base", undefined, kAstI32);
|
| - builder.addFunctionTableInit(g, true, [f.mul.index, f.add.index,
|
| - f.sub.index,
|
| - d]);
|
| - builder.addExportOfKind("table", kExternalTable, 0);
|
| -
|
| - let m1 = new WebAssembly.Module(builder.toBuffer());
|
| -
|
| - var builder = new WasmModuleBuilder();
|
| -
|
| - builder.addImportedTable("table", undefined, kTableSize, kTableSize);
|
| - builder.addFunction("main", kSig_i_ii)
|
| - .addBody([
|
| - kExprI32Const, 33, // --
|
| - kExprGetLocal, 0, // --
|
| - kExprGetLocal, 1, // --
|
| - kExprCallIndirect, 0, kTableZero]) // --
|
| - .exportAs("main");
|
| -
|
| - let m2 = new WebAssembly.Module(builder.toBuffer());
|
| -
|
| - // Run 5 trials at different table bases.
|
| - for (let i = 0; i < 5; i++) {
|
| - print(" base = " + i);
|
| - let i1 = new WebAssembly.Instance(m1, {base: i, js_div: js_div});
|
| - let table = i1.exports.table;
|
| - assertEquals(10, table.length);
|
| - let i2 = new WebAssembly.Instance(m2, {table: table});
|
| - let main = i2.exports.main;
|
| -
|
| - for (var j = 0; j < i; j++) {
|
| - assertThrows(() => main(0, j));
|
| - assertSame(null, table.get(j));
|
| - }
|
| -
|
| - // mul
|
| - assertEquals("function", typeof table.get(i+0));
|
| - assertEquals(0, main(0, i+0));
|
| - assertEquals(66, main(2, i+0));
|
| -
|
| - // add
|
| - assertEquals("function", typeof table.get(i+1));
|
| - assertEquals(33, main(0, i+1));
|
| - assertEquals(38, main(5, i+1));
|
| -
|
| - // sub
|
| - assertEquals("function", typeof table.get(i+2));
|
| - assertEquals(32, main(1, i+2));
|
| - assertEquals(28, main(5, i+2));
|
| -
|
| - // div
|
| - assertEquals("function", typeof table.get(i+3));
|
| - assertEquals(8, main(4, i+3));
|
| - assertEquals(3, main(11, i+3));
|
| -
|
| - for (var j = i + 4; j < (kTableSize + 5); j++) {
|
| - assertThrows(x => main(0, j));
|
| - if (j < kTableSize) assertSame(null, table.get(j));
|
| - }
|
| - }
|
| -})();
|
| -
|
| -(function ImportedTableTest() {
|
| - let kTableSize = 10;
|
| - print("ManualTableTest...");
|
| -
|
| - var builder = new WasmModuleBuilder();
|
| -
|
| - let d = builder.addImport("js_div", kSig_i_ii);
|
| - builder.addImportedTable("table", undefined, kTableSize, kTableSize);
|
| - let g = builder.addImportedGlobal("base", undefined, kAstI32);
|
| - let f = AddFunctions(builder);
|
| - builder.addFunctionTableInit(g, true, [f.mul.index, f.add.index,
|
| - f.sub.index,
|
| - d]);
|
| - builder.addFunction("main", kSig_i_ii)
|
| - .addBody([
|
| - kExprI32Const, 55, // --
|
| - kExprGetLocal, 0, // --
|
| - kExprGetLocal, 1, // --
|
| - kExprCallIndirect, 0, kTableZero]) // --
|
| - .exportAs("main");
|
| -
|
| - let m2 = new WebAssembly.Module(builder.toBuffer());
|
| -
|
| - // Run 5 trials at different table bases.
|
| - for (let i = 0; i < 5; i++) {
|
| - print(" base = " + i);
|
| - let table = new WebAssembly.Table({element: "anyfunc",
|
| - initial: kTableSize});
|
| - assertEquals(10, table.length);
|
| - let i2 = new WebAssembly.Instance(m2, {base: i, table: table,
|
| - js_div: js_div});
|
| - let main = i2.exports.main;
|
| -
|
| - for (var j = 0; j < i; j++) {
|
| - assertThrows(() => main(0, j));
|
| - assertSame(null, table.get(j));
|
| - }
|
| -
|
| - // mul
|
| - assertEquals("function", typeof table.get(i+0));
|
| - assertEquals(0, main(0, i+0));
|
| - assertEquals(110, main(2, i+0));
|
| -
|
| - // add
|
| - assertEquals("function", typeof table.get(i+1));
|
| - assertEquals(55, main(0, i+1));
|
| - assertEquals(60, main(5, i+1));
|
| -
|
| - // sub
|
| - assertEquals("function", typeof table.get(i+2));
|
| - assertEquals(54, main(1, i+2));
|
| - assertEquals(50, main(5, i+2));
|
| -
|
| - // div
|
| - assertEquals("function", typeof table.get(i+3));
|
| - assertEquals(13, main(4, i+3));
|
| - assertEquals(5, main(11, i+3));
|
| -
|
| - for (var j = i + 4; j < (kTableSize + 5); j++) {
|
| - assertThrows(x => main(0, j));
|
| - if (j < kTableSize) assertSame(null, table.get(j));
|
| - }
|
| - }
|
| -})();
|
| -
|
| -
|
| -(function CumulativeTest() {
|
| - print("CumulativeTest...");
|
| -
|
| - let kTableSize = 10;
|
| - let table = new WebAssembly.Table({element: "anyfunc", initial: 10});
|
| -
|
| - var builder = new WasmModuleBuilder();
|
| -
|
| - builder.addImportedTable("table", undefined, kTableSize, kTableSize);
|
| - let g = builder.addImportedGlobal("base", undefined, kAstI32);
|
| - let sig_index = builder.addType(kSig_i_v);
|
| - builder.addFunction("g", sig_index)
|
| - .addBody([
|
| - kExprGetGlobal, g
|
| - ]);
|
| - builder.addFunction("main", kSig_i_ii)
|
| - .addBody([
|
| - kExprGetLocal, 0,
|
| - kExprCallIndirect, sig_index, kTableZero]) // --
|
| - .exportAs("main");
|
| - builder.addFunctionTableInit(g, true, [g]);
|
| -
|
| - let module = new WebAssembly.Module(builder.toBuffer());
|
| -
|
| - for (var i = 0; i < kTableSize; i++) {
|
| - print(" base = " + i);
|
| - let instance = new WebAssembly.Instance(module, {base: i, table: table});
|
| -
|
| - for (var j = 0; j < kTableSize; j++) {
|
| - let func = table.get(j);
|
| - if (j > i) {
|
| - assertSame(null, func);
|
| - assertTraps(kTrapFuncSigMismatch, () => instance.exports.main(j));
|
| - } else {
|
| - assertEquals("function", typeof func);
|
| - assertEquals(j, func());
|
| - assertEquals(j, instance.exports.main(j));
|
| - }
|
| - }
|
| - }
|
| -})();
|
| -
|
| -(function TwoWayTest() {
|
| - print("TwoWayTest...");
|
| - let kTableSize = 3;
|
| -
|
| - // Module {m1} defines the table and exports it.
|
| - var builder = new WasmModuleBuilder();
|
| - builder.addType(kSig_i_i);
|
| - builder.addType(kSig_i_ii);
|
| - var sig_index1 = builder.addType(kSig_i_v);
|
| - var f1 = builder.addFunction("f1", sig_index1)
|
| - .addBody([kExprI32Const, 11]);
|
| -
|
| - builder.addFunction("main", kSig_i_ii)
|
| - .addBody([
|
| - kExprGetLocal, 0, // --
|
| - kExprCallIndirect, sig_index1, kTableZero]) // --
|
| - .exportAs("main");
|
| -
|
| - builder.setFunctionTableLength(kTableSize);
|
| - builder.addFunctionTableInit(0, false, [f1.index]);
|
| - builder.addExportOfKind("table", kExternalTable, 0);
|
| -
|
| - var m1 = new WebAssembly.Module(builder.toBuffer());
|
| -
|
| - // Module {m2} imports the table and adds {f2}.
|
| - var builder = new WasmModuleBuilder();
|
| - builder.addType(kSig_i_ii);
|
| - var sig_index2 = builder.addType(kSig_i_v);
|
| - var f2 = builder.addFunction("f2", sig_index2)
|
| - .addBody([kExprI32Const, 22]);
|
| -
|
| - builder.addFunction("main", kSig_i_ii)
|
| - .addBody([
|
| - kExprGetLocal, 0, // --
|
| - kExprCallIndirect, sig_index2, kTableZero]) // --
|
| - .exportAs("main");
|
| -
|
| - builder.setFunctionTableLength(kTableSize);
|
| - builder.addFunctionTableInit(1, false, [f2.index]);
|
| - builder.addImportedTable("table", undefined, kTableSize, kTableSize);
|
| -
|
| - var m2 = new WebAssembly.Module(builder.toBuffer());
|
| -
|
| - assertFalse(sig_index1 == sig_index2);
|
| -
|
| - var i1 = new WebAssembly.Instance(m1);
|
| - var i2 = new WebAssembly.Instance(m2, {table: i1.exports.table});
|
| -
|
| - assertEquals(11, i1.exports.main(0));
|
| - assertEquals(11, i2.exports.main(0));
|
| -
|
| - assertEquals(22, i1.exports.main(1));
|
| - assertEquals(22, i2.exports.main(1));
|
| -
|
| - assertThrows(() => i1.exports.main(2));
|
| - assertThrows(() => i2.exports.main(2));
|
| - assertThrows(() => i1.exports.main(3));
|
| - assertThrows(() => i2.exports.main(3));
|
| -
|
| -})();
|
| -
|
| -(function MismatchedTableSize() {
|
| - print("MismatchedTableSize...");
|
| - let kTableSize = 5;
|
| -
|
| - for (var expsize = 1; expsize < 4; expsize++) {
|
| - for (var impsize = 1; impsize < 4; impsize++) {
|
| - print(" expsize = " + expsize + ", impsize = " + impsize);
|
| - var builder = new WasmModuleBuilder();
|
| - builder.setFunctionTableLength(expsize);
|
| - builder.addExportOfKind("expfoo", kExternalTable, 0);
|
| -
|
| - let m1 = new WebAssembly.Module(builder.toBuffer());
|
| -
|
| - var builder = new WasmModuleBuilder();
|
| - builder.addImportedTable("impfoo", undefined, impsize, impsize);
|
| -
|
| - let m2 = new WebAssembly.Module(builder.toBuffer());
|
| -
|
| - var i1 = new WebAssembly.Instance(m1);
|
| -
|
| - // TODO(titzer): v8 currently requires import table size to match
|
| - // export table size.
|
| - var ffi = {impfoo: i1.exports.expfoo};
|
| - if (expsize == impsize) {
|
| - var i2 = new WebAssembly.Instance(m2, ffi);
|
| - } else {
|
| - assertThrows(() => new WebAssembly.Instance(m2, ffi));
|
| - }
|
| - }
|
| - }
|
| -
|
| -
|
| -
|
| -})();
|
|
|