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

82 lines
2.6 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
let {session, contextGroup, Protocol} = InspectorTest.start('Tests how wasm scrips report the source');
utils.load('test/mjsunit/wasm/wasm-constants.js');
utils.load('test/mjsunit/wasm/wasm-module-builder.js');
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, kWasmStmt, 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 disassembled wasm code');
Protocol.Runtime.evaluate({'expression': 'testFunction(module_bytes)'});
function handleDebuggerPaused(message) {
InspectorTest.log('Paused on debugger!');
var frames = message.params.callFrames;
InspectorTest.log('Number of frames: ' + frames.length);
function dumpSourceLine(frameId, sourceMessage) {
if (sourceMessage.error) InspectorTest.logObject(sourceMessage);
var text = sourceMessage.result.scriptSource;
var lineNr = frames[frameId].location.lineNumber;
var line = text.split('\n')[lineNr];
InspectorTest.log('[' + frameId + '] ' + line);
}
function next(frameId) {
if (frameId == frames.length) return Promise.resolve();
return Protocol.Debugger
.getScriptSource({scriptId: frames[frameId].location.scriptId})
.then(dumpSourceLine.bind(null, frameId))
.then(() => next(frameId + 1));
}
function finished() {
InspectorTest.log('Finished.');
InspectorTest.completeTest();
}
next(0).then(finished);
}