v8/test/inspector/debugger/wasm-conditional-breakpoints.js
Benedikt Meurer f10edd0900 [inspector][wasm] Re-add WasmValue as JSObject subclass.
BREAKING CHANGE: The values of Wasm locals, stack, and globals are now
represented as objects instead of holding the (primitive) values
directly, and SIMD128 values are no longer represented as Uint8Arrays.
The DWARF extension has been prepared for this breaking change.

The new `WasmValue` comes with `type` and `value` properties that hold
its contents. The motivation here is that this is a more extensible
approach. In case of SIMD128, the `value` property holds the canonical
string representation, which has the additional advantage that these
values can be compared with `===` (and `==`).

This partially reverts https://crrev.com/c/2614428, the main difference
here being that WasmValue is now a proper JSObject that can be exposed
on the DebugEvaluate proxy API.

Screenshot: https://imgur.com/rcahNKM.png
Bug: chromium:1170282, chromium:1071432, chromium:1159402
Change-Id: Iea304e3680775123c41deb4c3d172ac949da1b98
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2643384
Reviewed-by: Philip Pfaffe <pfaffe@chromium.org>
Reviewed-by: Zhi An Ng <zhin@chromium.org>
Reviewed-by: Yang Guo <yangguo@chromium.org>
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#72570}
2021-02-09 05:50:16 +00:00

76 lines
2.8 KiB
JavaScript

// Copyright 2021 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');
const {session, contextGroup, Protocol} =
InspectorTest.start('Test conditional breakpoints in wasm.');
session.setupScriptMap();
const builder = new WasmModuleBuilder();
const fib_body = [
kExprLocalGet, 0, // i (for br_if or i32.sub)
kExprLocalGet, 0, kExprI32Const, 2, kExprI32LeS, // i < 2 ?
kExprBrIf, 0, // --> return i
kExprI32Const, 1, kExprI32Sub, // i - 1
kExprCallFunction, 0, // fib(i - 1)
kExprLocalGet, 0, kExprI32Const, 2, kExprI32Sub, // i - 2
kExprCallFunction, 0, // fib(i - 2)
kExprI32Add // add (and return)
];
const fib = builder.addFunction('fib', kSig_i_i).addBody(fib_body).exportFunc();
const module_bytes = builder.toArray();
const find_offset = opcode => fib.body_offset + fib_body.indexOf(opcode);
const breakpoints = [
{loc: find_offset(kExprLocalGet), cond: 'false'},
{loc: find_offset(kExprBrIf), cond: 'true'},
{loc: find_offset(kExprCallFunction), cond: '$var0.value==3'}
];
Protocol.Debugger.onPaused(async msg => {
var frames = msg.params.callFrames;
await session.logSourceLocation(frames[0].location);
var frame = msg.params.callFrames[0];
for (var scope of frame.scopeChain) {
if (scope.type != 'local') continue;
var properties = await Protocol.Runtime.getProperties(
{'objectId': scope.object.objectId});
for (var {name, value} of properties.result.result) {
value = await WasmInspectorTest.getWasmValue(value);
InspectorTest.log(`${name}: ${value}`);
}
}
Protocol.Debugger.resume();
});
InspectorTest.runAsyncTestSuite([
async function test() {
await Protocol.Debugger.enable();
InspectorTest.log('Instantiating.');
// Spawn asynchronously:
WasmInspectorTest.instantiate(module_bytes);
InspectorTest.log('Waiting for wasm script.');
const [, {params: wasm_script}] = await Protocol.Debugger.onceScriptParsed(2);
InspectorTest.log(`Got wasm script: ${wasm_script.url}`);
for (let breakpoint of breakpoints) {
InspectorTest.log(`Setting breakpoint at offset ${breakpoint.loc}, condition "${breakpoint.cond}"`);
InspectorTest.logMessage(await Protocol.Debugger.setBreakpoint({
'location': {
'scriptId': wasm_script.scriptId,
'lineNumber': 0,
'columnNumber': breakpoint.loc
},
condition: breakpoint.cond
}));
}
InspectorTest.log('Calling fib(5)');
await WasmInspectorTest.evalWithUrl('instance.exports.fib(5)', 'runWasm');
InspectorTest.log('fib returned!');
}
]);