From 54c7f111746ffdd3a82b172196c5b959ab45edc9 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Mon, 12 Sep 2022 07:40:18 +0700 Subject: [PATCH] avoid observable side effects of `%Array.prototype.values%` usage in array-like branch of `Array.fromAsync` https://github.com/tc39/proposal-array-from-async/pull/30 --- CHANGELOG.md | 1 + packages/core-js/internals/array-from-async.js | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61216bb469c4..4f4701543b74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## Changelog ##### Unreleased +- Avoiding observable side effects of `%Array.prototype.values%` usage in array-like branch of `Array.fromAsync`, [proposal-array-from-async/30](https://github.com/tc39/proposal-array-from-async/pull/30) - Added `inverse` option to `core-js-compat`, [#1119](https://github.com/zloirock/core-js/issues/1119) - Added `format` option to `core-js-builder`, [#1120](https://github.com/zloirock/core-js/issues/1120) diff --git a/packages/core-js/internals/array-from-async.js b/packages/core-js/internals/array-from-async.js index fa1098fb3562..dc8a4dfb2d4c 100644 --- a/packages/core-js/internals/array-from-async.js +++ b/packages/core-js/internals/array-from-async.js @@ -1,5 +1,6 @@ 'use strict'; var bind = require('../internals/function-bind-context'); +var uncurryThis = require('../internals/function-uncurry-this'); var toObject = require('../internals/to-object'); var isConstructor = require('../internals/is-constructor'); var getAsyncIterator = require('../internals/get-async-iterator'); @@ -13,7 +14,20 @@ var AsyncFromSyncIterator = require('../internals/async-from-sync-iterator'); var toArray = require('../internals/async-iterator-iteration').toArray; var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator'); -var arrayIterator = getVirtual('Array').values; +var arrayIterator = uncurryThis(getVirtual('Array').values); +var arrayIteratorNext = uncurryThis(arrayIterator([]).next); + +var safeArrayIterator = function () { + return new SafeArrayIterator(this); +}; + +var SafeArrayIterator = function (O) { + this.iterator = arrayIterator(O); +}; + +SafeArrayIterator.prototype.next = function () { + return arrayIteratorNext(this.iterator); +}; // `Array.fromAsync` method implementation // https://github.com/tc39/proposal-array-from-async @@ -26,7 +40,7 @@ module.exports = function fromAsync(asyncItems /* , mapfn = undefined, thisArg = var O = toObject(asyncItems); if (mapfn !== undefined) mapfn = bind(mapfn, thisArg); var usingAsyncIterator = getMethod(O, ASYNC_ITERATOR); - var usingSyncIterator = usingAsyncIterator ? undefined : getIteratorMethod(O) || arrayIterator; + var usingSyncIterator = usingAsyncIterator ? undefined : getIteratorMethod(O) || safeArrayIterator; var A = isConstructor(C) ? new C() : []; var iterator = usingAsyncIterator ? getAsyncIterator(O, usingAsyncIterator)