1 | (function(root, factory) {
|
---|
2 | 'use strict';
|
---|
3 | // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.
|
---|
4 |
|
---|
5 | /* istanbul ignore next */
|
---|
6 | if (typeof define === 'function' && define.amd) {
|
---|
7 | define('stack-generator', ['stackframe'], factory);
|
---|
8 | } else if (typeof exports === 'object') {
|
---|
9 | module.exports = factory(require('stackframe'));
|
---|
10 | } else {
|
---|
11 | root.StackGenerator = factory(root.StackFrame);
|
---|
12 | }
|
---|
13 | }(this, function(StackFrame) {
|
---|
14 | return {
|
---|
15 | backtrace: function StackGenerator$$backtrace(opts) {
|
---|
16 | var stack = [];
|
---|
17 | var maxStackSize = 10;
|
---|
18 |
|
---|
19 | if (typeof opts === 'object' && typeof opts.maxStackSize === 'number') {
|
---|
20 | maxStackSize = opts.maxStackSize;
|
---|
21 | }
|
---|
22 |
|
---|
23 | var curr = arguments.callee;
|
---|
24 | while (curr && stack.length < maxStackSize && curr['arguments']) {
|
---|
25 | // Allow V8 optimizations
|
---|
26 | var args = new Array(curr['arguments'].length);
|
---|
27 | for (var i = 0; i < args.length; ++i) {
|
---|
28 | args[i] = curr['arguments'][i];
|
---|
29 | }
|
---|
30 | if (/function(?:\s+([\w$]+))+\s*\(/.test(curr.toString())) {
|
---|
31 | stack.push(new StackFrame({functionName: RegExp.$1 || undefined, args: args}));
|
---|
32 | } else {
|
---|
33 | stack.push(new StackFrame({args: args}));
|
---|
34 | }
|
---|
35 |
|
---|
36 | try {
|
---|
37 | curr = curr.caller;
|
---|
38 | } catch (e) {
|
---|
39 | break;
|
---|
40 | }
|
---|
41 | }
|
---|
42 | return stack;
|
---|
43 | }
|
---|
44 | };
|
---|
45 | }));
|
---|