node/deps/v8/test/mjsunit/wasm/shared-everything/basic.js
Michaël Zasso cfbf9e0d14 deps: update V8 to 12.4.254.14
PR-URL: https://github.com/nodejs/node/pull/52465
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Michael Dawson <midawson@redhat.com>
2024-04-22 21:25:15 +00:00

258 lines
9.2 KiB
JavaScript

// Copyright 2024 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-shared
d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js");
(function SharedGlobal() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_i_i, kNoSuperType, true, true);
let global = builder.addGlobal(kWasmI32, true, true, [kExprI32Const, 0]);
builder.addFunction("roundtrip", sig)
.addBody([kExprLocalGet, 0, kExprGlobalSet, global.index,
kExprGlobalGet, global.index])
.exportFunc();
let wasm = builder.instantiate().exports;
assertEquals(10, wasm.roundtrip(10));
})();
(function SharedGlobalAbstractType() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_i_i, kNoSuperType, true, false);
let struct = builder.addStruct(
[makeField(kWasmI32, true)], kNoSuperType, false, true);
let global = builder.addGlobal(
wasmRefNullType(kWasmAnyRef, true), true, true,
[kExprRefNull, kWasmSharedTypeForm, kAnyRefCode]);
builder.addFunction("roundtrip", sig)
.addBody([kExprLocalGet, 0, kGCPrefix, kExprStructNew, struct,
kExprGlobalSet, global.index,
kExprGlobalGet, global.index,
kGCPrefix, kExprRefCast, struct,
kGCPrefix, kExprStructGet, struct, 0])
.exportFunc();
let wasm = builder.instantiate().exports;
assertEquals(10, wasm.roundtrip(10));
})();
(function SharedGlobalInNonSharedFunction() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_i_i, kNoSuperType, true, false);
let global = builder.addGlobal(kWasmI32, true, true, [kExprI32Const, 0]);
builder.addFunction("roundtrip", sig)
.addBody([kExprLocalGet, 0, kExprGlobalSet, global.index,
kExprGlobalGet, global.index])
.exportFunc();
let wasm = builder.instantiate().exports;
assertEquals(10, wasm.roundtrip(10));
})();
(function InvalidGlobalInSharedFunction() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_v_i, kNoSuperType, true, true);
let global = builder.addGlobal(kWasmI32, true, false, [kExprI32Const, 0]);
builder.addFunction("setter", sig)
.addBody([kExprLocalGet, 0, kExprGlobalSet, global.index]);
assertThrows(() => builder.instantiate(), WebAssembly.CompileError,
/Cannot access non-shared global 0 in a shared function/);
})();
(function InvalidGlobalInSharedConstantExpression() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let global_non_shared =
builder.addGlobal(kWasmI32, true, false, [kExprI32Const, 0]);
builder.addGlobal(
kWasmI32, true, true, [kExprGlobalGet, global_non_shared.index]);
assertThrows(
() => builder.instantiate(), WebAssembly.CompileError,
/Cannot access non-shared global 0 in a shared constant expression/);
})();
(function InvalidImportedGlobal() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_i_i);
builder.addImportedGlobal("m", "g", wasmRefType(sig), true, true);
assertThrows(
() => builder.instantiate(), WebAssembly.CompileError,
/shared imported global must have shared type/);
})();
(function SharedTypes() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_i_i, kNoSuperType, true, true);
let struct =
builder.addStruct([makeField(kWasmI32, true)], kNoSuperType, false, true);
builder.addFunction("main", sig)
.addLocals(wasmRefType(struct), 1)
.addBody([
kExprLocalGet, 0, kGCPrefix, kExprStructNew, struct,
kExprLocalSet, 1,
kExprLocalGet, 1, kGCPrefix, kExprStructGet, struct, 0])
.exportFunc();
let wasm = builder.instantiate().exports;
assertEquals(42, wasm.main(42));
})();
(function InvalidLocal() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_i_i, kNoSuperType, true, true);
let struct =
builder.addStruct([makeField(kWasmI32, true)], kNoSuperType, false, false);
builder.addFunction("main", sig)
.addLocals(wasmRefType(struct), 1)
.addBody([kExprLocalGet, 0])
.exportFunc();
assertThrows(() => builder.instantiate(), WebAssembly.CompileError,
/local must have shared type/)
})();
(function InvalidStack() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_i_v, kNoSuperType, true, true);
let struct =
builder.addStruct([makeField(kWasmI32, true)], kNoSuperType, false, false);
builder.addFunction("main", sig)
.addBody([
kExprI32Const, 42, kGCPrefix, kExprStructNew, struct,
kGCPrefix, kExprStructGet, struct, 0])
.exportFunc();
assertThrows(() => builder.instantiate(), WebAssembly.CompileError,
/struct.new does not have a shared type/);
})();
(function InvalidFuncRefInConstantExpression() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_i_i);
let adder = builder.addFunction("adder", sig)
.addBody([kExprLocalGet, 0, kExprLocalGet, 1, kExprI32Add])
let global = builder.addGlobal(wasmRefType(sig), true, true,
[kExprRefFunc, adder.index]);
assertThrows(() => builder.instantiate(), WebAssembly.CompileError,
/ref.func does not have a shared type/);
})();
(function DataSegmentInFunction() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_v_v, kNoSuperType, false, true);
let data = builder.addPassiveDataSegment([1, 2, 3], true);
builder.addFunction("drop", sig)
.addBody([kNumericPrefix, kExprDataDrop, data])
builder.instantiate();
})();
(function InvalidDataSegmentInFunction() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_v_v, kNoSuperType, false, true);
let data = builder.addPassiveDataSegment([1, 2, 3], false);
builder.addFunction("drop", sig)
.addBody([kNumericPrefix, kExprDataDrop, data])
assertThrows(() => builder.instantiate(), WebAssembly.CompileError,
/cannot refer to non-shared segment/);
})();
(function ElementSegmentInFunction() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_v_v, kNoSuperType, false, true);
let func = builder.addFunction("void", sig).addBody([]);
let elem = builder.addPassiveElementSegment(
[[kExprRefFunc, func.index]], wasmRefType(0), true);
builder.addFunction("drop", sig)
.addBody([kNumericPrefix, kExprElemDrop, elem])
builder.instantiate();
})();
(function InvalidElementSegmentInFunction() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig = builder.addType(kSig_v_v, kNoSuperType, false, true);
let elem = builder.addPassiveElementSegment(
[[kExprRefNull, kNullFuncRefCode]], kWasmFuncRef, false);
builder.addFunction("drop", sig)
.addBody([kNumericPrefix, kExprElemDrop, elem])
assertThrows(() => builder.instantiate(), WebAssembly.CompileError,
/cannot reference non-shared element segment/);
})();
(function TableInFunction() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let struct = builder.addStruct([makeField(kWasmI32, true)], kNoSuperType,
true, true);
let sig = builder.addType(makeSig([kWasmI32], [wasmRefNullType(struct)]),
kNoSuperType, false, true);
let table = builder.addTable(wasmRefNullType(struct), 10, undefined,
[kExprRefNull, struct], true);
builder.addFunction("get", sig)
.addBody([kExprLocalGet, 0, kExprTableGet, table.index])
.exportFunc();
let instance = builder.instantiate();
assertEquals(null, instance.exports.get(0));
})();
(function InvalidTableInFunction() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let struct = builder.addStruct([makeField(kWasmI32, true)], kNoSuperType,
true, true);
let sig = builder.addType(makeSig([kWasmI32], [wasmRefNullType(struct)]),
kNoSuperType, false, true);
let table = builder.addTable(wasmRefNullType(struct), 10, undefined,
[kExprRefNull, struct], false);
builder.addFunction("get", sig)
.addBody([kExprLocalGet, 0, kExprTableGet, table.index])
.exportFunc();
assertThrows(() => builder.instantiate(), WebAssembly.CompileError,
/cannot reference non-shared table/);
})();
(function InvalidTableInitializer() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
let sig_shared = builder.addType(kSig_v_v, kNoSuperType, false, true);
let sig = builder.addType(kSig_v_v, kNoSuperType, false, false);
builder.addTable(wasmRefNullType(sig_shared), 10, undefined,
[kExprRefNull, sig], true);
assertThrows(() => builder.instantiate(), WebAssembly.CompileError,
/type error in constant expression\[0\] \(expected \(ref null 0\), got \(ref null 1\)\)/);
})();