nodejs/deps/v8/test/mjsunit/regress/wasm/regress-382291459.js

83 lines
2.5 KiB
JavaScript
Raw Permalink Normal View History

// 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.
d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
const BRUTE_FIELDS = 30;
const TOTAL_FIELDS = 40;
function convert_to_fields([base, idx], nullify = false) {
let fields = [];
for (let i = 0; i < TOTAL_FIELDS - BRUTE_FIELDS; i++) {
let is_mut = !!(base & (1 << i));
fields.push(makeField(
wasmRefNullType(!is_mut && nullify ? kWasmNullRef : kWasmAnyRef),
is_mut));
}
for (let i = 0; i < BRUTE_FIELDS; i++) {
let is_mut = !!(idx & (1 << i));
fields.push(makeField(
wasmRefNullType(!is_mut && nullify ? kWasmNullRef : kWasmAnyRef),
is_mut));
}
return fields;
}
let instance, addrof, caged_read, caged_write;
let coll = {
// post-592f191
mut: [0x1f7, 0x2e971cab], // field[0]: mut ref null any
const : [0x29c, 0xf09b901], // field[0]: !mut ref null any
idx: 0,
};
let builder = new WasmModuleBuilder();
let $s0 = builder.addStruct([makeField(kWasmI32, true)]);
let $s1 = builder.addStruct(
[makeField(kWasmExternRef, true), makeField(kWasmI32, true)]);
let $s2 = builder.addStruct(
[makeField(kWasmI32, true), makeField(wasmRefType($s0), true)]);
builder.startRecGroup();
let $s_dst =
builder.addStruct(convert_to_fields(coll.mut), kNoSuperType, false);
builder.endRecGroup();
builder.startRecGroup();
let $s_src =
builder.addStruct(convert_to_fields(coll.const), kNoSuperType, false);
builder.endRecGroup();
builder.startRecGroup();
let $s_src_none =
builder.addStruct(convert_to_fields(coll.const, true), $s_src, false);
builder.endRecGroup();
let $sig_i_r = builder.addType(makeSig([kWasmExternRef], [kWasmI32]));
let $sig_i_i = builder.addType(makeSig([kWasmI32], [kWasmI32]));
let $sig_v_ii = builder.addType(makeSig([kWasmI32, kWasmI32], []));
builder
.addFunction('foo', $sig_i_r)
.addLocals(wasmRefType($s_src_none), 1)
.addBody([
kGCPrefix, kExprStructNewDefault, $s_src_none,
kExprLocalTee, 1,
kExprLocalGet, 0,
...wasmI32Const(0),
kGCPrefix, kExprStructNew, $s1,
kGCPrefix, kExprStructSet, $s_dst, ...wasmSignedLeb(coll.idx),
kExprLocalGet, 1,
kGCPrefix, kExprStructGet, $s_src_none, ...wasmSignedLeb(coll.idx),
kGCPrefix, kExprStructGet, $s2, 0,
])
.exportFunc();
assertThrows(
() => builder.toModule(), WebAssembly.CompileError,
/struct.set\[0\] expected type.*, found local.tee of type/);