v8/test/inspector/debugger/wasm-source.js

88 lines
2.9 KiB
JavaScript
Raw Normal View History

// Copyright 2016 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: --expose-wasm
utils.load('test/inspector/wasm-inspector-test.js');
let {session, contextGroup, Protocol} = InspectorTest.start('Tests how wasm scrips report the source');
var builder = new WasmModuleBuilder();
var imported_idx = builder.addImport("xxx", "func", kSig_v_v);
var call_imported_idx = builder.addFunction("call_func", kSig_v_v)
.addBody([kExprCallFunction, imported_idx])
.index;
var sig_index = builder.addType(kSig_v_v);
builder.addFunction('main', kSig_v_v)
.addBody([
kExprBlock, kWasmVoid, kExprI32Const, 0, kExprCallIndirect, sig_index,
kTableZero, kExprEnd
])
.exportAs('main');
builder.appendToTable([call_imported_idx]);
var module_bytes = builder.toArray();
function testFunction(bytes) {
function call_debugger() {
debugger;
}
var buffer = new ArrayBuffer(bytes.length);
var view = new Uint8Array(buffer);
for (var i = 0; i < bytes.length; i++) {
view[i] = bytes[i] | 0;
}
var module = new WebAssembly.Module(buffer);
var instance = new WebAssembly.Instance(module, {xxx: {func: call_debugger}});
instance.exports.main();
}
contextGroup.addScript(testFunction.toString());
contextGroup.addScript('var module_bytes = ' + JSON.stringify(module_bytes));
Protocol.Debugger.enable();
Protocol.Debugger.onPaused(handleDebuggerPaused);
InspectorTest.log('Check that inspector gets wasm bytecode');
Protocol.Runtime.evaluate({'expression': 'testFunction(module_bytes)'});
async function handleDebuggerPaused(message) {
InspectorTest.log('Paused on debugger!');
var frames = message.params.callFrames;
InspectorTest.log('Number of frames: ' + frames.length);
async function dumpSourceLine(frameId, sourceMessage) {
if (sourceMessage.error) InspectorTest.logObject(sourceMessage);
var text = sourceMessage.result.scriptSource;
var lineNr = frames[frameId].location.lineNumber;
if (text) {
var line = text.split('\n')[lineNr];
InspectorTest.log('[' + frameId + '] ' + line);
} else {
if (lineNr != 0) {
InspectorTest.log('Unexpected line number in wasm: ' + lineNr);
}
let byteOffset = frames[frameId].location.columnNumber;
let data = InspectorTest.decodeBase64(sourceMessage.result.bytecode);
// Print a byte, which can be compared to the expected wasm opcode.
InspectorTest.log('[' + frameId + '] Wasm offset ' + byteOffset
+ ': 0x' + data[byteOffset].toString(16));
}
}
for (let frameId = 0; frameId < frames.length; frameId++) {
result = await Protocol.Debugger
.getScriptSource({scriptId: frames[frameId].location.scriptId});
await dumpSourceLine(frameId, result);
}
InspectorTest.log('Finished.');
InspectorTest.completeTest();
}