Skip to content

Commit 1a3d541

Browse files
committed
validate arguments before opening iterator in iterator helpers
babel/proposals#87 (comment) tc39/proposal-iterator-helpers#265
1 parent 9509bdd commit 1a3d541

23 files changed

+59
-25
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
##### Unreleased
33
- [`Set` methods proposal](https://github.com/tc39/proposal-set-methods):
44
- Removed sort from `Set.prototype.intersection`, [March 2023 TC39 meeting](https://github.com/babel/proposals/issues/87#issuecomment-1478610425), [proposal-set-methods/94](https://github.com/tc39/proposal-set-methods/pull/94)
5+
- (Async) Iterator Helpers proposals ([sync](https://github.com/tc39/proposal-iterator-helpers), [async](https://github.com/tc39/proposal-async-iterator-helpers)):
6+
- Validate arguments before opening iterator, [March 2023 TC39 meeting](https://github.com/babel/proposals/issues/87#issuecomment-1478412430), [proposal-iterator-helpers/265](https://github.com/tc39/proposal-iterator-helpers/pull/265)
57
- (Async) Explicit Resource Management proposals ([sync](https://github.com/tc39/proposal-explicit-resource-management), [async](https://github.com/tc39/proposal-async-explicit-resource-management)):
68
- `(Async)DisposableStack.prototype.move` marks the original stack as disposed, [#1226](https://github.com/zloirock/core-js/issues/1226)
79
- Some simplifications like [proposal-explicit-resource-management/150](https://github.com/tc39/proposal-explicit-resource-management/pull/150)

packages/core-js/internals/async-iterator-iteration.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ var createMethod = function (TYPE) {
1616
var IS_EVERY = TYPE == 2;
1717
var IS_SOME = TYPE == 3;
1818
return function (object, fn, target) {
19+
anObject(object);
20+
var MAPPING = fn !== undefined;
21+
if (MAPPING || !IS_TO_ARRAY) aCallable(fn);
1922
var record = getIteratorDirect(object);
2023
var Promise = getBuiltIn('Promise');
2124
var iterator = record.iterator;
2225
var next = record.next;
2326
var counter = 0;
24-
var MAPPING = fn !== undefined;
25-
if (MAPPING || !IS_TO_ARRAY) aCallable(fn);
2627

2728
return new Promise(function (resolve, reject) {
2829
var ifAbruptCloseAsyncIterator = function (error) {

packages/core-js/internals/async-iterator-map.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
4949
// `AsyncIterator.prototype.map` method
5050
// https://github.com/tc39/proposal-iterator-helpers
5151
module.exports = function map(mapper) {
52+
anObject(this);
53+
aCallable(mapper);
5254
return new AsyncIteratorProxy(getIteratorDirect(this), {
53-
mapper: aCallable(mapper)
55+
mapper: mapper
5456
});
5557
};

packages/core-js/internals/get-async-iterator-flattenable.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ module.exports = function from(obj) {
1818
method = getIteratorMethod(object);
1919
alreadyAsync = false;
2020
}
21-
if (isCallable(method)) {
21+
if (method !== undefined) {
2222
iterator = call(method, object);
2323
} else {
2424
iterator = object;
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
var aCallable = require('../internals/a-callable');
2-
var anObject = require('../internals/an-object');
32

43
module.exports = function (obj) {
54
return {
65
iterator: obj,
7-
next: aCallable(anObject(obj).next)
6+
next: aCallable(obj.next)
87
};
98
};
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
var call = require('../internals/function-call');
2-
var isCallable = require('../internals/is-callable');
32
var anObject = require('../internals/an-object');
43
var getIteratorDirect = require('../internals/get-iterator-direct');
54
var getIteratorMethod = require('../internals/get-iterator-method');
65

76
module.exports = function (obj) {
87
var object = anObject(obj);
98
var method = getIteratorMethod(object);
10-
return getIteratorDirect(anObject(isCallable(method) ? call(method, object) : object));
9+
return getIteratorDirect(anObject(method !== undefined ? call(method, object) : object));
1110
};

packages/core-js/internals/iterator-map.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ var IteratorProxy = createIteratorProxy(function () {
1616
// `Iterator.prototype.map` method
1717
// https://github.com/tc39/proposal-iterator-helpers
1818
module.exports = function map(mapper) {
19+
anObject(this);
20+
aCallable(mapper);
1921
return new IteratorProxy(getIteratorDirect(this), {
20-
mapper: aCallable(mapper)
22+
mapper: mapper
2123
});
2224
};

packages/core-js/modules/esnext.async-iterator.drop.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
4141
// https://github.com/tc39/proposal-async-iterator-helpers
4242
$({ target: 'AsyncIterator', proto: true, real: true }, {
4343
drop: function drop(limit) {
44+
anObject(this);
45+
var remaining = toPositiveInteger(notANaN(+limit));
4446
return new AsyncIteratorProxy(getIteratorDirect(this), {
45-
remaining: toPositiveInteger(notANaN(+limit))
47+
remaining: remaining
4648
});
4749
}
4850
});

packages/core-js/modules/esnext.async-iterator.filter.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
5757
// https://github.com/tc39/proposal-async-iterator-helpers
5858
$({ target: 'AsyncIterator', proto: true, real: true }, {
5959
filter: function filter(predicate) {
60+
anObject(this);
61+
aCallable(predicate);
6062
return new AsyncIteratorProxy(getIteratorDirect(this), {
61-
predicate: aCallable(predicate)
63+
predicate: predicate
6264
});
6365
}
6466
});

packages/core-js/modules/esnext.async-iterator.flat-map.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,10 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
7777
// https://github.com/tc39/proposal-async-iterator-helpers
7878
$({ target: 'AsyncIterator', proto: true, real: true }, {
7979
flatMap: function flatMap(mapper) {
80+
anObject(this);
81+
aCallable(mapper);
8082
return new AsyncIteratorProxy(getIteratorDirect(this), {
81-
mapper: aCallable(mapper),
83+
mapper: mapper,
8284
inner: null
8385
});
8486
}

packages/core-js/modules/esnext.async-iterator.reduce.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@ var $TypeError = TypeError;
1515
// https://github.com/tc39/proposal-async-iterator-helpers
1616
$({ target: 'AsyncIterator', proto: true, real: true }, {
1717
reduce: function reduce(reducer /* , initialValue */) {
18+
anObject(this);
19+
aCallable(reducer);
1820
var record = getIteratorDirect(this);
1921
var iterator = record.iterator;
2022
var next = record.next;
2123
var noInitial = arguments.length < 2;
2224
var accumulator = noInitial ? undefined : arguments[1];
2325
var counter = 0;
24-
aCallable(reducer);
2526

2627
return new Promise(function (resolve, reject) {
2728
var ifAbruptCloseAsyncIterator = function (error) {

packages/core-js/modules/esnext.async-iterator.take.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
3838
// https://github.com/tc39/proposal-async-iterator-helpers
3939
$({ target: 'AsyncIterator', proto: true, real: true }, {
4040
take: function take(limit) {
41+
anObject(this);
42+
var remaining = toPositiveInteger(notANaN(+limit));
4143
return new AsyncIteratorProxy(getIteratorDirect(this), {
42-
remaining: toPositiveInteger(notANaN(+limit))
44+
remaining: remaining
4345
});
4446
}
4547
});

packages/core-js/modules/esnext.iterator.drop.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ var IteratorProxy = createIteratorProxy(function () {
2626
// https://github.com/tc39/proposal-iterator-helpers
2727
$({ target: 'Iterator', proto: true, real: true }, {
2828
drop: function drop(limit) {
29+
anObject(this);
30+
var remaining = toPositiveInteger(notANaN(+limit));
2931
return new IteratorProxy(getIteratorDirect(this), {
30-
remaining: toPositiveInteger(notANaN(+limit))
32+
remaining: remaining
3133
});
3234
}
3335
});

packages/core-js/modules/esnext.iterator.every.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22
var $ = require('../internals/export');
33
var iterate = require('../internals/iterate');
44
var aCallable = require('../internals/a-callable');
5+
var anObject = require('../internals/an-object');
56
var getIteratorDirect = require('../internals/get-iterator-direct');
67

78
// `Iterator.prototype.every` method
89
// https://github.com/tc39/proposal-iterator-helpers
910
$({ target: 'Iterator', proto: true, real: true }, {
1011
every: function every(predicate) {
12+
anObject(this);
13+
aCallable(predicate);
1114
var record = getIteratorDirect(this);
1215
var counter = 0;
13-
aCallable(predicate);
1416
return !iterate(record, function (value, stop) {
1517
if (!predicate(value, counter++)) return stop();
1618
}, { IS_RECORD: true, INTERRUPTED: true }).stopped;

packages/core-js/modules/esnext.iterator.filter.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ var IteratorProxy = createIteratorProxy(function () {
2525
// https://github.com/tc39/proposal-iterator-helpers
2626
$({ target: 'Iterator', proto: true, real: true }, {
2727
filter: function filter(predicate) {
28+
anObject(this);
29+
aCallable(predicate);
2830
return new IteratorProxy(getIteratorDirect(this), {
29-
predicate: aCallable(predicate)
31+
predicate: predicate
3032
});
3133
}
3234
});

packages/core-js/modules/esnext.iterator.find.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22
var $ = require('../internals/export');
33
var iterate = require('../internals/iterate');
44
var aCallable = require('../internals/a-callable');
5+
var anObject = require('../internals/an-object');
56
var getIteratorDirect = require('../internals/get-iterator-direct');
67

78
// `Iterator.prototype.find` method
89
// https://github.com/tc39/proposal-iterator-helpers
910
$({ target: 'Iterator', proto: true, real: true }, {
1011
find: function find(predicate) {
12+
anObject(this);
13+
aCallable(predicate);
1114
var record = getIteratorDirect(this);
1215
var counter = 0;
13-
aCallable(predicate);
1416
return iterate(record, function (value, stop) {
1517
if (predicate(value, counter++)) return stop(value);
1618
}, { IS_RECORD: true, INTERRUPTED: true }).result;

packages/core-js/modules/esnext.iterator.flat-map.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ var IteratorProxy = createIteratorProxy(function () {
3434
// https://github.com/tc39/proposal-iterator-helpers
3535
$({ target: 'Iterator', proto: true, real: true }, {
3636
flatMap: function flatMap(mapper) {
37+
anObject(this);
38+
aCallable(mapper);
3739
return new IteratorProxy(getIteratorDirect(this), {
38-
mapper: aCallable(mapper),
40+
mapper: mapper,
3941
inner: null
4042
});
4143
}

packages/core-js/modules/esnext.iterator.for-each.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22
var $ = require('../internals/export');
33
var iterate = require('../internals/iterate');
44
var aCallable = require('../internals/a-callable');
5+
var anObject = require('../internals/an-object');
56
var getIteratorDirect = require('../internals/get-iterator-direct');
67

78
// `Iterator.prototype.forEach` method
89
// https://github.com/tc39/proposal-iterator-helpers
910
$({ target: 'Iterator', proto: true, real: true }, {
1011
forEach: function forEach(fn) {
12+
anObject(this);
13+
aCallable(fn);
1114
var record = getIteratorDirect(this);
1215
var counter = 0;
13-
aCallable(fn);
1416
iterate(record, function (value) {
1517
fn(value, counter++);
1618
}, { IS_RECORD: true });

packages/core-js/modules/esnext.iterator.reduce.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
var $ = require('../internals/export');
33
var iterate = require('../internals/iterate');
44
var aCallable = require('../internals/a-callable');
5+
var anObject = require('../internals/an-object');
56
var getIteratorDirect = require('../internals/get-iterator-direct');
67

78
var $TypeError = TypeError;
@@ -10,8 +11,9 @@ var $TypeError = TypeError;
1011
// https://github.com/tc39/proposal-iterator-helpers
1112
$({ target: 'Iterator', proto: true, real: true }, {
1213
reduce: function reduce(reducer /* , initialValue */) {
13-
var record = getIteratorDirect(this);
14+
anObject(this);
1415
aCallable(reducer);
16+
var record = getIteratorDirect(this);
1517
var noInitial = arguments.length < 2;
1618
var accumulator = noInitial ? undefined : arguments[1];
1719
var counter = 0;

packages/core-js/modules/esnext.iterator.some.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22
var $ = require('../internals/export');
33
var iterate = require('../internals/iterate');
44
var aCallable = require('../internals/a-callable');
5+
var anObject = require('../internals/an-object');
56
var getIteratorDirect = require('../internals/get-iterator-direct');
67

78
// `Iterator.prototype.some` method
89
// https://github.com/tc39/proposal-iterator-helpers
910
$({ target: 'Iterator', proto: true, real: true }, {
1011
some: function some(predicate) {
12+
anObject(this);
13+
aCallable(predicate);
1114
var record = getIteratorDirect(this);
1215
var counter = 0;
13-
aCallable(predicate);
1416
return iterate(record, function (value, stop) {
1517
if (predicate(value, counter++)) return stop();
1618
}, { IS_RECORD: true, INTERRUPTED: true }).stopped;

packages/core-js/modules/esnext.iterator.take.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ var IteratorProxy = createIteratorProxy(function () {
2323
// https://github.com/tc39/proposal-iterator-helpers
2424
$({ target: 'Iterator', proto: true, real: true }, {
2525
take: function take(limit) {
26+
anObject(this);
27+
var remaining = toPositiveInteger(notANaN(+limit));
2628
return new IteratorProxy(getIteratorDirect(this), {
27-
remaining: toPositiveInteger(notANaN(+limit))
29+
remaining: remaining
2830
});
2931
}
3032
});

packages/core-js/modules/esnext.iterator.to-array.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22
var $ = require('../internals/export');
3+
var anObject = require('../internals/an-object');
34
var iterate = require('../internals/iterate');
45
var getIteratorDirect = require('../internals/get-iterator-direct');
56

@@ -10,7 +11,7 @@ var push = [].push;
1011
$({ target: 'Iterator', proto: true, real: true }, {
1112
toArray: function toArray() {
1213
var result = [];
13-
iterate(getIteratorDirect(this), push, { that: result, IS_RECORD: true });
14+
iterate(getIteratorDirect(anObject(this)), push, { that: result, IS_RECORD: true });
1415
return result;
1516
}
1617
});
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22
var $ = require('../internals/export');
3+
var anObject = require('../internals/an-object');
34
var AsyncFromSyncIterator = require('../internals/async-from-sync-iterator');
45
var WrapAsyncIterator = require('../internals/async-iterator-wrap');
56
var getIteratorDirect = require('../internals/get-iterator-direct');
@@ -8,6 +9,6 @@ var getIteratorDirect = require('../internals/get-iterator-direct');
89
// https://github.com/tc39/proposal-async-iterator-helpers
910
$({ target: 'Iterator', proto: true, real: true }, {
1011
toAsync: function toAsync() {
11-
return new WrapAsyncIterator(getIteratorDirect(new AsyncFromSyncIterator(getIteratorDirect(this))));
12+
return new WrapAsyncIterator(getIteratorDirect(new AsyncFromSyncIterator(getIteratorDirect(anObject(this)))));
1213
}
1314
});

0 commit comments

Comments
 (0)