error.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /** @license MIT License (c) copyright 2010-2014 original author or authors */
  2. /** @author Brian Cavalier */
  3. /** @author John Hann */
  4. (function(define) { 'use strict';
  5. define(function() {
  6. var parse, captureStack, format;
  7. if(Error.captureStackTrace) {
  8. // Use Error.captureStackTrace if available
  9. parse = function(e) {
  10. return e && e.stack && e.stack.split('\n');
  11. };
  12. format = formatAsString;
  13. captureStack = Error.captureStackTrace;
  14. } else {
  15. // Otherwise, do minimal feature detection to determine
  16. // how to capture and format reasonable stacks.
  17. parse = function(e) {
  18. var stack = e && e.stack && e.stack.split('\n');
  19. if(stack && e.message) {
  20. stack.unshift(e.message);
  21. }
  22. return stack;
  23. };
  24. (function() {
  25. var e = new Error();
  26. if(typeof e.stack !== 'string') {
  27. format = formatAsString;
  28. captureStack = captureSpiderMonkeyStack;
  29. } else {
  30. format = formatAsErrorWithStack;
  31. captureStack = useStackDirectly;
  32. }
  33. }());
  34. }
  35. function captureSpiderMonkeyStack(host) {
  36. try {
  37. throw new Error();
  38. } catch(err) {
  39. host.stack = err.stack;
  40. }
  41. }
  42. function useStackDirectly(host) {
  43. host.stack = new Error().stack;
  44. }
  45. function formatAsString(longTrace) {
  46. return join(longTrace);
  47. }
  48. function formatAsErrorWithStack(longTrace) {
  49. var e = new Error();
  50. e.stack = formatAsString(longTrace);
  51. return e;
  52. }
  53. // About 5-10x faster than String.prototype.join o_O
  54. function join(a) {
  55. var sep = false;
  56. var s = '';
  57. for(var i=0; i< a.length; ++i) {
  58. if(sep) {
  59. s += '\n' + a[i];
  60. } else {
  61. s+= a[i];
  62. sep = true;
  63. }
  64. }
  65. return s;
  66. }
  67. return {
  68. parse: parse,
  69. format: format,
  70. captureStack: captureStack
  71. };
  72. });
  73. }(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));