// 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); }