Skip to content

Commit

Permalink
early exit on broken .next in missed cases of `{ Iterator, AsyncIte…
Browse files Browse the repository at this point in the history
  • Loading branch information
zloirock committed Sep 14, 2022
1 parent 8f64706 commit d3cff77
Show file tree
Hide file tree
Showing 7 changed files with 22 additions and 20 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
@@ -1,5 +1,6 @@
## Changelog
##### Unreleased
- Early exit on broken `.next` in missed cases of `{ Iterator, AsyncIterator }.from`, [proposal-iterator-helpers/232](https://github.com/tc39/proposal-iterator-helpers/pull/232)
- Considering `document.all` as a callable in some missed cases
- Added Safari 16.0 compat data
- Added iOS Safari 16.0 compat data mapping
Expand Down
3 changes: 2 additions & 1 deletion packages/core-js/internals/array-from-async.js
Expand Up @@ -4,6 +4,7 @@ var toObject = require('../internals/to-object');
var isConstructor = require('../internals/is-constructor');
var getAsyncIterator = require('../internals/get-async-iterator');
var getIterator = require('../internals/get-iterator');
var getIteratorDirect = require('../internals/get-iterator-direct');
var getIteratorMethod = require('../internals/get-iterator-method');
var getMethod = require('../internals/get-method');
var getVirtual = require('../internals/entry-virtual');
Expand All @@ -30,7 +31,7 @@ module.exports = function fromAsync(asyncItems /* , mapfn = undefined, thisArg =
var A = isConstructor(C) ? new C() : [];
var iterator = usingAsyncIterator
? getAsyncIterator(O, usingAsyncIterator)
: new AsyncFromSyncIterator(getIterator(O, usingSyncIterator));
: new AsyncFromSyncIterator(getIteratorDirect(getIterator(O, usingSyncIterator)));
resolve(toArray(iterator, mapfn, A));
});
};
9 changes: 3 additions & 6 deletions packages/core-js/internals/async-from-sync-iterator.js
Expand Up @@ -22,12 +22,9 @@ var asyncFromSyncIteratorContinuation = function (result, resolve, reject) {
}, reject);
};

var AsyncFromSyncIterator = function AsyncIterator(iterator) {
setInternalState(this, {
type: ASYNC_FROM_SYNC_ITERATOR,
iterator: anObject(iterator),
next: iterator.next
});
var AsyncFromSyncIterator = function AsyncIterator(iteratorRecord) {
iteratorRecord.type = ASYNC_FROM_SYNC_ITERATOR;
setInternalState(this, iteratorRecord);
};

AsyncFromSyncIterator.prototype = defineBuiltIns(create(AsyncIteratorPrototype), {
Expand Down
3 changes: 2 additions & 1 deletion packages/core-js/internals/get-async-iterator.js
Expand Up @@ -2,12 +2,13 @@ var call = require('../internals/function-call');
var AsyncFromSyncIterator = require('../internals/async-from-sync-iterator');
var anObject = require('../internals/an-object');
var getIterator = require('../internals/get-iterator');
var getIteratorDirect = require('../internals/get-iterator-direct');
var getMethod = require('../internals/get-method');
var wellKnownSymbol = require('../internals/well-known-symbol');

var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator');

module.exports = function (it, usingIterator) {
var method = arguments.length < 2 ? getMethod(it, ASYNC_ITERATOR) : usingIterator;
return method ? anObject(call(method, it)) : new AsyncFromSyncIterator(getIterator(it));
return method ? anObject(call(method, it)) : new AsyncFromSyncIterator(getIteratorDirect(getIterator(it)));
};
14 changes: 8 additions & 6 deletions packages/core-js/modules/esnext.async-iterator.from.js
Expand Up @@ -18,15 +18,17 @@ $({ target: 'AsyncIterator', stat: true, forced: true }, {
from: function from(O) {
var object = toObject(O);
var usingIterator = getMethod(object, ASYNC_ITERATOR);
var iterator;
var iteratorRecord;
if (usingIterator) {
iterator = getAsyncIterator(object, usingIterator);
if (isPrototypeOf(AsyncIteratorPrototype, iterator)) return iterator;
iteratorRecord = getIteratorDirect(getAsyncIterator(object, usingIterator));
if (isPrototypeOf(AsyncIteratorPrototype, iteratorRecord.iterator)) return iteratorRecord.iterator;
}
if (iterator === undefined) {
if (iteratorRecord === undefined) {
usingIterator = getIteratorMethod(object);
if (usingIterator) iterator = new AsyncFromSyncIterator(getIterator(object, usingIterator));
if (usingIterator) iteratorRecord = getIteratorDirect(new AsyncFromSyncIterator(
getIteratorDirect(getIterator(object, usingIterator))
));
}
return new WrapAsyncIterator(getIteratorDirect(iterator !== undefined ? iterator : object));
return new WrapAsyncIterator(iteratorRecord !== undefined ? iteratorRecord : getIteratorDirect(object));
}
});
10 changes: 5 additions & 5 deletions packages/core-js/modules/esnext.iterator.from.js
Expand Up @@ -17,12 +17,12 @@ $({ target: 'Iterator', stat: true, forced: true }, {
from: function from(O) {
var object = toObject(O);
var usingIterator = getIteratorMethod(object);
var iterator;
var iteratorRecord;
if (usingIterator) {
iterator = getIterator(object, usingIterator);
if (isPrototypeOf(IteratorPrototype, iterator)) return iterator;
iteratorRecord = getIteratorDirect(getIterator(object, usingIterator));
if (isPrototypeOf(IteratorPrototype, iteratorRecord.iterator)) return iteratorRecord.iterator;
} else {
iterator = object;
} return new IteratorProxy(getIteratorDirect(iterator));
iteratorRecord = getIteratorDirect(object);
} return new IteratorProxy(iteratorRecord);
}
});
2 changes: 1 addition & 1 deletion packages/core-js/modules/esnext.iterator.to-async.js
Expand Up @@ -7,6 +7,6 @@ var getIteratorDirect = require('../internals/get-iterator-direct');

$({ target: 'Iterator', proto: true, real: true, forced: true }, {
toAsync: function toAsync() {
return new WrapAsyncIterator(getIteratorDirect(new AsyncFromSyncIterator(this)));
return new WrapAsyncIterator(getIteratorDirect(new AsyncFromSyncIterator(getIteratorDirect(this))));
}
});

0 comments on commit d3cff77

Please sign in to comment.