From 9e701767927c0c590f0bfbfa1cbc7e09c451584b Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Tue, 23 Aug 2022 01:03:08 +0700 Subject: [PATCH] fix omitting the result of proxing `.return` in `%IteratorHelperPrototype%.return`, close #1116 --- CHANGELOG.md | 1 + packages/core-js/internals/iterator-create-proxy.js | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62ebb90005a1..0c0cdd3951a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ##### Unreleased - Considering `document.all` as an object in some missed cases, see [ECMAScript Annex B 3.6](https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot) - Avoiding unnecessary promise creation and validation result in `%WrapForValid(Async)IteratorPrototype%.return`, [proposal-iterator-helpers/215](https://github.com/tc39/proposal-iterator-helpers/pull/215) +- Fixed omitting the result of proxing `.return` in `%IteratorHelperPrototype%.return`, [#1116](https://github.com/zloirock/core-js/issues/1116) - Fixed the order creation of properties of iteration result object of some iterators (`value` should be created before `done`) - Fixed some cases of Safari < 13 bug - silent on non-writable array `.length` setting - Fixed `ArrayBuffer.length` in V8 ~ Chrome 27- diff --git a/packages/core-js/internals/iterator-create-proxy.js b/packages/core-js/internals/iterator-create-proxy.js index 43b56383c781..35a6aa768b4c 100644 --- a/packages/core-js/internals/iterator-create-proxy.js +++ b/packages/core-js/internals/iterator-create-proxy.js @@ -1,6 +1,5 @@ 'use strict'; var call = require('../internals/function-call'); -var anObject = require('../internals/an-object'); var create = require('../internals/object-create'); var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); var defineBuiltIns = require('../internals/define-built-ins'); @@ -39,16 +38,19 @@ var createIteratorProxyPrototype = function (IS_ITERATOR) { 'return': function () { var state = getInternalState(this); var iterator = state.iterator; - var innerIterator = state.innerIterator; state.done = true; + if (IS_ITERATOR) { + var returnMethod = getMethod(iterator, 'return'); + return returnMethod ? call(returnMethod, iterator) : { value: undefined, done: true }; + } + var innerIterator = state.innerIterator; if (innerIterator) try { iteratorClose(innerIterator, 'return'); } catch (error) { return iteratorClose(iterator, 'throw', error); } - var returnMethod = getMethod(iterator, 'return'); - var result = returnMethod && call(returnMethod, iterator); - return IS_ITERATOR && returnMethod ? result : { value: returnMethod ? anObject(result).value : undefined, done: true }; + iteratorClose(iterator, 'return'); + return { value: undefined, done: true }; } });