| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 | exports.get = function(belowFn) {  var oldLimit = Error.stackTraceLimit;  Error.stackTraceLimit = Infinity;  var dummyObject = {};  var v8Handler = Error.prepareStackTrace;  Error.prepareStackTrace = function(dummyObject, v8StackTrace) {    return v8StackTrace;  };  Error.captureStackTrace(dummyObject, belowFn || exports.get);  var v8StackTrace = dummyObject.stack;  Error.prepareStackTrace = v8Handler;  Error.stackTraceLimit = oldLimit;  return v8StackTrace;};exports.parse = function(err) {  if (!err.stack) {    return [];  }  var self = this;  var lines = err.stack.split('\n').slice(1);  return lines    .map(function(line) {      if (line.match(/^\s*[-]{4,}$/)) {        return self._createParsedCallSite({          fileName: line,          lineNumber: null,          functionName: null,          typeName: null,          methodName: null,          columnNumber: null,          'native': null,        });      }      var lineMatch = line.match(/at (?:(.+)\s+\()?(?:(.+?):(\d+)(?::(\d+))?|([^)]+))\)?/);      if (!lineMatch) {        return;      }      var object = null;      var method = null;      var functionName = null;      var typeName = null;      var methodName = null;      var isNative = (lineMatch[5] === 'native');      if (lineMatch[1]) {        functionName = lineMatch[1];        var methodStart = functionName.lastIndexOf('.');        if (functionName[methodStart-1] == '.')          methodStart--;        if (methodStart > 0) {          object = functionName.substr(0, methodStart);          method = functionName.substr(methodStart + 1);          var objectEnd = object.indexOf('.Module');          if (objectEnd > 0) {            functionName = functionName.substr(objectEnd + 1);            object = object.substr(0, objectEnd);          }        }        typeName = null;      }      if (method) {        typeName = object;        methodName = method;      }      if (method === '<anonymous>') {        methodName = null;        functionName = null;      }      var properties = {        fileName: lineMatch[2] || null,        lineNumber: parseInt(lineMatch[3], 10) || null,        functionName: functionName,        typeName: typeName,        methodName: methodName,        columnNumber: parseInt(lineMatch[4], 10) || null,        'native': isNative,      };      return self._createParsedCallSite(properties);    })    .filter(function(callSite) {      return !!callSite;    });};function CallSite(properties) {  for (var property in properties) {    this[property] = properties[property];  }}var strProperties = [  'this',  'typeName',  'functionName',  'methodName',  'fileName',  'lineNumber',  'columnNumber',  'function',  'evalOrigin'];var boolProperties = [  'topLevel',  'eval',  'native',  'constructor'];strProperties.forEach(function (property) {  CallSite.prototype[property] = null;  CallSite.prototype['get' + property[0].toUpperCase() + property.substr(1)] = function () {    return this[property];  }});boolProperties.forEach(function (property) {  CallSite.prototype[property] = false;  CallSite.prototype['is' + property[0].toUpperCase() + property.substr(1)] = function () {    return this[property];  }});exports._createParsedCallSite = function(properties) {  return new CallSite(properties);};
 |