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)); |
- } |
- } |
- } |
- |
- |
- |
-})(); |