Skip to content

Commit 392301d

Browse files
committed
Add StackTrace.getSync() convenience method that gets stacktrace without doing async enhancing. Fixes #165.
1 parent 76cc6dc commit 392301d

9 files changed

+131
-31
lines changed

README.md

+6
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ Generate a backtrace from invocation point, then parse and enhance it.
8585
* *sourceCache: Object (String URL => String Source)* - Pre-populate source cache to avoid network requests
8686
* *offline: Boolean (default: false)* - Set to `true` to prevent all network requests
8787

88+
#### `StackTrace.getSync(/*optional*/ options)` => Array[[StackFrame](https://github.com/stacktracejs/stackframe)]
89+
Generate a backtrace from invocation point, then parse it. **HEADS UP:** This method does not use source maps or guess anonymous functions.
90+
91+
**(Optional) options: Object**
92+
* *filter: Function([StackFrame](https://github.com/stacktracejs/stackframe) => Boolean)* - Only include stack entries matching for which `filter` returns `true`
93+
8894
#### `StackTrace.fromError(error, /*optional*/ options)` => [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)(Array[[StackFrame](https://github.com/stacktracejs/stackframe)])
8995
Given an Error object, use [error-stack-parser](https://github.com/stacktracejs/error-stack-parser)
9096
to parse it and enhance location information with [stacktrace-gps](https://github.com/stacktracejs/stacktrace-gps).

dist/stacktrace-with-promises-and-json-polyfills.js

+38-9
Original file line numberDiff line numberDiff line change
@@ -2274,6 +2274,15 @@ if (!Array.prototype.forEach) {
22742274
sourceCache: {}
22752275
};
22762276

2277+
var _generateError = function StackTrace$$GenerateError() {
2278+
try {
2279+
// Error must be thrown to get stack in IE
2280+
throw new Error();
2281+
} catch (err) {
2282+
return err;
2283+
}
2284+
};
2285+
22772286
/**
22782287
* Merge 2 given Objects. If a conflict occurs the second object wins.
22792288
* Does not do deep merges.
@@ -2310,16 +2319,36 @@ if (!Array.prototype.forEach) {
23102319
* @returns {Array} of StackFrame
23112320
*/
23122321
get: function StackTrace$$get(opts) {
2313-
try {
2314-
// Error must be thrown to get stack in IE
2315-
throw new Error();
2316-
} catch (err) {
2317-
if (_isShapedLikeParsableError(err)) {
2318-
return this.fromError(err, opts);
2319-
} else {
2320-
return this.generateArtificially(opts);
2321-
}
2322+
var err = _generateError();
2323+
if (_isShapedLikeParsableError(err)) {
2324+
return this.fromError(err, opts);
2325+
} else {
2326+
return this.generateArtificially(opts);
2327+
}
2328+
},
2329+
2330+
/**
2331+
* Get a backtrace from invocation point.
2332+
* IMPORTANT: Does not handle source maps or guess function names!
2333+
*
2334+
* @param {Object} opts
2335+
* @returns {Array} of StackFrame
2336+
*/
2337+
getSync: function StackTrace$$getSync(opts) {
2338+
opts = _merge(_options, opts);
2339+
var err = _generateError();
2340+
var stackframes;
2341+
2342+
if (_isShapedLikeParsableError(err)) {
2343+
stackframes = ErrorStackParser.parse(err);
2344+
} else {
2345+
stackframes = StackGenerator.backtrace(opts);
2346+
}
2347+
2348+
if (typeof opts.filter === 'function') {
2349+
stackframes = stackframes.filter(opts.filter);
23222350
}
2351+
return stackframes;
23232352
},
23242353

23252354
/**

dist/stacktrace-with-promises-and-json-polyfills.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/stacktrace-with-promises-and-json-polyfills.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/stacktrace.concat.js

+38-9
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,15 @@
289289
sourceCache: {}
290290
};
291291

292+
var _generateError = function StackTrace$$GenerateError() {
293+
try {
294+
// Error must be thrown to get stack in IE
295+
throw new Error();
296+
} catch (err) {
297+
return err;
298+
}
299+
};
300+
292301
/**
293302
* Merge 2 given Objects. If a conflict occurs the second object wins.
294303
* Does not do deep merges.
@@ -325,16 +334,36 @@
325334
* @returns {Array} of StackFrame
326335
*/
327336
get: function StackTrace$$get(opts) {
328-
try {
329-
// Error must be thrown to get stack in IE
330-
throw new Error();
331-
} catch (err) {
332-
if (_isShapedLikeParsableError(err)) {
333-
return this.fromError(err, opts);
334-
} else {
335-
return this.generateArtificially(opts);
336-
}
337+
var err = _generateError();
338+
if (_isShapedLikeParsableError(err)) {
339+
return this.fromError(err, opts);
340+
} else {
341+
return this.generateArtificially(opts);
342+
}
343+
},
344+
345+
/**
346+
* Get a backtrace from invocation point.
347+
* IMPORTANT: Does not handle source maps or guess function names!
348+
*
349+
* @param {Object} opts
350+
* @returns {Array} of StackFrame
351+
*/
352+
getSync: function StackTrace$$getSync(opts) {
353+
opts = _merge(_options, opts);
354+
var err = _generateError();
355+
var stackframes;
356+
357+
if (_isShapedLikeParsableError(err)) {
358+
stackframes = ErrorStackParser.parse(err);
359+
} else {
360+
stackframes = StackGenerator.backtrace(opts);
361+
}
362+
363+
if (typeof opts.filter === 'function') {
364+
stackframes = stackframes.filter(opts.filter);
337365
}
366+
return stackframes;
338367
},
339368

340369
/**

dist/stacktrace.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/stacktrace.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spec/stacktrace-spec.js

+7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ describe('StackTrace', function() {
1919
});
2020
});
2121

22+
describe('#getSync', function() {
23+
it('gets stacktrace from current location', function testStackTraceGetSync() {
24+
var stackframes = StackTrace.getSync();
25+
expect(stackframes[0].functionName).toMatch(/.*testStackTraceGetSync/);
26+
});
27+
});
28+
2229
describe('#fromError', function() {
2330
beforeEach(function() {
2431
jasmine.Ajax.install();

stacktrace.js

+38-9
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@
2222
sourceCache: {}
2323
};
2424

25+
var _generateError = function StackTrace$$GenerateError() {
26+
try {
27+
// Error must be thrown to get stack in IE
28+
throw new Error();
29+
} catch (err) {
30+
return err;
31+
}
32+
};
33+
2534
/**
2635
* Merge 2 given Objects. If a conflict occurs the second object wins.
2736
* Does not do deep merges.
@@ -58,16 +67,36 @@
5867
* @returns {Array} of StackFrame
5968
*/
6069
get: function StackTrace$$get(opts) {
61-
try {
62-
// Error must be thrown to get stack in IE
63-
throw new Error();
64-
} catch (err) {
65-
if (_isShapedLikeParsableError(err)) {
66-
return this.fromError(err, opts);
67-
} else {
68-
return this.generateArtificially(opts);
69-
}
70+
var err = _generateError();
71+
if (_isShapedLikeParsableError(err)) {
72+
return this.fromError(err, opts);
73+
} else {
74+
return this.generateArtificially(opts);
75+
}
76+
},
77+
78+
/**
79+
* Get a backtrace from invocation point.
80+
* IMPORTANT: Does not handle source maps or guess function names!
81+
*
82+
* @param {Object} opts
83+
* @returns {Array} of StackFrame
84+
*/
85+
getSync: function StackTrace$$getSync(opts) {
86+
opts = _merge(_options, opts);
87+
var err = _generateError();
88+
var stackframes;
89+
90+
if (_isShapedLikeParsableError(err)) {
91+
stackframes = ErrorStackParser.parse(err);
92+
} else {
93+
stackframes = StackGenerator.backtrace(opts);
94+
}
95+
96+
if (typeof opts.filter === 'function') {
97+
stackframes = stackframes.filter(opts.filter);
7098
}
99+
return stackframes;
71100
},
72101

73102
/**

0 commit comments

Comments
 (0)