process: optimize asyncHandledRejections by using FixedQueue · nodejs/node@37d49f3
11'use strict';
2233const {
4- ArrayPrototypePush,
5- ArrayPrototypeShift,
64 Error,
75 ObjectPrototypeHasOwnProperty,
86 SafeMap,
97 SafeWeakMap,
108} = primordials;
11910+const FixedQueue = require('internal/fixed_queue');
11+1212const {
1313 tickInfo,
1414promiseRejectEvents: {
@@ -142,9 +142,9 @@ const maybeUnhandledPromises = new SafeWeakMap();
142142let pendingUnhandledRejections = new SafeMap();
143143144144/**
145- * @type {Array<{promise: Promise, warning: Error}>}
145+ * @type {import('internal/fixed_queue')<{promise: Promise, warning: Error}>}
146146 */
147-const asyncHandledRejections = [];
147+const asyncHandledRejections = new FixedQueue();
148148149149/**
150150 * @type {number}
@@ -281,7 +281,7 @@ function handledRejection(promise) {
281281if (promiseInfo.warned) {
282282// Generate the warning object early to get a good stack trace.
283283const warning = new PromiseRejectionHandledWarning(promiseInfo.uid);
284-ArrayPrototypePush(asyncHandledRejections, { promise, warning });
284+asyncHandledRejections.push({ promise, warning });
285285setHasRejectionToWarn(true);
286286}
287287}
@@ -437,10 +437,10 @@ function getUnhandledRejectionsMode() {
437437// a warning to be emitted which requires the microtask and next tick
438438// queues to be drained again.
439439function processPromiseRejections() {
440-let maybeScheduledTicksOrMicrotasks = asyncHandledRejections.length > 0;
440+let maybeScheduledTicksOrMicrotasks = !asyncHandledRejections.isEmpty();
441441442-while (asyncHandledRejections.length !== 0) {
443-const { promise, warning } = ArrayPrototypeShift(asyncHandledRejections);
442+while (!asyncHandledRejections.isEmpty()) {
443+const { promise, warning } = asyncHandledRejections.shift();
444444if (!process.emit('rejectionHandled', promise)) {
445445process.emitWarning(warning);
446446}