1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/addon-sdk/source/lib/sdk/console/traceback.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,89 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +"use strict"; 1.9 + 1.10 +module.metadata = { 1.11 + "stability": "experimental" 1.12 +}; 1.13 + 1.14 +const { Cc, Ci, components } = require("chrome"); 1.15 +const { parseStack, sourceURI } = require("toolkit/loader"); 1.16 +const { readURISync } = require("../net/url"); 1.17 + 1.18 +exports.sourceURI = sourceURI 1.19 + 1.20 +function safeGetFileLine(path, line) { 1.21 + try { 1.22 + var scheme = require("../url").URL(path).scheme; 1.23 + // TODO: There should be an easier, more accurate way to figure out 1.24 + // what's the case here. 1.25 + if (!(scheme == "http" || scheme == "https")) 1.26 + return readURISync(path).split("\n")[line - 1]; 1.27 + } catch (e) {} 1.28 + return null; 1.29 +} 1.30 + 1.31 +function nsIStackFramesToJSON(frame) { 1.32 + var stack = []; 1.33 + 1.34 + while (frame) { 1.35 + if (frame.filename) { 1.36 + stack.unshift({ 1.37 + fileName: sourceURI(frame.filename), 1.38 + lineNumber: frame.lineNumber, 1.39 + name: frame.name 1.40 + }); 1.41 + } 1.42 + frame = frame.caller; 1.43 + } 1.44 + 1.45 + return stack; 1.46 +}; 1.47 + 1.48 +var fromException = exports.fromException = function fromException(e) { 1.49 + if (e instanceof Ci.nsIException) 1.50 + return nsIStackFramesToJSON(e.location); 1.51 + if (e.stack && e.stack.length) 1.52 + return parseStack(e.stack); 1.53 + if (e.fileName && typeof(e.lineNumber == "number")) 1.54 + return [{fileName: sourceURI(e.fileName), 1.55 + lineNumber: e.lineNumber, 1.56 + name: null}]; 1.57 + return []; 1.58 +}; 1.59 + 1.60 +var get = exports.get = function get() { 1.61 + return nsIStackFramesToJSON(components.stack.caller); 1.62 +}; 1.63 + 1.64 +var format = exports.format = function format(tbOrException) { 1.65 + if (tbOrException === undefined) { 1.66 + tbOrException = get(); 1.67 + tbOrException.pop(); 1.68 + } 1.69 + 1.70 + var tb; 1.71 + if (typeof(tbOrException) == "object" && 1.72 + tbOrException.constructor.name == "Array") 1.73 + tb = tbOrException; 1.74 + else 1.75 + tb = fromException(tbOrException); 1.76 + 1.77 + var lines = ["Traceback (most recent call last):"]; 1.78 + 1.79 + tb.forEach( 1.80 + function(frame) { 1.81 + if (!(frame.fileName || frame.lineNumber || frame.name)) 1.82 + return; 1.83 + 1.84 + lines.push(' File "' + frame.fileName + '", line ' + 1.85 + frame.lineNumber + ', in ' + frame.name); 1.86 + var sourceLine = safeGetFileLine(frame.fileName, frame.lineNumber); 1.87 + if (sourceLine) 1.88 + lines.push(' ' + sourceLine.trim()); 1.89 + }); 1.90 + 1.91 + return lines.join("\n"); 1.92 +};