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

71 lines
2.1 KiB
JavaScript
Raw Permalink Normal View History

// 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: --allow-natives-syntax --no-wasm-loop-unrolling
d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
const builder = new WasmModuleBuilder();
let $struct0 =
builder.addStruct([makeField(kWasmI32, true)], kNoSuperType, true);
let $struct1 =
builder.addStruct([makeField(kWasmExternRef, true)], kNoSuperType, true);
let $sig2 = builder.addType(makeSig([kWasmAnyRef], []));
let $sig3 = builder.addType(kSig_v_i);
let $sig4 = builder.addType(makeSig([kWasmAnyRef], [kWasmExternRef]));
let external_func0 = builder.addImport('js', 'external_func', $sig2);
let doit1 = builder.addFunction(undefined, $sig3).exportAs('doit');
let read2 = builder.addFunction(undefined, $sig4).exportAs('read');
doit1.addLocals(kWasmAnyRef, 4)
.addBody([
kGCPrefix, kExprStructNewDefault, $struct0,
kExprLocalSet, 1,
kGCPrefix, kExprStructNewDefault, $struct0,
kExprLocalSet, 2,
kGCPrefix, kExprStructNewDefault, $struct0,
kExprLocalSet, 3,
kGCPrefix, kExprStructNewDefault, $struct1,
kExprLocalSet, 4,
kExprLoop, kWasmVoid,
kExprLocalGet, 1,
kGCPrefix, kExprRefCast, $struct0,
kExprLocalGet, 0,
kGCPrefix, kExprStructSet, $struct0, 0,
kExprLocalGet, 1,
kExprCallFunction, external_func0,
kExprLocalGet, 2,
kExprLocalSet, 1,
kExprLocalGet, 3,
kExprLocalSet, 2,
kExprLocalGet, 4,
kExprLocalSet, 3,
kExprBr, 0,
kExprEnd,
kExprUnreachable,
]);
read2.addBody([
kExprLocalGet, 0,
kGCPrefix, kExprRefCast, $struct1,
kGCPrefix, kExprStructGet, $struct1, 0,
]);
let call_count = 0;
let wasm_inst = builder.instantiate({
"js": {
"external_func": (ref) => {
call_count += 1;
if (call_count == 4) {
fakeobj = wasm_inst.exports['read'](ref);
throw 'unreachable';
}
}
}
});
let doit = wasm_inst.exports['doit'];
%WasmTierUpFunction(doit);
assertTraps(kTrapIllegalCast, () => doit(0));