// Copyright 2020 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-gc load("test/mjsunit/wasm/wasm-module-builder.js"); (function Test1() { var exporting_instance = (function () { var builder = new WasmModuleBuilder(); var sig_index = builder.addType(kSig_i_ii); var wrong_sig_index = builder.addType(kSig_i_i); var addition_index = builder.addFunction("addition", sig_index) .addBody([kExprLocalGet, 0, kExprLocalGet, 1, kExprI32Add]) .exportFunc(); var global = builder.addGlobal(wasmRefType(sig_index), false); global.function_index = addition_index; global.exportAs("global"); builder.addGlobal(wasmOptRefType(wrong_sig_index), false) .exportAs("mistyped_global"); return builder.instantiate({}); })(); // Mistyped imported global. assertThrows( () => { var builder = new WasmModuleBuilder(); var sig_index = builder.addType(kSig_i_ii); builder.addImportedGlobal("imports", "global", wasmOptRefType(sig_index), false); builder.instantiate( {imports: { global: exporting_instance.exports.mistyped_global }})}, WebAssembly.LinkError, /imported global does not match the expected type/ ); // Mistyped imported global due to cross-module typechecking. assertThrows( () => { var builder = new WasmModuleBuilder(); var sig_index = builder.addType(kSig_i_i); builder.addImportedGlobal("imports", "global", wasmOptRefType(sig_index), false); builder.instantiate( {imports: { global: exporting_instance.exports.global }})}, WebAssembly.LinkError, /imported global does not match the expected type/ ); // Non-function imported into function-typed global. assertThrows( () => { var builder = new WasmModuleBuilder(); var sig_index = builder.addType(kSig_i_ii); builder.addImportedGlobal("imports", "global", wasmOptRefType(sig_index), false); builder.instantiate({imports: { global: 42 }})}, WebAssembly.LinkError, /function-typed object must be null \(if nullable\) or a Wasm function object/ ); // Mistyped function import. assertThrows( () => { var builder = new WasmModuleBuilder(); var sig_index = builder.addType(kSig_i_i); builder.addImportedGlobal("imports", "global", wasmRefType(sig_index), false); builder.instantiate( {imports: { global: exporting_instance.exports.addition }})}, WebAssembly.LinkError, /assigned exported function has to be a subtype of the expected type/ ); var instance = (function () { var builder = new WasmModuleBuilder(); var sig_index = builder.addType(kSig_i_ii); builder.addImportedGlobal("imports", "global", wasmOptRefType(sig_index), false); builder.addFunction("test_import", kSig_i_ii) .addBody([kExprLocalGet, 0, kExprLocalGet, 1, kExprGlobalGet, 0, kExprCallRef]) .exportFunc(); return builder.instantiate({imports: { global: exporting_instance.exports.global }}); })(); // This module is valid. assertFalse(instance === undefined); assertFalse(instance === null); assertFalse(instance === 0); // The correct function reference has been passed. assertEquals(66, instance.exports.test_import(42, 24)); })();