check-correctness-of-iteration.js 992 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. 'use strict';
  2. var wellKnownSymbol = require('../internals/well-known-symbol');
  3. var ITERATOR = wellKnownSymbol('iterator');
  4. var SAFE_CLOSING = false;
  5. try {
  6. var called = 0;
  7. var iteratorWithReturn = {
  8. next: function () {
  9. return { done: !!called++ };
  10. },
  11. 'return': function () {
  12. SAFE_CLOSING = true;
  13. }
  14. };
  15. iteratorWithReturn[ITERATOR] = function () {
  16. return this;
  17. };
  18. // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing
  19. Array.from(iteratorWithReturn, function () { throw 2; });
  20. } catch (error) { /* empty */ }
  21. module.exports = function (exec, SKIP_CLOSING) {
  22. if (!SKIP_CLOSING && !SAFE_CLOSING) return false;
  23. var ITERATION_SUPPORT = false;
  24. try {
  25. var object = {};
  26. object[ITERATOR] = function () {
  27. return {
  28. next: function () {
  29. return { done: ITERATION_SUPPORT = true };
  30. }
  31. };
  32. };
  33. exec(object);
  34. } catch (error) { /* empty */ }
  35. return ITERATION_SUPPORT;
  36. };