71 lines
2.1 KiB
JavaScript
71 lines
2.1 KiB
JavaScript
|
// 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));
|