Skip to content

Commit cc8ca78

Browse files
committed
[Breaking] ES2018+: GetIterator, IterableToList, IteratorNext, IteratorStep, IteratorClose: use iterator records instead
1 parent 4e8d479 commit cc8ca78

File tree

12 files changed

+178
-63
lines changed

12 files changed

+178
-63
lines changed

.gitattributes

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,6 @@
273273
2018/DeletePropertyOrThrow.js spackled linguist-generated=true
274274
2018/FromPropertyDescriptor.js spackled linguist-generated=true
275275
2018/Get.js spackled linguist-generated=true
276-
2018/GetIterator.js spackled linguist-generated=true
277276
2018/GetMethod.js spackled linguist-generated=true
278277
2018/GetOwnPropertyKeys.js spackled linguist-generated=true
279278
2018/GetPrototypeFromConstructor.js spackled linguist-generated=true
@@ -296,11 +295,7 @@
296295
2018/IsPromise.js spackled linguist-generated=true
297296
2018/IsPropertyKey.js spackled linguist-generated=true
298297
2018/IsRegExp.js spackled linguist-generated=true
299-
2018/IterableToList.js spackled linguist-generated=true
300-
2018/IteratorClose.js spackled linguist-generated=true
301298
2018/IteratorComplete.js spackled linguist-generated=true
302-
2018/IteratorNext.js spackled linguist-generated=true
303-
2018/IteratorStep.js spackled linguist-generated=true
304299
2018/IteratorValue.js spackled linguist-generated=true
305300
2018/MakeDate.js spackled linguist-generated=true
306301
2018/MakeDay.js spackled linguist-generated=true

2018/GetIterator.js

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,69 @@
22

33
var GetIntrinsic = require('../GetIntrinsic');
44

5+
var $asyncIterator = GetIntrinsic('%Symbol.asyncIterator%', true);
6+
var $SyntaxError = GetIntrinsic('%SyntaxError%');
57
var $TypeError = GetIntrinsic('%TypeError%');
68

79
var getIteratorMethod = require('../helpers/getIteratorMethod');
810
var AdvanceStringIndex = require('./AdvanceStringIndex');
911
var Call = require('./Call');
12+
var CreateAsyncFromSyncIterator = require('./CreateAsyncFromSyncIterator');
1013
var GetMethod = require('./GetMethod');
14+
var GetV = require('./GetV');
1115
var IsArray = require('./IsArray');
1216
var Type = require('./Type');
1317

1418
// https://ecma-international.org/ecma-262/6.0/#sec-getiterator
1519

16-
module.exports = function GetIterator(obj, method) {
17-
var actualMethod = method;
18-
if (arguments.length < 2) {
19-
actualMethod = getIteratorMethod(
20-
{
21-
AdvanceStringIndex: AdvanceStringIndex,
22-
GetMethod: GetMethod,
23-
IsArray: IsArray,
24-
Type: Type
25-
},
26-
obj
27-
);
20+
module.exports = function GetIterator(obj) {
21+
var hint = arguments.length > 1 ? arguments[1] : 'sync';
22+
if (hint !== 'sync' && hint !== 'async') {
23+
throw new $TypeError('Assertion failed: `hint` must be either ~sync~ or ~async~');
2824
}
29-
var iterator = Call(actualMethod, obj);
25+
var method;
26+
if (arguments.length < 3) {
27+
if (hint === 'async') {
28+
if (!$asyncIterator) {
29+
method = GetMethod(obj, $asyncIterator);
30+
}
31+
if (typeof method !== 'undefined') {
32+
var syncMethod = getIteratorMethod(
33+
{
34+
AdvanceStringIndex: AdvanceStringIndex,
35+
GetMethod: GetMethod,
36+
IsArray: IsArray,
37+
Type: Type
38+
},
39+
obj
40+
);
41+
var syncIteratorRecord = GetIterator(obj, 'sync', syncMethod);
42+
return CreateAsyncFromSyncIterator(syncIteratorRecord);
43+
}
44+
} else {
45+
method = getIteratorMethod(
46+
{
47+
AdvanceStringIndex: AdvanceStringIndex,
48+
GetMethod: GetMethod,
49+
IsArray: IsArray,
50+
Type: Type
51+
},
52+
obj
53+
);
54+
}
55+
}
56+
var iterator = Call(method, obj);
3057
if (Type(iterator) !== 'Object') {
3158
throw new $TypeError('iterator must return an object');
3259
}
3360

34-
return iterator;
61+
var nextMethod = GetV(iterator, 'next');
62+
63+
var iteratorRecord = {
64+
'[[Iterator]]': iterator,
65+
'[[NextMethod]]': nextMethod,
66+
'[[Done]]': false
67+
};
68+
69+
return iteratorRecord;
3570
};

2018/IterableToList.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ var GetIterator = require('./GetIterator');
77
var IteratorStep = require('./IteratorStep');
88
var IteratorValue = require('./IteratorValue');
99

10-
// https://www.ecma-international.org/ecma-262/8.0/#sec-iterabletolist
10+
// https://www.ecma-international.org/ecma-262/9.0/#sec-iterabletolist
1111

1212
module.exports = function IterableToList(items, method) {
13-
var iterator = GetIterator(items, method);
13+
var iteratorRecord = GetIterator(items, 'sync', method);
1414
var values = [];
1515
var next = true;
1616
while (next) {
17-
next = IteratorStep(iterator);
17+
next = IteratorStep(iteratorRecord);
1818
if (next) {
1919
var nextValue = IteratorValue(next);
2020
$arrayPush(values, nextValue);

2018/IteratorClose.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,18 @@ var GetMethod = require('./GetMethod');
99
var IsCallable = require('./IsCallable');
1010
var Type = require('./Type');
1111

12-
// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
12+
// https://ecma-international.org/ecma-262/9.0/#sec-iteratorclose
1313

14-
module.exports = function IteratorClose(iterator, completion) {
15-
if (Type(iterator) !== 'Object') {
14+
module.exports = function IteratorClose(iteratorRecord, completion) {
15+
if (Type(iteratorRecord['[[Iterator]]']) !== 'Object') {
1616
throw new $TypeError('Assertion failed: Type(iterator) is not Object');
1717
}
1818
if (!IsCallable(completion)) {
1919
throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
2020
}
2121
var completionThunk = completion;
2222

23+
var iterator = iteratorRecord['[[Iterator]]'];
2324
var iteratorReturn = GetMethod(iterator, 'return');
2425

2526
if (typeof iteratorReturn === 'undefined') {

2018/IteratorNext.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,19 @@ var GetIntrinsic = require('../GetIntrinsic');
44

55
var $TypeError = GetIntrinsic('%TypeError%');
66

7-
var Invoke = require('./Invoke');
7+
var Call = require('./Call');
88
var Type = require('./Type');
99

10-
// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
10+
// https://ecma-international.org/ecma-262/9.0/#sec-iteratornext
1111

12-
module.exports = function IteratorNext(iterator, value) {
13-
var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
12+
module.exports = function IteratorNext(iteratorRecord) {
13+
var value;
14+
if (arguments.length > 1) {
15+
value = arguments[1];
16+
}
17+
var result = arguments.length < 2
18+
? Call(iteratorRecord['[[NextMethod]]'], iteratorRecord['[[Iterator]]'], [])
19+
: Call(iteratorRecord['[[NextMethod]]'], iteratorRecord['[[Iterator]]'], [value]);
1420
if (Type(result) !== 'Object') {
1521
throw new $TypeError('iterator next must return an object');
1622
}

2018/IteratorStep.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33
var IteratorComplete = require('./IteratorComplete');
44
var IteratorNext = require('./IteratorNext');
55

6-
// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
6+
// https://ecma-international.org/ecma-262/9.0/#sec-iteratorstep
77

8-
module.exports = function IteratorStep(iterator) {
9-
var result = IteratorNext(iterator);
8+
module.exports = function IteratorStep(iteratorRecord) {
9+
var result = IteratorNext(iteratorRecord);
1010
var done = IteratorComplete(result);
1111
return done === true ? false : result;
1212
};
13-

2019/GetIterator.js

Lines changed: 45 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2019/IterableToList.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2019/IteratorClose.js

Lines changed: 4 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2019/IteratorNext.js

Lines changed: 10 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)