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 => {