// Copyright 2019 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.

load("test/mjsunit/wasm/wasm-module-builder.js");

(function testTableGetNonExportedFunction() {
  print(arguments.callee.name);
  const builder = new WasmModuleBuilder();
  const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table");
  const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]);
  const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]);
  const offset = 3;
  builder.addElementSegment(0, offset, false, [f1.index, f2.index]);

  const instance = builder.instantiate();

  const table_function2 = instance.exports.table.get(offset + 1);
  assertEquals(22, table_function2());
})();

(function testTableGetExportedFunction() {
  print(arguments.callee.name);
  const builder = new WasmModuleBuilder();
  const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table");
  const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]);
  const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22])
                    .exportAs("f2");
  const offset = 3;
  builder.addElementSegment(0, offset, false, [f1.index, f2.index]);

  const instance = builder.instantiate();

  const table_function2 = instance.exports.table.get(offset + 1);
  assertEquals(22, table_function2());
})();

(function testTableGetOverlappingSegments() {
  print(arguments.callee.name);
  const builder = new WasmModuleBuilder();
  const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table");
  const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]);
  const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]);
  const offset = 3;
  builder.addElementSegment(0, offset, false, [f1.index, f2.index]);
  builder.addElementSegment(0, offset + 1, false, [f1.index, f2.index]);

  const instance = builder.instantiate();

  const table_function1 = instance.exports.table.get(offset + 1);
  assertEquals(11, table_function1());
})();

(function testTableGetUniqueWrapperExportedFunction() {
  print(arguments.callee.name);
  const builder = new WasmModuleBuilder();
  const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table");
  const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]).exportAs("f1");
  const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]);
  const offset = 3;
  builder.addElementSegment(0, offset, false, [f1.index, f1.index, f1.index]);

  const instance = builder.instantiate();

  assertEquals(undefined, instance.exports.f1.tag);
  const my_tag = { hello: 15 };
  instance.exports.f1.tag = my_tag;

  assertSame(my_tag, instance.exports.table.get(offset).tag);
  assertSame(my_tag, instance.exports.table.get(offset + 1).tag);
  assertSame(my_tag, instance.exports.table.get(offset + 2).tag);
})();

(function testTableGetUniqueWrapperNonExportedFunction() {
  print(arguments.callee.name);
  const builder = new WasmModuleBuilder();
  const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table");
  const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]);
  const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]);
  const offset = 3;
  builder.addElementSegment(0, offset, false, [f1.index, f1.index, f1.index]);

  const instance = builder.instantiate();

  assertEquals(undefined, instance.exports.table.get(offset).tag);
  const my_tag = { hello: 15 };
  instance.exports.table.get(offset).tag = my_tag;

  assertSame(my_tag, instance.exports.table.get(offset + 1).tag);
  assertSame(my_tag, instance.exports.table.get(offset + 2).tag);
})();

(function testTableGetEmptyValue() {
  print(arguments.callee.name);
  const builder = new WasmModuleBuilder();
  const table = builder.addTable(kWasmAnyFunc, 20).exportAs("table");
  const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]);
  const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]);
  const offset = 3;
  builder.addElementSegment(0, offset, false, [f1.index, f1.index, f1.index]);

  const instance = builder.instantiate();
  assertEquals(null, instance.exports.table.get(offset - 1));
})();

(function testTableGetOOB() {
  print(arguments.callee.name);
  const builder = new WasmModuleBuilder();
  const size = 20;
  const table = builder.addTable(kWasmAnyFunc, size).exportAs("table");
  const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]);
  const f2 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 22]);
  const offset = 3;
  builder.addElementSegment(0, offset, false, [f1.index, f1.index, f1.index]);

  const instance = builder.instantiate();
  assertThrows(() => instance.exports.table.get(size + 3), RangeError);
})();

(function testTableGetImportedFunction() {
  print(arguments.callee.name);
  const builder = new WasmModuleBuilder();
  const size = 20;
  const table = builder.addTable(kWasmAnyFunc, size).exportAs("table");
  const import1 = builder.addImport("q", "fun", kSig_i_ii);
  const f1 = builder.addFunction('f', kSig_i_v).addBody([kExprI32Const, 11]);
  const offset = 3;
  builder.addElementSegment(0, offset, false, [f1.index, import1]);

  const instance = builder.instantiate({q: {fun: () => 33}});
  assertEquals(33, instance.exports.table.get(offset + 1)());
})();
