iterator-create-proxy.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. 'use strict';
  2. var call = require('../internals/function-call');
  3. var create = require('../internals/object-create');
  4. var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
  5. var defineBuiltIns = require('../internals/define-built-ins');
  6. var wellKnownSymbol = require('../internals/well-known-symbol');
  7. var InternalStateModule = require('../internals/internal-state');
  8. var getMethod = require('../internals/get-method');
  9. var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;
  10. var iteratorClose = require('../internals/iterator-close');
  11. var ITERATOR_HELPER = 'IteratorHelper';
  12. var WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator';
  13. var setInternalState = InternalStateModule.set;
  14. var TO_STRING_TAG = wellKnownSymbol('toStringTag');
  15. var createIteratorProxyPrototype = function (IS_ITERATOR) {
  16. var ITERATOR_PROXY = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER;
  17. var getInternalState = InternalStateModule.getterFor(ITERATOR_PROXY);
  18. var IteratorProxyPrototype = defineBuiltIns(create(IteratorPrototype), {
  19. next: function next() {
  20. var state = getInternalState(this);
  21. // for simplification:
  22. // for `%WrapForValidIteratorPrototype%.next` our `nextHandler` returns `IterResultObject`
  23. // for `%IteratorHelperPrototype%.next` - just a value
  24. if (IS_ITERATOR) return state.nextHandler();
  25. try {
  26. var result = state.done ? undefined : state.nextHandler();
  27. return { value: result, done: state.done };
  28. } catch (error) {
  29. state.done = true;
  30. throw error;
  31. }
  32. },
  33. 'return': function () {
  34. var state = getInternalState(this);
  35. var iterator = state.iterator;
  36. state.done = true;
  37. if (IS_ITERATOR) {
  38. var returnMethod = getMethod(iterator, 'return');
  39. return returnMethod ? call(returnMethod, iterator) : { value: undefined, done: true };
  40. }
  41. var innerIterator = state.innerIterator;
  42. if (innerIterator) try {
  43. iteratorClose(innerIterator, 'return');
  44. } catch (error) {
  45. return iteratorClose(iterator, 'throw', error);
  46. }
  47. iteratorClose(iterator, 'return');
  48. return { value: undefined, done: true };
  49. }
  50. });
  51. if (!IS_ITERATOR) {
  52. createNonEnumerableProperty(IteratorProxyPrototype, TO_STRING_TAG, 'Iterator Helper');
  53. }
  54. return IteratorProxyPrototype;
  55. };
  56. var IteratorHelperPrototype = createIteratorProxyPrototype(false);
  57. var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true);
  58. module.exports = function (nextHandler, IS_ITERATOR) {
  59. var ITERATOR_PROXY = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER;
  60. var IteratorProxy = function Iterator(record, state) {
  61. if (state) {
  62. state.iterator = record.iterator;
  63. state.next = record.next;
  64. } else state = record;
  65. state.type = ITERATOR_PROXY;
  66. state.nextHandler = nextHandler;
  67. state.done = false;
  68. setInternalState(this, state);
  69. };
  70. IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype;
  71. return IteratorProxy;
  72. };