diff --git a/lib/internal/source_map/prepare_stack_trace.js b/lib/internal/source_map/prepare_stack_trace.js index d6c5fce60a29e3..e5df8951e15e1a 100644 --- a/lib/internal/source_map/prepare_stack_trace.js +++ b/lib/internal/source_map/prepare_stack_trace.js @@ -17,6 +17,12 @@ const prepareStackTrace = (globalThis, error, trace) => { return f(error, trace); } + // `globalThis` is the global that contains the constructor which + // created `error`. + if (typeof globalThis.Error.prepareStackTrace === 'function') { + return globalThis.Error.prepareStackTrace(error, trace); + } + const { SourceMap } = require('internal/source_map/source_map'); const errorString = ErrorToString.call(error); diff --git a/test/parallel/test-error-prepare-stack-trace.js b/test/parallel/test-error-prepare-stack-trace.js new file mode 100644 index 00000000000000..2ace9c8d71491d --- /dev/null +++ b/test/parallel/test-error-prepare-stack-trace.js @@ -0,0 +1,19 @@ +// Flags: --enable-source-maps +'use strict'; + +require('../common'); +const assert = require('assert'); + +// Error.prepareStackTrace() can be overridden with source maps enabled. +{ + let prepareCalled = false; + Error.prepareStackTrace = (_error, trace) => { + prepareCalled = true; + }; + try { + throw new Error('foo'); + } catch (err) { + err.stack; + } + assert(prepareCalled); +}