From 94a482025a490bfb4025ef2cf76a561899477d51 Mon Sep 17 00:00:00 2001 From: Michael Ficarra Date: Fri, 29 May 2026 15:36:17 -0600 Subject: [PATCH] throw RangeError when skippedElements > Number.MAX_SAFE_INTEGER --- spec.emu | 3 +++ src/index.ts | 2 +- test/index.mjs | 13 +++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/spec.emu b/spec.emu index 2e656d7..eb74c40 100644 --- a/spec.emu +++ b/spec.emu @@ -25,6 +25,9 @@ copyright: false 1. If _toSkip_ < *-0*𝔽, then 1. Let _error_ be ThrowCompletion(a newly created *RangeError* object). 1. Return ? IteratorClose(_iterated_, _error_). + 1. If _toSkip_ is finite and _toSkip_ > 𝔽(253 - 1), then + 1. Let _error_ be ThrowCompletion(a newly created *RangeError* object). + 1. Return ? IteratorClose(_iterated_, _error_). 1. Let _skipped_ be *+0*𝔽. 1. Set _iterated_ to ? GetIteratorDirect(_O_). 1. Repeat, diff --git a/src/index.ts b/src/index.ts index 996d6c7..2a3cdfd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,7 +7,7 @@ function includes(this: IterableIterator, searchElement: T, skippedElement } toSkip = skippedElements as number; } - if (toSkip < 0) { + if (toSkip < 0 || Number.isFinite(toSkip) && toSkip > Number.MAX_SAFE_INTEGER) { try { this.return?.(); } catch {} throw new RangeError; } diff --git a/test/index.mjs b/test/index.mjs index a21372d..afb1858 100644 --- a/test/index.mjs +++ b/test/index.mjs @@ -180,6 +180,10 @@ test('skipped elements', async t => { assert.equal([4, 5, 6, 7].values().includes(7, 5), false); }); + await test('Number.MAX_SAFE_INTEGER', async t => { + assert.equal([0].values().includes(0, Number.MAX_SAFE_INTEGER), false); + }); + await test('positive non-integral', async t => { assert.throws(() => { [].values().includes(0, 0.1); @@ -215,6 +219,15 @@ test('skipped elements', async t => { [].values().includes(0, { valueOf() { return 0; } }); }, TypeError); }); + + await test('greater than Number.MAX_SAFE_INTEGER', async t => { + assert.throws(() => { + [].values().includes(0, Number.MAX_SAFE_INTEGER + 1); + }, RangeError); + assert.throws(() => { + [].values().includes(0, Number.MAX_SAFE_INTEGER + 3); + }, RangeError); + }); }); test('name', async t => {