| // 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)); | 
 | })(); |