Skip to content

Commit 1057a4c

Browse files
bcoeBridgeAR
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 <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Anna Henningsen <[email protected]>
1 parent 697908e commit 1057a4c

File tree

3 files changed

+49
-12
lines changed

3 files changed

+49
-12
lines changed

lib/internal/errors.js

+21-11
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ const { kMaxLength } = internalBinding('buffer');
4343
const MainContextError = Error;
4444
const ErrorToString = Error.prototype.toString;
4545
const overrideStackTrace = new WeakMap();
46+
const kNoOverride = Symbol('kNoOverride');
4647
const prepareStackTrace = (globalThis, error, trace) => {
4748
// API for node internals to override error stack formatting
4849
// without interfering with userland code.
@@ -52,6 +53,23 @@ const prepareStackTrace = (globalThis, error, trace) => {
5253
return f(error, trace);
5354
}
5455

56+
const globalOverride =
57+
maybeOverridePrepareStackTrace(globalThis, error, trace);
58+
if (globalOverride !== kNoOverride) return globalOverride;
59+
60+
// Normal error formatting:
61+
//
62+
// Error: Message
63+
// at function (file)
64+
// at file
65+
const errorString = ErrorToString.call(error);
66+
if (trace.length === 0) {
67+
return errorString;
68+
}
69+
return `${errorString}\n at ${trace.join('\n at ')}`;
70+
};
71+
72+
const maybeOverridePrepareStackTrace = (globalThis, error, trace) => {
5573
// Polyfill of V8's Error.prepareStackTrace API.
5674
// https://crbug.com/v8/7848
5775
// `globalThis` is the global that contains the constructor which
@@ -66,19 +84,9 @@ const prepareStackTrace = (globalThis, error, trace) => {
6684
return MainContextError.prepareStackTrace(error, trace);
6785
}
6886

69-
// Normal error formatting:
70-
//
71-
// Error: Message
72-
// at function (file)
73-
// at file
74-
const errorString = ErrorToString.call(error);
75-
if (trace.length === 0) {
76-
return errorString;
77-
}
78-
return `${errorString}\n at ${trace.join('\n at ')}`;
87+
return kNoOverride;
7988
};
8089

81-
8290
let excludedStackFn;
8391

8492
// Lazily loaded
@@ -691,7 +699,9 @@ module.exports = {
691699
SystemError,
692700
// This is exported only to facilitate testing.
693701
E,
702+
kNoOverride,
694703
prepareStackTrace,
704+
maybeOverridePrepareStackTrace,
695705
overrideStackTrace,
696706
kEnhanceStackBeforeInspector,
697707
fatalExceptionStackEnhancers

lib/internal/source_map/prepare_stack_trace.js

+9-1
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

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)