| Index: test/mjsunit/wasm/indirect-tables.js
|
| diff --git a/test/mjsunit/wasm/indirect-tables.js b/test/mjsunit/wasm/indirect-tables.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..492751a7ab05733d3573d6a3ee5baa1bb3c6ab2a
|
| --- /dev/null
|
| +++ b/test/mjsunit/wasm/indirect-tables.js
|
| @@ -0,0 +1,102 @@
|
| +// Copyright 2016 the V8 project authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// Flags: --expose-wasm
|
| +
|
| +load("test/mjsunit/wasm/wasm-constants.js");
|
| +load("test/mjsunit/wasm/wasm-module-builder.js");
|
| +
|
| +function AddFunctions(builder) {
|
| + let sig_index = builder.addType(kSig_i_ii);
|
| + let mul = builder.addFunction("mul", sig_index)
|
| + .addBody([
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprI32Mul // --
|
| + ]);
|
| + let add = builder.addFunction("add", sig_index)
|
| + .addBody([
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprI32Add // --
|
| + ]);
|
| + let sub = builder.addFunction("sub", sig_index)
|
| + .addBody([
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprI32Sub // --
|
| + ]);
|
| + return {mul: mul, add: add, sub: sub};
|
| +}
|
| +
|
| +(function ExportedTableTest() {
|
| + print("ExportedTableTest...");
|
| +
|
| + let builder = new WasmModuleBuilder();
|
| +
|
| + let d = builder.addImport("js_div", kSig_i_ii);
|
| + let f = AddFunctions(builder);
|
| + builder.addFunction("main", kSig_i_ii)
|
| + .addBody([
|
| + kExprI32Const, 33, // --
|
| + kExprGetLocal, 0, // --
|
| + kExprGetLocal, 1, // --
|
| + kExprCallIndirect, 0]) // --
|
| + .exportAs("main");
|
| +
|
| + f.add.exportAs("blarg");
|
| +
|
| + builder.setFunctionTableLength(10);
|
| + 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 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);
|
| + let instance = new WebAssembly.Instance(module, {base: i, js_div: js_div});
|
| + main = instance.exports.main;
|
| + let table = instance.exports.table;
|
| + assertTrue(table instanceof WebAssembly.Table);
|
| + assertEquals(10, table.length);
|
| + for (let j = 0; j < i; j++) {
|
| + assertSame(null, table.get(j));
|
| + }
|
| + let mul = table.get(i+0);
|
| + let add = table.get(i+1);
|
| + let sub = table.get(i+2);
|
| +
|
| + print(" mul=" + mul);
|
| + print(" add=" + add);
|
| + print(" sub=" + sub);
|
| + assertEquals("function", typeof mul);
|
| + assertEquals("function", typeof add);
|
| + assertEquals("function", typeof sub);
|
| + assertEquals(2, mul.length);
|
| + assertEquals(2, add.length);
|
| + assertEquals(2, sub.length);
|
| + assertEquals("blarg", add.name);
|
| +
|
| + let exp_div = table.get(i+3);
|
| + assertEquals("function", typeof exp_div);
|
| + print(" js_div=" + exp_div);
|
| + // Should have a new, wrapped version of the import.
|
| + assertFalse(js_div == exp_div);
|
| +
|
| +
|
| + for (let j = i + 4; j < 10; j++) {
|
| + assertSame(null, table.get(j));
|
| + }
|
| +
|
| + assertEquals(-33, mul(-11, 3));
|
| + assertEquals(4444444, add(3333333, 1111111));
|
| + assertEquals(-9999, sub(1, 10000));
|
| + assertEquals(-44, exp_div(-88.1, 2));
|
| + }
|
| +})();
|
|
|