// 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"); load("test/mjsunit/wasm/wasm-module-builder.js"); function testCallFFI(ffi) { var builder = new WasmModuleBuilder(); var sig_index = kSig_i_dd; builder.addImport("", "fun", sig_index); builder.addFunction("main", sig_index) .addBody([ kExprGetLocal, 0, // -- kExprGetLocal, 1, // -- kExprCallFunction, 0, // -- ]) // -- .exportFunc(); var module = builder.instantiate(ffi); } // everything is good. (function() { var 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); }); (function I64InSignatureThrows() { var builder = new WasmModuleBuilder(); builder.addMemory(1, 1, true); builder.addFunction("function_with_invalid_signature", kSig_l_ll) .addBody([ // -- kExprGetLocal, 0, // -- kExprGetLocal, 1, // -- kExprI64Sub]) // -- .exportFunc() var module = builder.instantiate(); assertThrows(function() { module.exports.function_with_invalid_signature(33, 88); }, TypeError); })(); (function I64ParamsInSignatureThrows() { var builder = new WasmModuleBuilder(); builder.addMemory(1, 1, true); builder.addFunction("function_with_invalid_signature", kSig_i_l) .addBody([ kExprGetLocal, 0, kExprI32ConvertI64 ]) .exportFunc() var module = builder.instantiate(); assertThrows(function() { module.exports.function_with_invalid_signature(33); }, TypeError); })(); (function I64JSImportThrows() { var builder = new WasmModuleBuilder(); var sig_index = builder.addType(kSig_i_i); var sig_i64_index = builder.addType(kSig_i_l); var index = builder.addImport("", "func", sig_i64_index); builder.addFunction("main", sig_index) .addBody([ kExprGetLocal, 0, kExprI64SConvertI32, kExprCallFunction, index // -- ]) // -- .exportFunc(); var func = function() {return {};}; var main = builder.instantiate({"": {func: func}}).exports.main; assertThrows(function() { main(13); }, TypeError); })(); (function ImportI64ParamWithF64ReturnThrows() { // This tests that we generate correct code by using the correct return // register. See bug 6096. var builder = new WasmModuleBuilder(); builder.addImport('', 'f', makeSig([kWasmI64], [kWasmF64])); builder.addFunction('main', kSig_v_v) .addBody([kExprI64Const, 0, kExprCallFunction, 0, kExprDrop]) .exportFunc(); var instance = builder.instantiate({'': {f: i => i}}); assertThrows(() => instance.exports.main(), TypeError); })(); (function ImportI64Return() { // This tests that we generate correct code by using the correct return // register(s). See bug 6104. var builder = new WasmModuleBuilder(); builder.addImport('', 'f', makeSig([], [kWasmI64])); builder.addFunction('main', kSig_v_v) .addBody([kExprCallFunction, 0, kExprDrop]) .exportFunc(); var instance = builder.instantiate({'': {f: () => 1}}); assertThrows(() => instance.exports.main(), TypeError); })(); (function ImportSymbolToNumberThrows() { var builder = new WasmModuleBuilder(); var index = builder.addImport("", "func", kSig_i_v); builder.addFunction("main", kSig_i_v) .addBody([kExprCallFunction, 0]) .exportFunc(); var func = () => Symbol(); var main = builder.instantiate({"": {func: func}}).exports.main; assertThrows(() => main(), TypeError); })();