diff --git a/lib/repl.js b/lib/repl.js index 3029c94b1e1ac0..8b9cdb31c59b6b 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -45,7 +45,7 @@ const { ArrayPrototypeAt, ArrayPrototypeFilter, - ArrayPrototypeFindIndex, + ArrayPrototypeFindLastIndex, ArrayPrototypeForEach, ArrayPrototypeIncludes, ArrayPrototypeJoin, @@ -53,12 +53,10 @@ const { ArrayPrototypePop, ArrayPrototypePush, ArrayPrototypePushApply, - ArrayPrototypeReverse, ArrayPrototypeShift, ArrayPrototypeSlice, ArrayPrototypeSome, ArrayPrototypeSort, - ArrayPrototypeSplice, ArrayPrototypeUnshift, Boolean, Error, @@ -153,6 +151,7 @@ const { }, isErrorStackTraceLimitWritable, overrideStackTrace, + getInternalPrepareStackTrace, } = require('internal/errors'); const { sendInspectorCommand } = require('internal/util/inspector'); const { getOptionValue } = require('internal/options'); @@ -679,23 +678,19 @@ function REPLServer(prompt, if (typeof stackFrames === 'object') { // Search from the bottom of the call stack to // find the first frame with a null function name - const idx = ArrayPrototypeFindIndex( - ArrayPrototypeReverse(stackFrames), + const idx = ArrayPrototypeFindLastIndex( + stackFrames, (frame) => frame.getFunctionName() === null, ); // If found, get rid of it and everything below it - frames = ArrayPrototypeSplice(stackFrames, idx + 1); + frames = ArrayPrototypeSlice(stackFrames, 0, idx); } else { frames = stackFrames; } - // FIXME(devsnek): this is inconsistent with the checks - // that the real prepareStackTrace dispatch uses in - // lib/internal/errors.js. if (typeof Error.prepareStackTrace === 'function') { return Error.prepareStackTrace(error, frames); } - ArrayPrototypePush(frames, error); - return ArrayPrototypeJoin(ArrayPrototypeReverse(frames), '\n at '); + return getInternalPrepareStackTrace()(error, frames); }); decorateErrorStack(e); diff --git a/test/parallel/test-repl-pretty-custom-stack.js b/test/parallel/test-repl-pretty-custom-stack.js index a10cd032a688c4..560a7412669ec1 100644 --- a/test/parallel/test-repl-pretty-custom-stack.js +++ b/test/parallel/test-repl-pretty-custom-stack.js @@ -42,8 +42,9 @@ const origPrepareStackTrace = Error.prepareStackTrace; Error.prepareStackTrace = (err, stack) => { if (err instanceof SyntaxError) return err.toString(); - stack.push(err); - return stack.reverse().join('--->\n'); + // Insert the error at the beginning of the stack + stack.unshift(err); + return stack.join('--->\n'); }; process.on('uncaughtException', (e) => {