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