From c1d94e51db688a58e917a2a5a41058c0806666e2 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 1/2] 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 | 7 ----- 2 files changed, 12 insertions(+), 21 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..76e8f94f4910 100644 --- a/packages/babel-core/test/errors-stacks.js +++ b/packages/babel-core/test/errors-stacks.js @@ -76,13 +76,6 @@ const fixture = name => ); describe("@babel/core errors", function () { - beforeAll(() => { - Error.stackTraceLimit += 100; - }); - afterAll(() => { - Error.stackTraceLimit -= 100; - }); - it("error inside config function", function () { expectError(() => { babel.parseSync("foo;", { From 3c40231aa95e99e2c5e98bd097b651284f412e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Wed, 14 Sep 2022 23:20:49 +0900 Subject: [PATCH 2/2] Don't modify 0 --- packages/babel-core/src/errors/rewrite-stack-trace.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/babel-core/src/errors/rewrite-stack-trace.ts b/packages/babel-core/src/errors/rewrite-stack-trace.ts index d2dab9682b07..93fb66e38d1b 100644 --- a/packages/babel-core/src/errors/rewrite-stack-trace.ts +++ b/packages/babel-core/src/errors/rewrite-stack-trace.ts @@ -128,8 +128,9 @@ function setupPrepareStackTrace() { // 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. + // However, we only do it if the user did not explicitly set it to 0. const MIN_STACK_TRACE_LIMIT = 50; - Error.stackTraceLimit = Math.max( + Error.stackTraceLimit &&= Math.max( Error.stackTraceLimit, MIN_STACK_TRACE_LIMIT, );