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

// Flags: --experimental-wasm-compilation-hints --wasm-lazy-validation

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

(function testInterpreterCallsLazyFunctionInOtherInstance() {
  print(arguments.callee.name);
  let builder0 = new WasmModuleBuilder();
  builder0.addFunction("getX", kSig_i_v)
          .addBody([kExprI32Const, 42])
          .setCompilationHint(kCompilationHintStrategyLazy,
                              kCompilationHintTierBaseline,
                              kCompilationHintTierBaseline)
          .exportFunc();
  let builder1 = new WasmModuleBuilder();
  builder1.addImport("otherModule", "getX", kSig_i_v);
  builder1.addFunction("plusX", kSig_i_i)
          .addBody([kExprCallFunction, 0,
                    kExprGetLocal, 0,
                    kExprI32Add])
          .setCompilationHint(kCompilationHintStrategyLazy,
                              kCompilationHintTierInterpreter,
                              kCompilationHintTierInterpreter)
          .exportFunc();
  let instance0 = builder0.instantiate();
  let instance1 = builder1.instantiate(
      {otherModule: {getX: instance0.exports.getX}});
  assertEquals(46, instance1.exports.plusX(4));
})();

(function testInterpreterCallsLazyBadFunctionInOtherInstance() {
  print(arguments.callee.name);
  let builder0 = new WasmModuleBuilder();
  builder0.addFunction("getX", kSig_i_v)
          .addBody([kExprI64Const, 42])
          .setCompilationHint(kCompilationHintStrategyLazy,
                              kCompilationHintTierBaseline,
                              kCompilationHintTierBaseline)
          .exportFunc();
  let builder1 = new WasmModuleBuilder();
  builder1.addImport("otherModule", "getX", kSig_i_v);
  builder1.addFunction("plusX", kSig_i_i)
          .addBody([kExprCallFunction, 0,
                    kExprGetLocal, 0,
                    kExprI32Add])
          .setCompilationHint(kCompilationHintStrategyLazy,
                              kCompilationHintTierInterpreter,
                              kCompilationHintTierInterpreter)
          .exportFunc();
  let instance0 = builder0.instantiate();
  let instance1 = builder1.instantiate(
      {otherModule: {getX: instance0.exports.getX}});
  assertThrows(() => instance1.exports.plusX(4),
               WebAssembly.CompileError,
               "Compiling function #0:\"getX\" failed: type error in " +
               "merge[0] (expected i32, got i64) @+57");
})();

(function testInterpreterCallsLazyFunctionThroughIndirection() {
  print(arguments.callee.name);
  let builder = new WasmModuleBuilder();
  let sig_i_ii = builder.addType(kSig_i_ii);
  let add = builder.addFunction('add', sig_i_ii)
                   .addBody([kExprGetLocal, 0,
                             kExprGetLocal, 1,
                             kExprI32Add])
                   .setCompilationHint(kCompilationHintStrategyLazy,
                                       kCompilationHintTierInterpreter,
                                       kCompilationHintTierInterpreter);
  builder.appendToTable([add.index]);
  builder.addFunction('main', kSig_i_iii)
         .addBody([// Call indirect #0 with args <#1, #2>.
                   kExprGetLocal, 1,
                   kExprGetLocal, 2,
                   kExprGetLocal, 0,
                   kExprCallIndirect, sig_i_ii, kTableZero])
         .setCompilationHint(kCompilationHintStrategyLazy,
                             kCompilationHintTierInterpreter,
                             kCompilationHintTierInterpreter)
         .exportFunc();
  assertEquals(99, builder.instantiate().exports.main(0, 22, 77));
})();

(function testInterpreterCallsLazyBadFunctionThroughIndirection() {
  print(arguments.callee.name);
  let builder = new WasmModuleBuilder();
  let sig_i_ii = builder.addType(kSig_i_ii);
  let add = builder.addFunction('add', sig_i_ii)
                   .addBody([kExprGetLocal, 0,
                             kExprGetLocal, 1,
                             kExprI64Add])
                   .setCompilationHint(kCompilationHintStrategyLazy,
                                       kCompilationHintTierInterpreter,
                                       kCompilationHintTierInterpreter);
  builder.appendToTable([add.index]);
  builder.addFunction('main', kSig_i_iii)
         .addBody([// Call indirect #0 with args <#1, #2>.
                   kExprGetLocal, 1,
                   kExprGetLocal, 2,
                   kExprGetLocal, 0,
                   kExprCallIndirect, sig_i_ii, kTableZero])
         .setCompilationHint(kCompilationHintStrategyLazy,
                             kCompilationHintTierInterpreter,
                             kCompilationHintTierInterpreter)
         .exportFunc();
  assertThrows(() => builder.instantiate().exports.main(0, 22, 77),
               WebAssembly.CompileError,
               "Compiling function #0:\"add\" failed: i64.add[1] expected " +
               "type i64, found local.get of type i32 @+83");
})();
