| Index: test/inspector/debugger/asm-js-breakpoint-during-exec.js
|
| diff --git a/test/inspector/debugger/asm-js-breakpoint-during-exec.js b/test/inspector/debugger/asm-js-breakpoint-during-exec.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2a29dc1ea41cba2486feac77b26be142b7b1d15d
|
| --- /dev/null
|
| +++ b/test/inspector/debugger/asm-js-breakpoint-during-exec.js
|
| @@ -0,0 +1,165 @@
|
| +// 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: --validate-asm --allow-natives-syntax
|
| +
|
| +InspectorTest.log(
|
| + 'This test runs asm.js which calls back to JS. JS triggers a break, on ' +
|
| + 'pause we set breakpoints in the asm.js code.');
|
| +
|
| +function testFunction() {
|
| + function generateAsmJs(stdlib, foreign, heap) {
|
| + 'use asm';
|
| + var debugger_fun = foreign.call_debugger;
|
| + function callDebugger() {
|
| + debugger_fun();
|
| + }
|
| + function redirectFun() {
|
| + callDebugger();
|
| + }
|
| + return redirectFun;
|
| + }
|
| +
|
| + function call_debugger() {
|
| + debugger;
|
| + }
|
| +
|
| + %OptimizeFunctionOnNextCall(generateAsmJs);
|
| + var fun = generateAsmJs(this, {'call_debugger': call_debugger}, undefined);
|
| + fun();
|
| +
|
| + var finished = 'finished';
|
| + debugger;
|
| +}
|
| +
|
| +Protocol.Debugger.onPaused(handleDebuggerPaused);
|
| +Protocol.Debugger.onScriptParsed(handleScriptParsed);
|
| +
|
| +function printResultAndContinue(next, message) {
|
| + if (message.result && message.result.exceptionDetails)
|
| + InspectorTest.logMessage(message.result.exceptionDetails);
|
| + else if (message.error)
|
| + InspectorTest.logMessage(message.error);
|
| + else if (message.result && message.result.type !== undefined)
|
| + InspectorTest.logMessage(message.result);
|
| + if (next) next();
|
| +}
|
| +
|
| +InspectorTest.runTestSuite([
|
| + function enableDebugger(next) {
|
| + Protocol.Debugger.enable().then(next);
|
| + },
|
| +
|
| + function addScript(next) {
|
| + afterScriptParsedCallback = next;
|
| + InspectorTest.addScript(testFunction.toString());
|
| + },
|
| +
|
| + function runTestFunction(next) {
|
| + afterFinishedTestFunctionCallback = next;
|
| + Protocol.Runtime.evaluate({'expression': 'testFunction()'})
|
| + .then(printResultAndContinue.bind(null, null));
|
| + },
|
| +
|
| + function finished(next) {
|
| + InspectorTest.log('Finished TestSuite.');
|
| + next();
|
| + },
|
| +]);
|
| +
|
| +function locationToString(callFrame) {
|
| + var res = {functionName: callFrame.functionName};
|
| + for (var attr in callFrame.functionLocation) {
|
| + if (attr == 'scriptId') continue;
|
| + res['function_' + attr] = callFrame.functionLocation[attr];
|
| + }
|
| + for (var attr in callFrame.location) {
|
| + if (attr == 'scriptId') continue;
|
| + res[attr] = callFrame.location[attr];
|
| + }
|
| + return JSON.stringify(res);
|
| +}
|
| +
|
| +function logStackTrace(messageObject) {
|
| + var frames = messageObject.params.callFrames;
|
| + for (var i = 0; i < frames.length; ++i) {
|
| + InspectorTest.log(' - [' + i + '] ' + locationToString(frames[i]));
|
| + }
|
| +}
|
| +
|
| +var numPaused = 0;
|
| +var parsedScriptParams;
|
| +
|
| +function handleDebuggerPaused(messageObject)
|
| +{
|
| + ++numPaused;
|
| + InspectorTest.log('Paused #' + numPaused);
|
| + logStackTrace(messageObject);
|
| +
|
| + function cont() {
|
| + var topFrameId = messageObject.params.callFrames[0].callFrameId;
|
| + Protocol.Debugger
|
| + .evaluateOnCallFrame({
|
| + callFrameId: topFrameId,
|
| + expression: 'typeof finished'
|
| + })
|
| + .then(callbackEvaluate);
|
| + function callbackEvaluate(message) {
|
| + var finished = message.result && message.result.result &&
|
| + message.result.result.value === 'string';
|
| +
|
| + InspectorTest.log('Resuming...');
|
| + Protocol.Debugger.resume();
|
| +
|
| + if (finished)
|
| + afterFinishedTestFunctionCallback();
|
| + }
|
| + }
|
| +
|
| + if (numPaused > 1) {
|
| + cont();
|
| + return;
|
| + }
|
| +
|
| + InspectorTest.log('First time paused, setting breakpoints!');
|
| +
|
| + var startLine = parsedScriptParams.startLine;
|
| + var endLine = parsedScriptParams.endLine;
|
| + InspectorTest.log(
|
| + 'Flooding script with breakpoints for all lines (' + startLine + ' - ' +
|
| + endLine + ')...');
|
| + var currentLine = startLine;
|
| + function setNextBreakpoint(message) {
|
| + if (message) InspectorTest.logMessage('error: ' + message.error);
|
| + if (currentLine == endLine) {
|
| + cont();
|
| + return;
|
| + }
|
| + var thisLine = currentLine;
|
| + currentLine += 1;
|
| + InspectorTest.log('Setting breakpoint on line ' + thisLine);
|
| + Protocol.Debugger
|
| + .setBreakpoint({
|
| + 'location': {
|
| + 'scriptId': parsedScriptParams.scriptId,
|
| + 'lineNumber': thisLine
|
| + }
|
| + })
|
| + .then(setNextBreakpoint);
|
| + }
|
| + setNextBreakpoint();
|
| +}
|
| +
|
| +var numScripts = 0;
|
| +
|
| +function handleScriptParsed(messageObject)
|
| +{
|
| + var scriptId = messageObject.params.scriptId;
|
| + ++numScripts;
|
| + InspectorTest.log('Script nr ' + numScripts + ' parsed!');
|
| + if (numScripts == 1) {
|
| + parsedScriptParams = JSON.parse(JSON.stringify(messageObject.params));
|
| + afterScriptParsedCallback();
|
| + }
|
| +}
|
|
|