diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f579eb5cd62..61cf852f261e 100644 --- a/CHANGELOG.md +++ b/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 diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index ee26110b9ecf..3f5ef35be3aa 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -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 }; }); }); } diff --git a/packages/core-js/internals/iterator-create-proxy.js b/packages/core-js/internals/iterator-create-proxy.js index d85fe1bb3a50..b4fe0156207c 100644 --- a/packages/core-js/internals/iterator-create-proxy.js +++ b/packages/core-js/internals/iterator-create-proxy.js @@ -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 }; } });