v8/test/inspector/debugger/wasm-stepping-no-opcode-merging.js
Benedikt Meurer 6f448efbef [inspector] Make wasm tests fail rather than time out.
Consistently use InspectorTest.runAsyncTestSuite() in wasm inspector
tests to make tests easier to debug (they'll fail instead of timing
out in case of errors).

Bug: chromium:1162229, chromium:1071432
Change-Id: I7aada196f9e34071aa1bb059bb45f85f75226060
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2609414
Commit-Queue: Yang Guo <yangguo@chromium.org>
Auto-Submit: Benedikt Meurer <bmeurer@chromium.org>
Reviewed-by: Yang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#71908}
2021-01-05 07:38:57 +00:00

66 lines
2.3 KiB
JavaScript

// Copyright 2020 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.
utils.load('test/inspector/wasm-inspector-test.js');
let {session, contextGroup, Protocol} = InspectorTest.start(
'Tests that Liftoff does not merge opcodes while stepping');
session.setupScriptMap();
let builder = new WasmModuleBuilder();
// i32.eqz and br_if are usually merged, so we wouldn't see any
// update on the operand stack after i32.eqz. For debugging,
// this is disabled, so we should see the result.
let body = [kExprLocalGet, 0, kExprI32Eqz, kExprBrIf, 0];
let fun = builder.addFunction('fun', kSig_v_i).addBody(body).exportFunc();
let module_bytes = builder.toArray();
let wasm_script_id = undefined;
Protocol.Debugger.onPaused(printPauseLocationAndStep);
InspectorTest.runAsyncTestSuite([
async function test() {
await Protocol.Debugger.enable();
WasmInspectorTest.instantiate(module_bytes);
[, {params: {scriptId: wasm_script_id}}] = await Protocol.Debugger.onceScriptParsed(2);
// Set a breakpoint at the beginning of 'fun'.
const offset = fun.body_offset;
InspectorTest.log(`Setting breakpoint at offset ${offset}.`);
let bpmsg = await Protocol.Debugger.setBreakpoint({
location: {scriptId: wasm_script_id, lineNumber: 0, columnNumber: offset}
});
for (let value of [0, -1, 13]) {
await Protocol.Runtime.evaluate(
{expression: `instance.exports.fun(${value})`});
}
}
]);
async function printPauseLocationAndStep(msg) {
// If we are outside of wasm, continue.
let loc = msg.params.callFrames[0].location;
if (loc.scriptId != wasm_script_id) {
Protocol.Debugger.resume();
return;
}
// Inspect only the top wasm frame.
let frame = msg.params.callFrames[0];
let scopes = {};
for (let scope of frame.scopeChain) {
if (scope.type == 'module') continue;
let scope_properties =
await Protocol.Runtime.getProperties({objectId: scope.object.objectId});
scopes[scope.type] = scope_properties.result.result.map(
elem => WasmInspectorTest.getWasmValue(elem.value));
}
let values = scopes['local'].concat(scopes['wasm-expression-stack']).join(', ');
InspectorTest.log(`Paused at offset ${loc.columnNumber}: [${values}]`);
Protocol.Debugger.stepOver();
}