check-correctness-of-iteration.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  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. // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation
  16. iteratorWithReturn[ITERATOR] = function () {
  17. return this;
  18. };
  19. // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing
  20. Array.from(iteratorWithReturn, function () { throw 2; });
  21. } catch (error) { /* empty */ }
  22. module.exports = function (exec, SKIP_CLOSING) {
  23. try {
  24. if (!SKIP_CLOSING && !SAFE_CLOSING) return false;
  25. } catch (error) { return false; } // workaround of old WebKit + `eval` bug
  26. var ITERATION_SUPPORT = false;
  27. try {
  28. var object = {};
  29. // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation
  30. object[ITERATOR] = function () {
  31. return {
  32. next: function () {
  33. return { done: ITERATION_SUPPORT = true };
  34. }
  35. };
  36. };
  37. exec(object);
  38. } catch (error) { /* empty */ }
  39. return ITERATION_SUPPORT;
  40. };