2020-08-14 17:17:54 +00:00
|
|
|
// 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-type-reflection --experimental-wasm-gc
|
|
|
|
|
2021-06-01 12:46:36 +00:00
|
|
|
d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
|
2020-08-14 17:17:54 +00:00
|
|
|
|
2022-12-01 08:31:27 +00:00
|
|
|
(function TestImportedRefCall() {
|
|
|
|
print(arguments.callee.name);
|
2020-09-18 06:26:44 +00:00
|
|
|
var exporting_instance = (function () {
|
|
|
|
var builder = new WasmModuleBuilder();
|
|
|
|
|
|
|
|
builder.addFunction("addition", kSig_i_ii)
|
|
|
|
.addBody([kExprLocalGet, 0, kExprLocalGet, 1, kExprI32Add])
|
|
|
|
.exportFunc();
|
|
|
|
|
|
|
|
return builder.instantiate({});
|
|
|
|
})();
|
|
|
|
|
2020-08-14 17:17:54 +00:00
|
|
|
var instance = (function () {
|
|
|
|
var builder = new WasmModuleBuilder();
|
|
|
|
|
|
|
|
var sig_index = builder.addType(kSig_i_ii);
|
|
|
|
|
2020-10-22 16:08:18 +00:00
|
|
|
var imported_js_api_function_index =
|
|
|
|
builder.addImport("imports", "js_api_mul", sig_index);
|
2020-08-14 17:17:54 +00:00
|
|
|
|
|
|
|
var imported_js_function_index =
|
2020-09-18 06:26:44 +00:00
|
|
|
builder.addImport("imports", "js_add", sig_index);
|
|
|
|
|
|
|
|
var imported_wasm_function_index =
|
|
|
|
builder.addImport("imports", "wasm_add", sig_index);
|
2020-08-14 17:17:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
var locally_defined_function =
|
|
|
|
builder.addFunction("sub", sig_index)
|
2020-09-18 06:26:44 +00:00
|
|
|
.addBody([kExprLocalGet, 0, kExprLocalGet, 1, kExprI32Sub])
|
2020-08-14 17:17:54 +00:00
|
|
|
.exportFunc();
|
|
|
|
|
2020-09-18 06:26:44 +00:00
|
|
|
builder.addFunction("main", makeSig(
|
|
|
|
[wasmRefType(sig_index), kWasmI32, kWasmI32], [kWasmI32]))
|
|
|
|
.addBody([kExprLocalGet, 1, kExprLocalGet, 2, kExprLocalGet, 0,
|
2022-08-30 16:48:43 +00:00
|
|
|
kExprCallRef, sig_index])
|
2020-08-14 17:17:54 +00:00
|
|
|
.exportFunc();
|
|
|
|
|
2020-09-18 06:26:44 +00:00
|
|
|
builder.addFunction("test_local", kSig_i_v)
|
|
|
|
.addBody([kExprI32Const, 55, kExprI32Const, 42,
|
2022-08-30 16:48:43 +00:00
|
|
|
kExprRefFunc, locally_defined_function.index,
|
|
|
|
kExprCallRef, sig_index])
|
2020-08-14 17:17:54 +00:00
|
|
|
.exportFunc();
|
|
|
|
|
2020-09-18 06:26:44 +00:00
|
|
|
builder.addFunction("test_js_import", kSig_i_v)
|
|
|
|
.addBody([kExprI32Const, 15, kExprI32Const, 42,
|
2022-08-30 16:48:43 +00:00
|
|
|
kExprRefFunc, imported_js_function_index,
|
|
|
|
kExprCallRef, sig_index])
|
2020-08-14 17:17:54 +00:00
|
|
|
.exportFunc();
|
|
|
|
|
2020-10-22 16:08:18 +00:00
|
|
|
builder.addFunction("test_wasm_import", kSig_i_v)
|
|
|
|
.addBody([kExprI32Const, 15, kExprI32Const, 42,
|
2022-08-30 16:48:43 +00:00
|
|
|
kExprRefFunc, imported_wasm_function_index,
|
|
|
|
kExprCallRef, sig_index])
|
2020-10-22 16:08:18 +00:00
|
|
|
.exportFunc();
|
2020-09-18 06:26:44 +00:00
|
|
|
|
2020-10-22 16:08:18 +00:00
|
|
|
builder.addFunction("test_js_api_import", kSig_i_v)
|
2020-09-18 06:26:44 +00:00
|
|
|
.addBody([kExprI32Const, 3, kExprI32Const, 7,
|
2020-10-22 16:08:18 +00:00
|
|
|
kExprRefFunc, imported_js_api_function_index,
|
2022-08-30 16:48:43 +00:00
|
|
|
kExprCallRef, sig_index])
|
2020-09-18 06:26:44 +00:00
|
|
|
.exportFunc();
|
2020-10-22 16:08:18 +00:00
|
|
|
|
|
|
|
builder.addExport("reexported_js_function", imported_js_function_index);
|
|
|
|
|
|
|
|
// Just to make these functions eligible for call_ref.
|
|
|
|
builder.addDeclarativeElementSegment([imported_wasm_function_index,
|
|
|
|
imported_js_api_function_index]);
|
2020-09-18 06:26:44 +00:00
|
|
|
|
2020-08-14 17:17:54 +00:00
|
|
|
return builder.instantiate({imports: {
|
2020-09-18 06:26:44 +00:00
|
|
|
js_add: function(a, b) { return a + b; },
|
|
|
|
wasm_add: exporting_instance.exports.addition,
|
2020-10-22 16:08:18 +00:00
|
|
|
js_api_mul: new WebAssembly.Function(
|
|
|
|
{parameters:['i32', 'i32'], results: ['i32']},
|
|
|
|
function(a, b) { return a * b; })
|
2020-08-14 17:17:54 +00:00
|
|
|
}});
|
|
|
|
})();
|
|
|
|
|
2020-10-22 16:08:18 +00:00
|
|
|
// Check that the modules exist.
|
|
|
|
assertTrue(!!exporting_instance);
|
|
|
|
assertTrue(!!instance);
|
2020-08-14 17:17:54 +00:00
|
|
|
|
|
|
|
print("--locally defined func--");
|
|
|
|
assertEquals(13, instance.exports.test_local());
|
|
|
|
print("--locally defined exported func--")
|
|
|
|
assertEquals(5, instance.exports.main(instance.exports.sub, 12, 7));
|
|
|
|
|
|
|
|
print("--imported js func--");
|
|
|
|
assertEquals(57, instance.exports.test_js_import());
|
|
|
|
print("--imported and reexported js func--")
|
|
|
|
assertEquals(19, instance.exports.main(
|
|
|
|
instance.exports.reexported_js_function, 12, 7));
|
|
|
|
|
2020-09-18 06:26:44 +00:00
|
|
|
print("--imported function from another module--");
|
|
|
|
assertEquals(57, instance.exports.test_wasm_import());
|
|
|
|
print("--not imported function defined in another module--");
|
|
|
|
assertEquals(19, instance.exports.main(
|
|
|
|
exporting_instance.exports.addition, 12, 7));
|
2022-03-31 11:40:19 +00:00
|
|
|
|
2020-10-22 16:08:18 +00:00
|
|
|
print("--imported WebAssembly.Function--")
|
|
|
|
assertEquals(21, instance.exports.test_js_api_import());
|
|
|
|
print("--not imported WebAssembly.Function--")
|
|
|
|
assertEquals(-5, instance.exports.main(
|
|
|
|
new WebAssembly.Function(
|
|
|
|
{parameters:['i32', 'i32'], results: ['i32']},
|
|
|
|
function(a, b) { return a - b; }),
|
|
|
|
10, 15));
|
|
|
|
print("--not imported WebAssembly.Function, arity mismatch--")
|
|
|
|
assertEquals(100, instance.exports.main(
|
|
|
|
new WebAssembly.Function(
|
|
|
|
{parameters:['i32', 'i32'], results: ['i32']},
|
|
|
|
function(a) { return a * a; }),
|
|
|
|
10, 15));
|
2020-08-14 17:17:54 +00:00
|
|
|
})();
|
2021-04-23 12:40:13 +00:00
|
|
|
|
|
|
|
(function TestFromJSSlowPath() {
|
2022-12-01 08:31:27 +00:00
|
|
|
print(arguments.callee.name);
|
2021-04-23 12:40:13 +00:00
|
|
|
var builder = new WasmModuleBuilder();
|
|
|
|
var sig_index = builder.addType(kSig_i_i);
|
|
|
|
|
|
|
|
builder.addFunction("main", makeSig(
|
|
|
|
[wasmRefType(sig_index), kWasmI32], [kWasmI32]))
|
2022-08-30 16:48:43 +00:00
|
|
|
.addBody([kExprLocalGet, 1, kExprLocalGet, 0, kExprCallRef, sig_index])
|
2021-04-23 12:40:13 +00:00
|
|
|
.exportFunc();
|
|
|
|
|
|
|
|
var instance = builder.instantiate({});
|
|
|
|
|
|
|
|
var fun = new WebAssembly.Function(
|
|
|
|
{ parameters: ['i32'], results: ['i32'] }, (a) => undefined);
|
|
|
|
// {undefined} is converted to 0.
|
|
|
|
assertEquals(0, instance.exports.main(fun, 1000));
|
|
|
|
})();
|
2022-12-01 08:31:27 +00:00
|
|
|
|
|
|
|
(function TestImportedFunctionSubtyping() {
|
|
|
|
print(arguments.callee.name);
|
|
|
|
var exporting_instance = (function () {
|
|
|
|
var builder = new WasmModuleBuilder();
|
|
|
|
let super_struct = builder.addStruct([makeField(kWasmI32, true)]);
|
|
|
|
let sub_struct = builder.addStruct(
|
|
|
|
[makeField(kWasmI32, true), makeField(kWasmI64, true)], super_struct);
|
|
|
|
let super_sig = builder.addType(makeSig([wasmRefNullType(sub_struct)],
|
|
|
|
[kWasmI32]))
|
|
|
|
let sub_sig = builder.addType(makeSig([wasmRefNullType(super_struct)],
|
|
|
|
[kWasmI32]), super_sig)
|
|
|
|
|
|
|
|
builder.addFunction("exported_function", sub_sig)
|
|
|
|
.addBody([kExprLocalGet, 0, kGCPrefix, kExprStructGet, super_struct, 0])
|
|
|
|
.exportFunc();
|
|
|
|
|
|
|
|
return builder.instantiate({});
|
|
|
|
})();
|
|
|
|
|
|
|
|
var instance = (function () {
|
|
|
|
var builder = new WasmModuleBuilder();
|
|
|
|
// These should canonicalize to the same types as the exporting instance.
|
|
|
|
let super_struct = builder.addStruct([makeField(kWasmI32, true)]);
|
|
|
|
let sub_struct = builder.addStruct(
|
|
|
|
[makeField(kWasmI32, true), makeField(kWasmI64, true)], super_struct);
|
|
|
|
let super_sig = builder.addType(makeSig([wasmRefNullType(sub_struct)],
|
|
|
|
[kWasmI32]))
|
|
|
|
builder.addImport("m", "f", super_sig);
|
|
|
|
|
|
|
|
// Import is a function of the declared type.
|
|
|
|
return builder.instantiate({m: {f:
|
|
|
|
exporting_instance.exports.exported_function}});
|
|
|
|
})();
|
|
|
|
})();
|