// 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 let {session, contextGroup, Protocol} = InspectorTest.start('Tests that asm-js scripts produce correct stack'); 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; } var fun = generateAsmJs(this, {'call_debugger': call_debugger}, undefined); fun(); } contextGroup.addScript(testFunction.toString()); Protocol.Debugger.enable(); Protocol.Debugger.oncePaused().then(handleDebuggerPaused); Protocol.Runtime.evaluate({'expression': 'testFunction()'}); 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; InspectorTest.log('Number of frames: ' + frames.length); for (var i = 0; i < frames.length; ++i) { InspectorTest.log(' - [' + i + '] ' + locationToString(frames[i])); } } function handleDebuggerPaused(messageObject) { InspectorTest.log('Paused on \'debugger;\''); logStackTrace(messageObject); InspectorTest.log('Getting v8-generated stack trace...'); var topFrameId = messageObject.params.callFrames[0].callFrameId; Protocol.Debugger .evaluateOnCallFrame({ callFrameId: topFrameId, expression: '(new Error("getting stack trace")).stack' }) .then(callbackEvaluate); } function callbackEvaluate(response) { InspectorTest.log( 'Result of evaluate (' + response.result.result.type + '):'); var result_lines = response.result.result.value.split("\n"); // Skip the second line, containing the 'evaluate' position. result_lines[1] = " -- skipped --"; InspectorTest.log(result_lines.join('\n')); InspectorTest.log('Finished!'); InspectorTest.completeTest(); }