| // Copyright 2019 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'); |
| |
| let {session, contextGroup, Protocol} = InspectorTest.start('Tests stepping to javascript from wasm'); |
| session.setupScriptMap(); |
| |
| let builder = new WasmModuleBuilder(); |
| |
| // wasm_A |
| let func = builder.addFunction('wasm_A', kSig_v_v) |
| .addBody([ |
| // clang-format off |
| kExprNop, // Line 1 |
| // clang-format on |
| ]) |
| .exportAs('main'); |
| |
| let module_bytes = builder.toArray(); |
| |
| Protocol.Debugger.onPaused(async message => { |
| InspectorTest.log("paused"); |
| var frames = message.params.callFrames; |
| await session.logSourceLocation(frames[0].location); |
| let action = step_actions.shift() || 'resume'; |
| InspectorTest.log('Debugger.' + action) |
| await Protocol.Debugger[action](); |
| }) |
| |
| let step_actions = [ |
| // start of run 1 |
| 'resume', // move to breakpoint |
| // then get back to Javascript. |
| 'stepOut', |
| 'resume', |
| // end of run 1 |
| |
| // start of run 2 |
| 'resume', // move to breakpoint |
| // then get back to Javascript. |
| 'stepOver', |
| 'resume', |
| // end of run 2 |
| |
| // start of run 3 |
| 'resume', // move to breakpoint |
| // then get back to Javascript. |
| 'stepInto', |
| 'resume', |
| // end of run 3 |
| ]; |
| |
| contextGroup.addScript(` |
| function test() { |
| debugger; |
| instance.exports.main(); |
| var x = 1; |
| x++; |
| } |
| //# sourceURL=test.js`); |
| |
| (async function Test() { |
| await Protocol.Debugger.enable(); |
| InspectorTest.log('Calling instantiate function.'); |
| WasmInspectorTest.instantiate(module_bytes); |
| const scriptId = await waitForWasmScript(); |
| InspectorTest.log( |
| 'Setting breakpoint at start of wasm function'); |
| let msg = await Protocol.Debugger.setBreakpoint( |
| {'location': {'scriptId': scriptId, 'lineNumber': 0, 'columnNumber': func.body_offset}}); |
| printFailure(msg); |
| InspectorTest.logMessage(msg.result.actualLocation); |
| |
| for (var i=1; i<=3; i++) { |
| InspectorTest.log('Start run '+ i); |
| await Protocol.Runtime.evaluate({ expression: 'test()' }); |
| InspectorTest.log('exports.main returned!'); |
| InspectorTest.log('Finished run '+ i +'!\n'); |
| } |
| InspectorTest.completeTest(); |
| })(); |
| |
| function printFailure(message) { |
| if (!message.result) { |
| InspectorTest.logMessage(message); |
| } |
| return message; |
| } |
| |
| async function waitForWasmScript() { |
| InspectorTest.log('Waiting for wasm scripts to be parsed.'); |
| while (true) { |
| let msg = await Protocol.Debugger.onceScriptParsed(); |
| let url = msg.params.url; |
| if (!url.startsWith('wasm://')) { |
| InspectorTest.log('Ignoring script with url ' + url); |
| continue; |
| } |
| let scriptId = msg.params.scriptId; |
| InspectorTest.log('Got wasm script: ' + url); |
| return scriptId; |
| } |
| } |