You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
1.8 KiB
86 lines
1.8 KiB
/** @license MIT License (c) copyright 2010-2014 original author or authors */ |
|
/** @author Brian Cavalier */ |
|
/** @author John Hann */ |
|
|
|
(function(define) { 'use strict'; |
|
define(function() { |
|
|
|
var parse, captureStack, format; |
|
|
|
if(Error.captureStackTrace) { |
|
// Use Error.captureStackTrace if available |
|
parse = function(e) { |
|
return e && e.stack && e.stack.split('\n'); |
|
}; |
|
|
|
format = formatAsString; |
|
captureStack = Error.captureStackTrace; |
|
|
|
} else { |
|
// Otherwise, do minimal feature detection to determine |
|
// how to capture and format reasonable stacks. |
|
parse = function(e) { |
|
var stack = e && e.stack && e.stack.split('\n'); |
|
if(stack && e.message) { |
|
stack.unshift(e.message); |
|
} |
|
return stack; |
|
}; |
|
|
|
(function() { |
|
var e = new Error(); |
|
if(typeof e.stack !== 'string') { |
|
format = formatAsString; |
|
captureStack = captureSpiderMonkeyStack; |
|
} else { |
|
format = formatAsErrorWithStack; |
|
captureStack = useStackDirectly; |
|
} |
|
}()); |
|
} |
|
|
|
function captureSpiderMonkeyStack(host) { |
|
try { |
|
throw new Error(); |
|
} catch(err) { |
|
host.stack = err.stack; |
|
} |
|
} |
|
|
|
function useStackDirectly(host) { |
|
host.stack = new Error().stack; |
|
} |
|
|
|
function formatAsString(longTrace) { |
|
return join(longTrace); |
|
} |
|
|
|
function formatAsErrorWithStack(longTrace) { |
|
var e = new Error(); |
|
e.stack = formatAsString(longTrace); |
|
return e; |
|
} |
|
|
|
// About 5-10x faster than String.prototype.join o_O |
|
function join(a) { |
|
var sep = false; |
|
var s = ''; |
|
for(var i=0; i< a.length; ++i) { |
|
if(sep) { |
|
s += '\n' + a[i]; |
|
} else { |
|
s+= a[i]; |
|
sep = true; |
|
} |
|
} |
|
return s; |
|
} |
|
|
|
return { |
|
parse: parse, |
|
format: format, |
|
captureStack: captureStack |
|
}; |
|
|
|
}); |
|
}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
|
|
|