mirror of
https://github.com/nodejs/node.git
synced 2025-08-20 17:35:43 +02:00

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>
258 lines
9.2 KiB
JavaScript
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\)\)/);
|
|
})();
|