| // Copyright 2025 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'); |
| |
| const OK = true; |
| |
| // {recgroup2} is optional. |
| function Test(recgroup1, recgroup2, result) { |
| let builder = new WasmModuleBuilder(); |
| builder.startRecGroup(); |
| recgroup1(builder); |
| builder.endRecGroup(); |
| if (typeof recgroup2 === "function") { |
| builder.startRecGroup(); |
| recgroup2(builder); |
| builder.endRecGroup(); |
| } else { |
| result = recgroup2; |
| } |
| if (result === OK) { |
| return builder.instantiate(); // Does not throw. |
| } |
| assertThrows(() => builder.instantiate(), WebAssembly.CompileError, result); |
| } |
| |
| Test((builder) => { |
| builder.addStruct([makeField(wasmRefType(0), false)]); |
| builder.addStruct([makeField(wasmRefType(1), false)], 0); |
| }, OK); |
| |
| Test((builder) => { |
| builder.addStruct([makeField(wasmRefType(1), false)]); |
| builder.addStruct([makeField(wasmRefType(0), false)], 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addStruct([makeField(wasmRefType(0), true)]); |
| builder.addStruct([makeField(wasmRefType(1), true)], 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addStruct([makeField(wasmRefType(1), false)]); |
| builder.addStruct([makeField(wasmRefType(1), true)], 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addStruct([makeField(wasmRefType(1), true)]); |
| builder.addStruct([makeField(wasmRefType(1), false)], 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addStruct([makeField(wasmRefType(0), false)], kNoSuperType, true); |
| builder.addStruct([makeField(wasmRefType(1), false)], 0); |
| }, /type 1 extends final type 0/); |
| |
| Test((builder) => { |
| builder.addStruct([makeField(wasmRefType(0), false)], kNoSuperType, false, true); |
| builder.addStruct([makeField(wasmRefType(1), false)], 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addStruct([makeField(wasmRefType(0), false)]); |
| builder.addStruct([makeField(wasmRefType(1), false)], 0, false, true); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addStruct([]); |
| builder.addStruct([makeField(wasmRefType(0), false)], kNoSuperType, false, true); |
| }, /shared struct must have shared field types/); |
| |
| Test((builder) => { |
| builder.addStruct([makeField(kWasmI32, true), makeField(kWasmI32, true)]); |
| builder.addStruct([makeField(kWasmI32, true)], 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addArray(kWasmI32, false); |
| builder.addStruct([makeField(kWasmI32, false)], 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addArray(kWasmI32, true); |
| builder.addArray(kWasmI32, false, 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addArray(kWasmI32, false); |
| builder.addArray(kWasmI32, true, 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(0), true); |
| builder.addArray(wasmRefType(1), false, 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(0), true); |
| builder.addArray(wasmRefType(1), true, 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(0), true); |
| builder.addArray(wasmRefType(0), true, 0); |
| }, OK); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(0), false); |
| builder.addArray(wasmRefType(1), false, 0); |
| }, OK); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(1), false); |
| builder.addArray(wasmRefType(1), false, 0); |
| }, OK); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(1), false); |
| builder.addArray(wasmRefType(0), false, 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addArray(kWasmI32, true); |
| builder.addArray(wasmRefType(0), true, kNoSuperType, true, true); |
| }, /shared array must have shared element type/); |
| |
| Test((builder) => { |
| builder.addArray(kWasmI32, true, kNoSuperType, false, true); |
| builder.addArray(wasmRefType(0), true); |
| }, OK); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(0), false); |
| }, (builder) => { |
| builder.addArray(wasmRefType(1), false); |
| builder.addArray(wasmRefType(1), false, 1); |
| }, OK); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(0), false); |
| }, (builder) => { |
| builder.addArray(wasmRefType(1), false); |
| builder.addArray(wasmRefType(0), false, 0); |
| }, OK); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(0), false); |
| }, (builder) => { |
| builder.addArray(wasmRefType(1), false); |
| builder.addArray(wasmRefType(1), false, 0); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(0), false); |
| }, (builder) => { |
| builder.addArray(wasmRefType(1), false); |
| builder.addArray(wasmRefType(0), false, 1); |
| }, /invalid explicit supertype/); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(1), false); |
| }, (builder) => { |
| builder.addArray(wasmRefType(1), false, 0); |
| }, /Type index 1 is out of bounds/); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(0), false, 1); |
| builder.addArray(wasmRefType(0), false); |
| }, /invalid supertype 1/); |
| |
| Test((builder) => { |
| builder.addArray(wasmRefType(0), false, 1); |
| }, (builder) => { |
| builder.addArray(wasmRefType(0), false); |
| }, /invalid supertype 1/); |