mirror of
https://github.com/tc39/test262.git
synced 2025-07-31 01:44:54 +02:00
https://github.com/tc39/ecma262/pull/988 changes the iteration protocol such that the "next" method is only loaded from the iterator object once during the prologue of iteration, rather than during each step.
42 lines
1.0 KiB
JavaScript
42 lines
1.0 KiB
JavaScript
// Copyright (C) 2013 the V8 project authors. All rights reserved.
|
|
// This code is governed by the BSD license found in the LICENSE file.
|
|
/*---
|
|
esid: sec-getiterator
|
|
description: >
|
|
The iterator's `next` method should be accessed only once with each
|
|
iteration as per the `GetIterator` abstract operation (7.4.1).
|
|
features: [Symbol.iterator, for-of]
|
|
---*/
|
|
|
|
var iterable = {};
|
|
var iterator = {};
|
|
var iterationCount = 0;
|
|
var loadNextCount = 0;
|
|
|
|
iterable[Symbol.iterator] = function() {
|
|
return iterator;
|
|
};
|
|
|
|
function next() {
|
|
if (iterationCount) return { done: true };
|
|
return { value: 45, done: false };
|
|
}
|
|
Object.defineProperty(iterator, 'next', {
|
|
get() { loadNextCount++; return next; },
|
|
configurable: true
|
|
});
|
|
|
|
for (var x of iterable) {
|
|
assert.sameValue(x, 45);
|
|
|
|
Object.defineProperty(iterator, 'next', {
|
|
get: function() {
|
|
throw new Test262Error(
|
|
'Should not access the `next` method after the iteration prologue.');
|
|
}
|
|
});
|
|
iterationCount++;
|
|
}
|
|
assert.sameValue(iterationCount, 1);
|
|
assert.sameValue(loadNextCount, 1);
|