From 4540e904f0a7922baa8f04f179eda37614fd3722 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Wed, 6 Jul 2022 09:06:33 +0700 Subject: [PATCH] `RangeError` on `NaN` in `.drop` and `.take` https://github.com/tc39/proposal-iterator-helpers/pull/181 --- packages/core-js/internals/not-a-nan.js | 7 +++++++ packages/core-js/modules/esnext.async-iterator.drop.js | 3 ++- packages/core-js/modules/esnext.async-iterator.take.js | 3 ++- packages/core-js/modules/esnext.iterator.drop.js | 3 ++- packages/core-js/modules/esnext.iterator.take.js | 3 ++- tests/pure/esnext.async-iterator.drop.js | 3 ++- tests/pure/esnext.async-iterator.take.js | 3 ++- tests/pure/esnext.iterator.drop.js | 1 + tests/pure/esnext.iterator.take.js | 1 + tests/tests/esnext.async-iterator.drop.js | 3 ++- tests/tests/esnext.async-iterator.take.js | 3 ++- tests/tests/esnext.iterator.drop.js | 1 + tests/tests/esnext.iterator.take.js | 1 + 13 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 packages/core-js/internals/not-a-nan.js diff --git a/packages/core-js/internals/not-a-nan.js b/packages/core-js/internals/not-a-nan.js new file mode 100644 index 000000000000..cfb63bba3c4d --- /dev/null +++ b/packages/core-js/internals/not-a-nan.js @@ -0,0 +1,7 @@ +var $RangeError = RangeError; + +module.exports = function (it) { + // eslint-disable-next-line no-self-compare -- NaN check + if (it === it) return it; + throw $RangeError('NaN is not allowed'); +}; diff --git a/packages/core-js/modules/esnext.async-iterator.drop.js b/packages/core-js/modules/esnext.async-iterator.drop.js index be40c4c2da31..4e396937549a 100644 --- a/packages/core-js/modules/esnext.async-iterator.drop.js +++ b/packages/core-js/modules/esnext.async-iterator.drop.js @@ -4,6 +4,7 @@ var $ = require('../internals/export'); var apply = require('../internals/function-apply'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); +var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); @@ -36,7 +37,7 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { drop: function drop(limit) { return new AsyncIteratorProxy(getIteratorDirect(this), { - remaining: toPositiveInteger(limit) + remaining: toPositiveInteger(notANaN(+limit)) }); } }); diff --git a/packages/core-js/modules/esnext.async-iterator.take.js b/packages/core-js/modules/esnext.async-iterator.take.js index 2f62c212845f..1649e96f2907 100644 --- a/packages/core-js/modules/esnext.async-iterator.take.js +++ b/packages/core-js/modules/esnext.async-iterator.take.js @@ -4,6 +4,7 @@ var $ = require('../internals/export'); var apply = require('../internals/function-apply'); var call = require('../internals/function-call'); var getIteratorDirect = require('../internals/get-iterator-direct'); +var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); @@ -26,7 +27,7 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) { $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, { take: function take(limit) { return new AsyncIteratorProxy(getIteratorDirect(this), { - remaining: toPositiveInteger(limit) + remaining: toPositiveInteger(notANaN(+limit)) }); } }); diff --git a/packages/core-js/modules/esnext.iterator.drop.js b/packages/core-js/modules/esnext.iterator.drop.js index 888110bcdd99..b24e17ed7ac5 100644 --- a/packages/core-js/modules/esnext.iterator.drop.js +++ b/packages/core-js/modules/esnext.iterator.drop.js @@ -5,6 +5,7 @@ var apply = require('../internals/function-apply'); var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); +var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createIteratorProxy = require('../internals/iterator-create-proxy'); @@ -26,7 +27,7 @@ var IteratorProxy = createIteratorProxy(function (args) { $({ target: 'Iterator', proto: true, real: true, forced: true }, { drop: function drop(limit) { return new IteratorProxy(getIteratorDirect(this), { - remaining: toPositiveInteger(limit) + remaining: toPositiveInteger(notANaN(+limit)) }); } }); diff --git a/packages/core-js/modules/esnext.iterator.take.js b/packages/core-js/modules/esnext.iterator.take.js index 5ae6cda60c91..15001836a020 100644 --- a/packages/core-js/modules/esnext.iterator.take.js +++ b/packages/core-js/modules/esnext.iterator.take.js @@ -4,6 +4,7 @@ var $ = require('../internals/export'); var apply = require('../internals/function-apply'); var anObject = require('../internals/an-object'); var getIteratorDirect = require('../internals/get-iterator-direct'); +var notANaN = require('../internals/not-a-nan'); var toPositiveInteger = require('../internals/to-positive-integer'); var createIteratorProxy = require('../internals/iterator-create-proxy'); var iteratorClose = require('../internals/iterator-close'); @@ -22,7 +23,7 @@ var IteratorProxy = createIteratorProxy(function (args) { $({ target: 'Iterator', proto: true, real: true, forced: true }, { take: function take(limit) { return new IteratorProxy(getIteratorDirect(this), { - remaining: toPositiveInteger(limit) + remaining: toPositiveInteger(notANaN(+limit)) }); } }); diff --git a/tests/pure/esnext.async-iterator.drop.js b/tests/pure/esnext.async-iterator.drop.js index 4eb50a150cf4..51786e74eb23 100644 --- a/tests/pure/esnext.async-iterator.drop.js +++ b/tests/pure/esnext.async-iterator.drop.js @@ -3,7 +3,7 @@ import { createIterator } from '../helpers/helpers'; import AsyncIterator from 'core-js-pure/full/async-iterator'; QUnit.test('AsyncIterator#drop', assert => { - assert.expect(12); + assert.expect(13); const async = assert.async(); const { drop } = AsyncIterator.prototype; @@ -29,4 +29,5 @@ QUnit.test('AsyncIterator#drop', assert => { assert.throws(() => drop.call({}, 1), TypeError); assert.throws(() => drop.call([], 1), TypeError); assert.throws(() => drop.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => drop.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/pure/esnext.async-iterator.take.js b/tests/pure/esnext.async-iterator.take.js index dc5c0a561c5e..927c7d85fd54 100644 --- a/tests/pure/esnext.async-iterator.take.js +++ b/tests/pure/esnext.async-iterator.take.js @@ -3,7 +3,7 @@ import { createIterator } from '../helpers/helpers'; import AsyncIterator from 'core-js-pure/full/async-iterator'; QUnit.test('AsyncIterator#take', assert => { - assert.expect(12); + assert.expect(13); const async = assert.async(); const { take } = AsyncIterator.prototype; @@ -29,4 +29,5 @@ QUnit.test('AsyncIterator#take', assert => { assert.throws(() => take.call({}, 1), TypeError); assert.throws(() => take.call([], 1), TypeError); assert.throws(() => take.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => take.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/pure/esnext.iterator.drop.js b/tests/pure/esnext.iterator.drop.js index 83b086156665..25cf67ed0165 100644 --- a/tests/pure/esnext.iterator.drop.js +++ b/tests/pure/esnext.iterator.drop.js @@ -19,4 +19,5 @@ QUnit.test('Iterator#drop', assert => { assert.throws(() => drop.call({}, 1), TypeError); assert.throws(() => drop.call([], 1), TypeError); assert.throws(() => drop.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => drop.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/pure/esnext.iterator.take.js b/tests/pure/esnext.iterator.take.js index 8c69455e65b9..23728d0711f8 100644 --- a/tests/pure/esnext.iterator.take.js +++ b/tests/pure/esnext.iterator.take.js @@ -19,4 +19,5 @@ QUnit.test('Iterator#take', assert => { assert.throws(() => take.call({}, 1), TypeError); assert.throws(() => take.call([], 1), TypeError); assert.throws(() => take.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => take.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/tests/esnext.async-iterator.drop.js b/tests/tests/esnext.async-iterator.drop.js index 5346d3b1cdf3..01194670daa9 100644 --- a/tests/tests/esnext.async-iterator.drop.js +++ b/tests/tests/esnext.async-iterator.drop.js @@ -1,7 +1,7 @@ import { createIterator } from '../helpers/helpers'; QUnit.test('AsyncIterator#drop', assert => { - assert.expect(14); + assert.expect(15); const async = assert.async(); const { drop } = AsyncIterator.prototype; @@ -29,4 +29,5 @@ QUnit.test('AsyncIterator#drop', assert => { assert.throws(() => drop.call({}, 1), TypeError); assert.throws(() => drop.call([], 1), TypeError); assert.throws(() => drop.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => drop.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/tests/esnext.async-iterator.take.js b/tests/tests/esnext.async-iterator.take.js index a55b51383b3a..39d855a1e1ba 100644 --- a/tests/tests/esnext.async-iterator.take.js +++ b/tests/tests/esnext.async-iterator.take.js @@ -1,7 +1,7 @@ import { createIterator } from '../helpers/helpers'; QUnit.test('AsyncIterator#take', assert => { - assert.expect(14); + assert.expect(15); const async = assert.async(); const { take } = AsyncIterator.prototype; @@ -29,4 +29,5 @@ QUnit.test('AsyncIterator#take', assert => { assert.throws(() => take.call({}, 1), TypeError); assert.throws(() => take.call([], 1), TypeError); assert.throws(() => take.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => take.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/tests/esnext.iterator.drop.js b/tests/tests/esnext.iterator.drop.js index 714918def202..a38931a5090c 100644 --- a/tests/tests/esnext.iterator.drop.js +++ b/tests/tests/esnext.iterator.drop.js @@ -19,4 +19,5 @@ QUnit.test('Iterator#drop', assert => { assert.throws(() => drop.call({}, 1), TypeError); assert.throws(() => drop.call([], 1), TypeError); assert.throws(() => drop.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => drop.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); }); diff --git a/tests/tests/esnext.iterator.take.js b/tests/tests/esnext.iterator.take.js index 1430f73b509c..7063523f4b7d 100644 --- a/tests/tests/esnext.iterator.take.js +++ b/tests/tests/esnext.iterator.take.js @@ -19,4 +19,5 @@ QUnit.test('Iterator#take', assert => { assert.throws(() => take.call({}, 1), TypeError); assert.throws(() => take.call([], 1), TypeError); assert.throws(() => take.call(createIterator([1, 2, 3]), -1), RangeError, 'negative'); + assert.throws(() => take.call(createIterator([1, 2, 3]), NaN), RangeError, 'NaN'); });