From ccfb12e2adde78a5e322b907b232923a043f8272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Wed, 14 Sep 2022 21:52:10 +0900 Subject: [PATCH] Avoid fancy stack traces size computation This will end up with the actual number of frames not exactly matching the user-set Error.stackTraceLimit. However, Error.stackTraceLimit is usually set to generic numbers (10, 100, 1000, Infinity), and it does not matter if it's not _really_ X but a bit less or more. (How long before we get a bug report "Hey, I use Error.stackTraceLimit=1562 but it's only giving me 1543 frames!"?) --- .../src/errors/rewrite-stack-trace.ts | 26 +++++++++---------- packages/babel-core/test/errors-stacks.js | 4 +-- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/packages/babel-core/src/errors/rewrite-stack-trace.ts b/packages/babel-core/src/errors/rewrite-stack-trace.ts index b1160782c9b3..d2dab9682b07 100644 --- a/packages/babel-core/src/errors/rewrite-stack-trace.ts +++ b/packages/babel-core/src/errors/rewrite-stack-trace.ts @@ -46,15 +46,6 @@ const ErrorToString = Function.call.bind(Error.prototype.toString); const SUPPORTED = !!Error.captureStackTrace; -// We add some extra frames to Error.stackTraceLimit, so that we can respect -// the original Error.stackTraceLimit even after removing all our internal -// frames. -// STACK_TRACE_LIMIT_DELTA should be bigger than the expected number of internal -// frames, but not too big because capturing the stack trace is slow (this is -// why Error.stackTraceLimit does not default to Infinity!). -// Increase it if needed. -const STACK_TRACE_LIMIT_DELTA = 100; - const START_HIDNG = "startHiding - secret - don't use this - v1"; const STOP_HIDNG = "stopHiding - secret - don't use this - v1"; @@ -131,7 +122,17 @@ function setupPrepareStackTrace() { const { prepareStackTrace = defaultPrepareStackTrace } = Error; - Error.stackTraceLimit += STACK_TRACE_LIMIT_DELTA; + // We add some extra frames to Error.stackTraceLimit, so that we can + // always show some useful frames even after deleting ours. + // STACK_TRACE_LIMIT_DELTA should be around the maximum expected number + // of internal frames, and not too big because capturing the stack trace + // is slow (this is why Error.stackTraceLimit does not default to Infinity!). + // Increase it if needed. + const MIN_STACK_TRACE_LIMIT = 50; + Error.stackTraceLimit = Math.max( + Error.stackTraceLimit, + MIN_STACK_TRACE_LIMIT, + ); Error.prepareStackTrace = function stackTraceRewriter(err, trace) { let newTrace = []; @@ -160,10 +161,7 @@ function setupPrepareStackTrace() { } } - return prepareStackTrace( - err, - newTrace.slice(0, Error.stackTraceLimit - STACK_TRACE_LIMIT_DELTA), - ); + return prepareStackTrace(err, newTrace); }; } diff --git a/packages/babel-core/test/errors-stacks.js b/packages/babel-core/test/errors-stacks.js index 8aff2183e688..c9490f562e32 100644 --- a/packages/babel-core/test/errors-stacks.js +++ b/packages/babel-core/test/errors-stacks.js @@ -76,12 +76,12 @@ const fixture = name => ); describe("@babel/core errors", function () { - beforeAll(() => { + /*beforeAll(() => { Error.stackTraceLimit += 100; }); afterAll(() => { Error.stackTraceLimit -= 100; - }); + });*/ it("error inside config function", function () { expectError(() => {