text: // Copyright 2015 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");
  
  function testCallFFI(ffi) {
    var kBodySize = 6;
    var kNameAddOffset = 28 + kBodySize + 1;
    var kNameMainOffset = kNameAddOffset + 4;
  
    var data = bytes(
      kDeclMemory,
      12, 12, 1,                  // memory
      // -- signatures
      kDeclSignatures, 1,
      2, kAstI32, kAstF64, kAstF64, // (f64,f64)->int
      // -- foreign function
      kDeclFunctions, 2,
      kDeclFunctionName | kDeclFunctionImport,
      0, 0,                       // signature index
      kNameAddOffset, 0, 0, 0,    // name offset
      // -- main function
      kDeclFunctionName | kDeclFunctionExport,
      0, 0,                       // signature index
      kNameMainOffset, 0, 0, 0,   // name offset
      kBodySize, 0,
      // main body
      kExprCallFunction, 0,       // --
      kExprGetLocal, 0,           // --
      kExprGetLocal, 1,           // --
      // names
      kDeclEnd,
      'f', 'u', 'n', 0,           //  --
      'm', 'a', 'i', 'n', 0       //  --
    );
  
    print("instantiate FFI");
    var module = _WASMEXP_.instantiateModule(data, ffi);
  }
  
  // everything is good.
  (function() {
    var ffi = new Object();
    ffi.fun = function(a, b) { print(a, b); }
    testCallFFI(ffi);
  })();
  
  
  // FFI object should be an object.
  assertThrows(function() {
    var ffi = 0;
    testCallFFI(ffi);
  });
  
  
  // FFI object should have a "fun" property.
  assertThrows(function() {
    var ffi = new Object();
    testCallFFI(ffi);
  });
  
  
  // "fun" should be a JS function.
  assertThrows(function() {
    var ffi = new Object();
    ffi.fun = new Object();
    testCallFFI(ffi);
  });
  
  
  // "fun" should be a JS function.
  assertThrows(function() {
    var ffi = new Object();
    ffi.fun = 0;
    testCallFFI(ffi);
  });
  