CallFramesProvider.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. var async = require('async'),
  2. convert = require('./convert.js');
  3. var SCOPE_ID_MATCHER = /^scope:(\d+):(\d+)$/;
  4. /**
  5. * @param {Object} config
  6. * @param {DebuggerClient} debuggerClient
  7. */
  8. function CallFramesProvider(config, debuggerClient) {
  9. this._config = config;
  10. this._debuggerClient = debuggerClient;
  11. }
  12. CallFramesProvider.prototype = {
  13. fetchCallFrames: function(handleResponse) {
  14. this._debuggerClient.request(
  15. 'backtrace',
  16. {
  17. inlineRefs: true,
  18. fromFrame: 0,
  19. toFrame: this._config.stackTraceLimit
  20. },
  21. function(err, responseBody, responseRefs) {
  22. if (err) {
  23. handleResponse(err);
  24. return;
  25. }
  26. this._convertBacktraceToCallFrames(responseBody, responseRefs, handleResponse);
  27. }.bind(this));
  28. },
  29. _convertBacktraceToCallFrames: function(backtraceResponseBody, backtrackResponseRefs, handleResponse) {
  30. var debuggerFrames = backtraceResponseBody.frames || [];
  31. async.map(
  32. debuggerFrames,
  33. this._convertDebuggerFrameToInspectorFrame.bind(this, backtrackResponseRefs),
  34. handleResponse);
  35. },
  36. _convertDebuggerFrameToInspectorFrame: function(backtrackResponseRefs, frame, done) {
  37. var scopeChain = frame.scopes.map(function(scope) {
  38. return {
  39. object: {
  40. type: 'object',
  41. objectId: 'scope:' + frame.index + ':' + scope.index,
  42. className: 'Object',
  43. description: 'Object'
  44. },
  45. type: convert.v8ScopeTypeToString(scope.type)
  46. };
  47. });
  48. done(null, {
  49. callFrameId: frame.index.toString(),
  50. functionName: frame.func.inferredName || frame.func.name,
  51. location: {
  52. scriptId: convert.v8ScriptIdToInspectorId(frame.func.scriptId),
  53. lineNumber: frame.line,
  54. columnNumber: frame.column
  55. },
  56. scopeChain: scopeChain,
  57. this: convert.v8RefToInspectorObject(frame.receiver)
  58. });
  59. },
  60. isScopeId: function(objectId) {
  61. return SCOPE_ID_MATCHER.test(objectId);
  62. },
  63. resolveScopeId: function(objectId, callback) {
  64. var scopeIdMatch = SCOPE_ID_MATCHER.exec(objectId);
  65. if (!scopeIdMatch) throw new Error('Invalid scope id "' + objectId + '"');
  66. this._debuggerClient.request(
  67. 'scope',
  68. {
  69. number: Number(scopeIdMatch[2]),
  70. frameNumber: Number(scopeIdMatch[1])
  71. },
  72. function(err, result) {
  73. if (err)
  74. callback(err);
  75. else
  76. callback(null, result.object.ref);
  77. });
  78. }
  79. };
  80. exports.CallFramesProvider = CallFramesProvider;