Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 1a0cda1

Browse filesBrowse files
bcoetargos
authored andcommitted
errors: support prepareSourceMap with source-maps
Adds support for Error.prepareStackTrace override, when --enable-source-maps is set. PR-URL: #31143 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
1 parent 8ab748e commit 1a0cda1
Copy full SHA for 1a0cda1

File tree

Expand file treeCollapse file tree

3 files changed

+49
-12
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

3 files changed

+49
-12
lines changed
Open diff view settings
Collapse file

‎lib/internal/errors.js‎

Copy file name to clipboardExpand all lines: lib/internal/errors.js
+21-11Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const { kMaxLength } = internalBinding('buffer');
2020
const MainContextError = Error;
2121
const ErrorToString = Error.prototype.toString;
2222
const overrideStackTrace = new WeakMap();
23+
const kNoOverride = Symbol('kNoOverride');
2324
const prepareStackTrace = (globalThis, error, trace) => {
2425
// API for node internals to override error stack formatting
2526
// without interfering with userland code.
@@ -29,6 +30,23 @@ const prepareStackTrace = (globalThis, error, trace) => {
2930
return f(error, trace);
3031
}
3132

33+
const globalOverride =
34+
maybeOverridePrepareStackTrace(globalThis, error, trace);
35+
if (globalOverride !== kNoOverride) return globalOverride;
36+
37+
// Normal error formatting:
38+
//
39+
// Error: Message
40+
// at function (file)
41+
// at file
42+
const errorString = ErrorToString.call(error);
43+
if (trace.length === 0) {
44+
return errorString;
45+
}
46+
return `${errorString}\n at ${trace.join('\n at ')}`;
47+
};
48+
49+
const maybeOverridePrepareStackTrace = (globalThis, error, trace) => {
3250
// Polyfill of V8's Error.prepareStackTrace API.
3351
// https://crbug.com/v8/7848
3452
// `globalThis` is the global that contains the constructor which
@@ -43,19 +61,9 @@ const prepareStackTrace = (globalThis, error, trace) => {
4361
return MainContextError.prepareStackTrace(error, trace);
4462
}
4563

46-
// Normal error formatting:
47-
//
48-
// Error: Message
49-
// at function (file)
50-
// at file
51-
const errorString = ErrorToString.call(error);
52-
if (trace.length === 0) {
53-
return errorString;
54-
}
55-
return `${errorString}\n at ${trace.join('\n at ')}`;
64+
return kNoOverride;
5665
};
5766

58-
5967
let excludedStackFn;
6068

6169
// Lazily loaded
@@ -683,7 +691,9 @@ module.exports = {
683691
SystemError,
684692
// This is exported only to facilitate testing.
685693
E,
694+
kNoOverride,
686695
prepareStackTrace,
696+
maybeOverridePrepareStackTrace,
687697
overrideStackTrace,
688698
kEnhanceStackBeforeInspector,
689699
fatalExceptionStackEnhancers
Collapse file

‎lib/internal/source_map/prepare_stack_trace.js‎

Copy file name to clipboardExpand all lines: lib/internal/source_map/prepare_stack_trace.js
+9-1Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
const debug = require('internal/util/debuglog').debuglog('source_map');
44
const { findSourceMap } = require('internal/source_map/source_map_cache');
5-
const { overrideStackTrace } = require('internal/errors');
5+
const {
6+
kNoOverride,
7+
overrideStackTrace,
8+
maybeOverridePrepareStackTrace
9+
} = require('internal/errors');
610

711
// Create a prettified stacktrace, inserting context from source maps
812
// if possible.
@@ -17,6 +21,10 @@ const prepareStackTrace = (globalThis, error, trace) => {
1721
return f(error, trace);
1822
}
1923

24+
const globalOverride =
25+
maybeOverridePrepareStackTrace(globalThis, error, trace);
26+
if (globalOverride !== kNoOverride) return globalOverride;
27+
2028
const { SourceMap } = require('internal/source_map/source_map');
2129
const errorString = ErrorToString.call(error);
2230

Collapse file
+19Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Flags: --enable-source-maps
2+
'use strict';
3+
4+
require('../common');
5+
const assert = require('assert');
6+
7+
// Error.prepareStackTrace() can be overridden with source maps enabled.
8+
{
9+
let prepareCalled = false;
10+
Error.prepareStackTrace = (_error, trace) => {
11+
prepareCalled = true;
12+
};
13+
try {
14+
throw new Error('foo');
15+
} catch (err) {
16+
err.stack;
17+
}
18+
assert(prepareCalled);
19+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.