Skip to content

Commit

Permalink
avoid unnecessary promise creation and do not validate result in `%Wr…
Browse files Browse the repository at this point in the history
…apForValid(Async)IteratorPrototype%.return`

tc39/proposal-iterator-helpers#215
  • Loading branch information
zloirock committed Aug 10, 2022
1 parent 8685d52 commit 9ca5a51
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
@@ -1,5 +1,6 @@
## Changelog
##### Unreleased
- Avoid unnecessary promise creation and do not validate result in `%WrapForValid(Async)IteratorPrototype%.return`, [proposal-iterator-helpers/215](https://github.com/tc39/proposal-iterator-helpers/pull/215)
- Relaxed condition of re-usage native `WeakMap` for internal states with multiple `core-js` copies
- Some stylistic changes
- Added Electron 21 compat data mapping
Expand Down
28 changes: 18 additions & 10 deletions packages/core-js/internals/async-iterator-create-proxy.js
Expand Up @@ -76,21 +76,29 @@ var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) {
var state = stateCompletion.value;

return exit ? state : enqueue(state, function () {
return new Promise(function (resolve, reject) {
var iterator = state.iterator;
var innerIterator = state.innerIterator;
state.done = true;
state.done = true;
var iterator = state.iterator;
var innerIterator = state.innerIterator;
var returnMethod, result;
var completion = perform(function () {
if (innerIterator) try {
iteratorClose(innerIterator, 'return');
} catch (error) {
return iteratorClose(iterator, 'throw', error);
}
var $$return = getMethod(iterator, 'return');
if ($$return === undefined) return resolve({ done: true, value: undefined });
Promise.resolve(call($$return, iterator)).then(function (result) {
anObject(result);
resolve({ done: true, value: undefined });
}, reject);
return getMethod(iterator, 'return');
});
returnMethod = result = completion.value;
if (completion.error) return Promise.reject(result);
if (returnMethod === undefined) return Promise.resolve({ value: undefined, done: true });
completion = perform(function () {
return call(returnMethod, iterator);
});
result = completion.value;
if (completion.error) return Promise.reject(result);
return IS_ITERATOR ? Promise.resolve(result) : Promise.resolve(result).then(function (resolved) {
anObject(resolved);
return { value: undefined, done: true };
});
});
}
Expand Down
5 changes: 3 additions & 2 deletions packages/core-js/internals/iterator-create-proxy.js
Expand Up @@ -46,8 +46,9 @@ var createIteratorProxyPrototype = function (IS_ITERATOR) {
} catch (error) {
return iteratorClose(iterator, 'throw', error);
}
var $$return = getMethod(iterator, 'return');
return { done: true, value: $$return ? anObject(call($$return, iterator)).value : undefined };
var returnMethod = getMethod(iterator, 'return');
var result = returnMethod && call(returnMethod, iterator);
return IS_ITERATOR && returnMethod ? result : { value: returnMethod ? anObject(result).value : undefined, done: true };
}
});

Expand Down

0 comments on commit 9ca5a51

Please sign in to comment.