Commit 4b8a9823fc0 for nodejs

commit 4b8a9823fc05b21d55f87461e63f77bf1d48777e
Author: Antoine du Hamel <duhamelantoine1995@gmail.com>
Date:   Wed Nov 4 00:07:30 2026 +0100

    Revert "benchmark: add URLSearchParams iterator consumers benchmark"

    This reverts commit b2913b4b7e3a11e899a1b5b248c02069f39d4029.

    PR-URL: https://github.com/nodejs/node/pull/66837
    Reviewed-By: Jordan Harband <ljharb@gmail.com>
    Reviewed-By: LiviaMedeiros <livia@cirno.name>

diff --git a/benchmark/url/url-searchparams-iterator-consumers.js b/benchmark/url/url-searchparams-iterator-consumers.js
deleted file mode 100644
index 62fff749959..00000000000
--- a/benchmark/url/url-searchparams-iterator-consumers.js
+++ /dev/null
@@ -1,53 +0,0 @@
-'use strict';
-const common = require('../common.js');
-const assert = require('assert');
-
-// Consumes a URLSearchParams iterator with builtins that have fast paths for
-// iterator result objects (Array.from, Map constructor, Object.fromEntries),
-// plus for-of for comparison.
-const bench = common.createBenchmark(main, {
-  method: ['Array.from', 'Map', 'Object.fromEntries', 'for-of'],
-  n: [1e6],
-});
-
-const str = 'one=single&two=first&three=first&two=2nd&three=2nd&three=3rd';
-
-function main({ method, n }) {
-  const params = new URLSearchParams(str);
-  let noDead;
-
-  switch (method) {
-    case 'Array.from':
-      bench.start();
-      for (let i = 0; i < n; i += 1)
-        noDead = Array.from(params);
-      bench.end(n);
-      assert.strictEqual(noDead.length, 6);
-      break;
-    case 'Map':
-      bench.start();
-      for (let i = 0; i < n; i += 1)
-        noDead = new Map(params);
-      bench.end(n);
-      assert.strictEqual(noDead.size, 3);
-      break;
-    case 'Object.fromEntries':
-      bench.start();
-      for (let i = 0; i < n; i += 1)
-        noDead = Object.fromEntries(params);
-      bench.end(n);
-      assert.strictEqual(noDead.three, '3rd');
-      break;
-    case 'for-of':
-      bench.start();
-      for (let i = 0; i < n; i += 1) {
-        for (const pair of params)
-          noDead = pair;
-      }
-      bench.end(n);
-      assert.strictEqual(noDead[1], '3rd');
-      break;
-    default:
-      throw new Error(`Unknown method ${method}`);
-  }
-}
diff --git a/lib/eslint.config_partial.mjs b/lib/eslint.config_partial.mjs
index fcd4dd4aa78..9240b00ac70 100644
--- a/lib/eslint.config_partial.mjs
+++ b/lib/eslint.config_partial.mjs
@@ -435,7 +435,7 @@ export default [
       'node-core/alphabetize-errors': 'error',
       'node-core/alphabetize-primordials': 'error',
       'node-core/avoid-prototype-pollution': 'error',
-      'node-core/iterator-result-value-first': 'error',
+      'node-core/iterator-result-done-first': 'error',
       'node-core/lowercase-name-for-primitive': 'error',
       'node-core/non-ascii-character': 'error',
       'node-core/no-array-destructuring': 'error',
diff --git a/lib/events.js b/lib/events.js
index 3b6805d8998..4866073de81 100644
--- a/lib/events.js
+++ b/lib/events.js
@@ -1043,7 +1043,7 @@ async function once(emitter, name, options = kEmptyObject) {
 }

 function createIterResult(value, done) {
-  return { value, done };
+  return { done, value };
 }

 function eventTargetAgnosticRemoveListener(emitter, name, listener, flags) {
diff --git a/lib/internal/fs/promises.js b/lib/internal/fs/promises.js
index f2640ab7d2a..47574a5a471 100644
--- a/lib/internal/fs/promises.js
+++ b/lib/internal/fs/promises.js
@@ -672,7 +672,7 @@ if (getOptionValue('--experimental-stream-iter')) {
           __proto__: null,
           next() {
             if (done) {
-              return { value: undefined, done: true };
+              return { done: true, value: undefined };
             }
             if (!started) {
               // Lock lazily, on the first read, so that an iterable that is
@@ -684,7 +684,7 @@ if (getOptionValue('--experimental-stream-iter')) {
             if (remaining === 0) {
               done = true;
               cleanup();
-              return { value: undefined, done: true };
+              return { done: true, value: undefined };
             }
             const toRead = remaining > 0 ?
               MathMin(readSize, remaining) : readSize;
@@ -700,20 +700,20 @@ if (getOptionValue('--experimental-stream-iter')) {
             if (bytesRead === 0) {
               done = true;
               cleanup();
-              return { value: undefined, done: true };
+              return { done: true, value: undefined };
             }
             if (pos >= 0) pos += bytesRead;
             if (remaining > 0) remaining -= bytesRead;
             const chunk = bytesRead < toRead ?
               buf.subarray(0, bytesRead) : buf;
-            return { value: [chunk], done: false };
+            return { done: false, value: [chunk] };
           },
           return() {
             if (!done) {
               done = true;
               if (started) cleanup();
             }
-            return { value: undefined, done: true };
+            return { done: true, value: undefined };
           },
         };
       },
diff --git a/lib/internal/source_map/source_map_cache_map.js b/lib/internal/source_map/source_map_cache_map.js
index 5c144818ca7..10561acffc4 100644
--- a/lib/internal/source_map/source_map_cache_map.js
+++ b/lib/internal/source_map/source_map_cache_map.js
@@ -104,7 +104,7 @@ class SourceMapCacheMap {
       const moduleInstance = weakRef.deref();
       if (moduleInstance == null) return next();
       const value = moduleInstance[source_map_data_private_symbol];
-      return { value: [key, value], done: false };
+      return { done: false, value: [key, value] };
     };

     return {
diff --git a/lib/internal/streams/readable.js b/lib/internal/streams/readable.js
index 9bd7ea63691..e584757dd9a 100644
--- a/lib/internal/streams/readable.js
+++ b/lib/internal/streams/readable.js
@@ -1656,7 +1656,7 @@ function createAsyncIterator(stream, options) {
   function onChunkFulfilled(value) {
     inFlight = false;
     if (queue !== null) drain();
-    return { value, done: false };
+    return { done: false, value };
   }

   function onChunkRejected(err) {
@@ -1679,7 +1679,7 @@ function createAsyncIterator(stream, options) {
       if (typeof then === 'function') {
         FunctionPrototypeCall(then, chunk, (value) => {
           inFlight = false;
-          resolve({ value, done: false });
+          resolve({ done: false, value });
           if (queue !== null) drain();
         }, (err) => {
           inFlight = false;
@@ -1689,7 +1689,7 @@ function createAsyncIterator(stream, options) {
         return;
       }
       inFlight = false;
-      resolve({ value: chunk, done: false });
+      resolve({ done: false, value: chunk });
       if (queue !== null) drain();
     } else if (error) {
       inFlight = false;
@@ -1698,7 +1698,7 @@ function createAsyncIterator(stream, options) {
     } else if (error === null) {
       inFlight = false;
       finalize();
-      resolve({ value: undefined, done: true });
+      resolve({ done: true, value: undefined });
       if (queue !== null) drain();
     } else {
       // No data buffered yet; wait for 'readable' or end-of-stream and
@@ -1709,7 +1709,7 @@ function createAsyncIterator(stream, options) {

   function processNext(resolve, reject) {
     if (completed) {
-      resolve({ value: undefined, done: true });
+      resolve({ done: true, value: undefined });
       return;
     }
     if (!started) start();
@@ -1726,7 +1726,7 @@ function createAsyncIterator(stream, options) {
         completed = true;
       }
     }
-    resolve({ value, done: true });
+    resolve({ done: true, value });
   }

   function processThrow(err, reject) {
@@ -1755,7 +1755,7 @@ function createAsyncIterator(stream, options) {
             return FunctionPrototypeCall(
               then, chunk, onChunkFulfilled, onChunkRejected);
           }
-          return PromiseResolve({ value: chunk, done: false });
+          return PromiseResolve({ done: false, value: chunk });
         }
         if (error) {
           finalize();
@@ -1763,7 +1763,7 @@ function createAsyncIterator(stream, options) {
         }
         if (error === null) {
           finalize();
-          return PromiseResolve({ value: undefined, done: true });
+          return PromiseResolve({ done: true, value: undefined });
         }
         // No data buffered yet; wait for 'readable' or end-of-stream.
         inFlight = true;
@@ -1776,7 +1776,7 @@ function createAsyncIterator(stream, options) {
           queue ??= new FixedQueue();
           queue.push({ __proto__: null, type: 'next', value: undefined, resolve, reject });
         } else {
-          resolve({ value: undefined, done: true });
+          resolve({ done: true, value: undefined });
         }
       });
     },
diff --git a/lib/internal/url.js b/lib/internal/url.js
index 456afd2242d..8c04ac70c07 100644
--- a/lib/internal/url.js
+++ b/lib/internal/url.js
@@ -278,8 +278,8 @@ class URLSearchParamsIterator {
     const len = values.length;
     if (index >= len) {
       return {
-        value: undefined,
         done: true,
+        value: undefined,
       };
     }

@@ -297,8 +297,8 @@ class URLSearchParamsIterator {
     }

     return {
-      value: result,
       done: false,
+      value: result,
     };
   }

diff --git a/lib/internal/vfs/watcher.js b/lib/internal/vfs/watcher.js
index ee7cd9e5b0c..f6035abfd8b 100644
--- a/lib/internal/vfs/watcher.js
+++ b/lib/internal/vfs/watcher.js
@@ -602,7 +602,7 @@ class VFSWatchAsyncIterable {
       const event = { eventType, filename };
       if (this.#pendingResolvers.length > 0) {
         const { resolve } = this.#pendingResolvers.shift();
-        resolve({ value: event, done: false });
+        resolve({ done: false, value: event });
       } else if (this.#pendingEvents.length < kMaxPendingEvents) {
         ArrayPrototypePush(this.#pendingEvents, event);
       }
@@ -614,7 +614,7 @@ class VFSWatchAsyncIterable {
       // Resolve any pending iterators
       while (this.#pendingResolvers.length > 0) {
         const { resolve } = this.#pendingResolvers.shift();
-        resolve({ value: undefined, done: true });
+        resolve({ done: true, value: undefined });
       }
     });

@@ -664,12 +664,12 @@ class VFSWatchAsyncIterable {
     }

     if (this.#closed) {
-      return PromiseResolve({ value: undefined, done: true });
+      return PromiseResolve({ done: true, value: undefined });
     }

     if (this.#pendingEvents.length > 0) {
       const event = this.#pendingEvents.shift();
-      return PromiseResolve({ value: event, done: false });
+      return PromiseResolve({ done: false, value: event });
     }

     return new Promise((resolve, reject) => {
@@ -683,7 +683,7 @@ class VFSWatchAsyncIterable {
    */
   return() {
     this.#watcher.close();
-    return PromiseResolve({ value: undefined, done: true });
+    return PromiseResolve({ done: true, value: undefined });
   }

   /**
@@ -693,7 +693,7 @@ class VFSWatchAsyncIterable {
    */
   throw(error) {
     this.#watcher.close();
-    return PromiseResolve({ value: undefined, done: true });
+    return PromiseResolve({ done: true, value: undefined });
   }
 }

diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js
index 9ff4670e93b..1ed0a95c524 100644
--- a/lib/internal/webstreams/readablestream.js
+++ b/lib/internal/webstreams/readablestream.js
@@ -712,14 +712,14 @@ class ReadableStreamAsyncIteratorReadRequest {

   [kChunk](chunk) {
     this.current = undefined;
-    this.promise.resolve({ value: chunk, done: false });
+    this.promise.resolve({ done: false, value: chunk });
   }

   [kClose]() {
     this.current = undefined;
     this.done = true;
     readableStreamReaderGenericRelease(this.reader);
-    this.promise.resolve({ value: undefined, done: true });
+    this.promise.resolve({ done: true, value: undefined });
   }

   [kError](error) {
@@ -735,7 +735,7 @@ class ReadableStreamAsyncIteratorReadRequest {
 // promise allocations.
 function readableStreamAsyncIteratorNextSteps(state) {
   if (state.done)
-    return PromiseResolve({ value: undefined, done: true });
+    return PromiseResolve({ done: true, value: undefined });

   const reader = state.reader;
   if (reader[kState].stream === undefined) {
@@ -753,7 +753,7 @@ function readableStreamAsyncIteratorNextSteps(state) {
 // Not an async function either: the cancel path settles one microtask
 // after the cancel promise, exactly as `await` would.
 function readableStreamAsyncIteratorReturnSteps(state, value) {
-  const iterResult = { value, done: true };
+  const iterResult = { done: true, value };
   if (state.done)
     return PromiseResolve(iterResult);
   state.done = true;
@@ -841,16 +841,16 @@ class ReadableStreamAsyncIterator {
             readableStreamDefaultControllerPull(controller);
           }

-          return PromiseResolve({ value: chunk, done: false });
+          return PromiseResolve({ done: false, value: chunk });
         }
       } else if (controller[kState].queueTotalSize > 0) {
         // Byte controller with buffered data: same shape as above via
         // the queue-filled arm of the byte controller's pull steps.
         stream[kState].disturbed = true;
         return PromiseResolve({
-          value: readableByteStreamControllerDequeueChunk(controller),
-
           done: false,
+
+          value: readableByteStreamControllerDequeueChunk(controller),
         });
       }
     }
@@ -891,11 +891,11 @@ class DefaultReadRequest {
   }

   [kChunk](value) {
-    this[kState].resolve({ value, done: false });
+    this[kState].resolve({ done: false, value });
   }

   [kClose]() {
-    this[kState].resolve({ value: undefined, done: true });
+    this[kState].resolve({ done: true, value: undefined });
   }

   [kError](error) {
@@ -936,11 +936,11 @@ class ReadIntoRequest {
   }

   [kChunk](value) {
-    this[kState].resolve({ value, done: false });
+    this[kState].resolve({ done: false, value });
   }

   [kClose](value) {
-    this[kState].resolve({ value, done: true });
+    this[kState].resolve({ done: true, value });
   }

   [kError](error) {
@@ -1009,7 +1009,7 @@ class ReadableStreamDefaultReader {
             readableStreamDefaultControllerPull(controller);
           }

-          return PromiseResolve({ value: chunk, done: false });
+          return PromiseResolve({ done: false, value: chunk });
         }
       } else if (controller[kState].queueTotalSize > 0) {
         // Byte controller with buffered data: mirror the queue-filled arm
@@ -1017,9 +1017,9 @@ class ReadableStreamDefaultReader {
         // the read request.
         stream[kState].disturbed = true;
         return PromiseResolve({
-          value: readableByteStreamControllerDequeueChunk(controller),
-
           done: false,
+
+          value: readableByteStreamControllerDequeueChunk(controller),
         });
       }
     }
diff --git a/test/parallel/test-eslint-iterator-result-done-first.js b/test/parallel/test-eslint-iterator-result-done-first.js
new file mode 100644
index 00000000000..f65f6bd72eb
--- /dev/null
+++ b/test/parallel/test-eslint-iterator-result-done-first.js
@@ -0,0 +1,60 @@
+'use strict';
+
+const common = require('../common');
+if ((!common.hasCrypto) || (!common.hasIntl)) {
+  common.skip('ESLint tests require crypto and Intl');
+}
+
+common.skipIfEslintMissing();
+
+const { RuleTester } = require('../../tools/eslint/node_modules/eslint');
+const rule = require('../../tools/eslint-rules/iterator-result-done-first');
+
+const message = 'Iterator result objects should place `done` before `value`.';
+
+new RuleTester().run('iterator-result-done-first', rule, {
+  valid: [
+    'function next() { return { done: true, value: undefined }; }',
+    'function next() { return { __proto__: null, done: false, value: chunk }; }',
+    'function next() { return { done, value }; }',
+    'function next() { return { value }; }',
+    'function next() { return { done }; }',
+    'function next() { return { value: 1, other: 2 }; }',
+    'function next() { return { [value]: 1, done: true }; }',
+    'function next() { return { value: 1, [done]: true }; }',
+    'function next() { return { "done": true, "value": undefined }; }',
+    'function next() { return { ["done"]: true, ["value"]: undefined }; }',
+  ],
+  invalid: [
+    {
+      code: 'function next() { return { value: undefined, done: true }; }',
+      errors: [{ message }],
+      output: 'function next() { return { done: true, value: undefined }; }',
+    },
+    {
+      code: 'function next() { return { __proto__: null, value: chunk, done: false }; }',
+      errors: [{ message }],
+      output: 'function next() { return { __proto__: null, done: false, value: chunk }; }',
+    },
+    {
+      code: 'function next() { return { value, done }; }',
+      errors: [{ message }],
+      output: 'function next() { return { done, value }; }',
+    },
+    {
+      code: 'function next() { return { "value": undefined, "done": true }; }',
+      errors: [{ message }],
+      output: 'function next() { return { "done": true, "value": undefined }; }',
+    },
+    {
+      code: 'function next() { return { ["value"]: undefined, ["done"]: true }; }',
+      errors: [{ message }],
+      output: 'function next() { return { ["done"]: true, ["value"]: undefined }; }',
+    },
+    {
+      code: 'function next() { return { value: result, extra: true, done: false }; }',
+      errors: [{ message }],
+      output: 'function next() { return { done: false, extra: true, value: result }; }',
+    },
+  ],
+});
diff --git a/test/parallel/test-eslint-iterator-result-value-first.js b/test/parallel/test-eslint-iterator-result-value-first.js
deleted file mode 100644
index 24dc56be143..00000000000
--- a/test/parallel/test-eslint-iterator-result-value-first.js
+++ /dev/null
@@ -1,60 +0,0 @@
-'use strict';
-
-const common = require('../common');
-if ((!common.hasCrypto) || (!common.hasIntl)) {
-  common.skip('ESLint tests require crypto and Intl');
-}
-
-common.skipIfEslintMissing();
-
-const { RuleTester } = require('../../tools/eslint/node_modules/eslint');
-const rule = require('../../tools/eslint-rules/iterator-result-value-first');
-
-const message = 'Iterator result objects should place `value` before `done`.';
-
-new RuleTester().run('iterator-result-value-first', rule, {
-  valid: [
-    'function next() { return { value: undefined, done: true }; }',
-    'function next() { return { __proto__: null, value: chunk, done: false }; }',
-    'function next() { return { value, done }; }',
-    'function next() { return { value }; }',
-    'function next() { return { done }; }',
-    'function next() { return { done: 1, other: 2 }; }',
-    'function next() { return { [done]: 1, value: true }; }',
-    'function next() { return { done: 1, [value]: true }; }',
-    'function next() { return { "value": undefined, "done": true }; }',
-    'function next() { return { ["value"]: undefined, ["done"]: true }; }',
-  ],
-  invalid: [
-    {
-      code: 'function next() { return { done: true, value: undefined }; }',
-      errors: [{ message }],
-      output: 'function next() { return { value: undefined, done: true }; }',
-    },
-    {
-      code: 'function next() { return { __proto__: null, done: false, value: chunk }; }',
-      errors: [{ message }],
-      output: 'function next() { return { __proto__: null, value: chunk, done: false }; }',
-    },
-    {
-      code: 'function next() { return { done, value }; }',
-      errors: [{ message }],
-      output: 'function next() { return { value, done }; }',
-    },
-    {
-      code: 'function next() { return { "done": true, "value": undefined }; }',
-      errors: [{ message }],
-      output: 'function next() { return { "value": undefined, "done": true }; }',
-    },
-    {
-      code: 'function next() { return { ["done"]: true, ["value"]: undefined }; }',
-      errors: [{ message }],
-      output: 'function next() { return { ["value"]: undefined, ["done"]: true }; }',
-    },
-    {
-      code: 'function next() { return { done: false, extra: true, value: result }; }',
-      errors: [{ message }],
-      output: 'function next() { return { value: result, extra: true, done: false }; }',
-    },
-  ],
-});
diff --git a/tools/eslint-rules/iterator-result-value-first.js b/tools/eslint-rules/iterator-result-done-first.js
similarity index 68%
rename from tools/eslint-rules/iterator-result-value-first.js
rename to tools/eslint-rules/iterator-result-done-first.js
index 09d6fbe3027..1c3ee9035e9 100644
--- a/tools/eslint-rules/iterator-result-value-first.js
+++ b/tools/eslint-rules/iterator-result-done-first.js
@@ -1,10 +1,6 @@
 'use strict';

-// V8 has a fast path for `{ value, done }` literals, but it must be that order.
-// https://source.chromium.org/chromium/chromium/src/+/main:v8/src/init/bootstrapper.cc;l=746-754;drc=e8ac4914ee6b24442aed773d3a041451692b6a9c
-// Also, the ES spec technically requires that order.
-// https://tc39.es/ecma262/multipage/abstract-operations.html#sec-createiterresultobject
-const MESSAGE = 'Iterator result objects should place `value` before `done`.';
+const MESSAGE = 'Iterator result objects should place `done` before `value`.';

 function getStaticPropertyName(property) {
   const { key } = property;
@@ -52,9 +48,9 @@ module.exports = {
           }
         }

-        if (doneProperty && valueProperty && doneProperty.range[0] < valueProperty.range[0]) {
+        if (doneProperty && valueProperty && valueProperty.range[0] < doneProperty.range[0]) {
           context.report({
-            node: doneProperty,
+            node: valueProperty,
             message: MESSAGE,
             fix(fixer) {
               return [