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