2 var fails = require('../internals/fails');
3 var getPrototypeOf = require('../internals/object-get-prototype-of');
4 var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
5 var has = require('../internals/has');
6 var wellKnownSymbol = require('../internals/well-known-symbol');
7 var IS_PURE = require('../internals/is-pure');
9 var ITERATOR = wellKnownSymbol('iterator');
10 var BUGGY_SAFARI_ITERATORS = false;
12 var returnThis = function () { return this; };
14 // `%IteratorPrototype%` object
15 // https://tc39.es/ecma262/#sec-%iteratorprototype%-object
16 var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;
19 arrayIterator = [].keys();
20 // Safari 8 has buggy iterators w/o `next`
21 if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;
23 PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));
24 if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;
28 var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {
30 // FF44- legacy iterators case
31 return IteratorPrototype[ITERATOR].call(test) !== test;
34 if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};
36 // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
37 if ((!IS_PURE || NEW_ITERATOR_PROTOTYPE) && !has(IteratorPrototype, ITERATOR)) {
38 createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);
42 IteratorPrototype: IteratorPrototype,
43 BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS