mirror of
https://github.com/tc39/test262.git
synced 2025-09-27 03:58:45 +02:00
The files in this patch are organized according to the following naming scheme: Prefix | Grammar production -------------------|------------------- `array-empty-` | ArrayAssignmentPattern : [ ] `array-elision-` | ArrayAssignmentPattern : [ Elision ] `array-rest-` | ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ] `array-elem-` | ArrayAssignmentPattern : [ AssignmentElementList ] `array-elem-trlg-` | ArrayAssignmentPattern : [ AssignmentElementList , Elisionopt AssignmentRestElementopt ] Suffix | Intent -------------------|------- `-abpt-close-err` | The assignment evaluation returns an abrupt completion, and the iterator's `return` method throws an error `-abpt-close-skip` | The assignment evaluation returns an abrupt completion, but IteratorClose is not invoked `-abpt-close` | The assignment evaluation returns an abrupt completion, and IteratorClose is invoked as specified `-get-err` | Abrupt completion returned from GetIterator `-nrml-close-err` | The assignment evaluation completes, and the iterator's `return` method throws an error `-nrml-close-null` | The assignment evaluation completes, and the iterator's `return` method returns a non-Object value (there is no corresponding `-abpt-` suffix because the algorithm does not reference the return value in those cases) `-nrml-close-skip` | The assignment evaluation completes, but IteratorClose is not invoked `-nrml-close` | The assignment evaluation completes, and IteratorClose is invoked as specified Not all suffixes are appropriate for all productions. Suffixes have been simplified in cases where less specificity is necessary to disambiguate test cases.
63 lines
1.8 KiB
JavaScript
63 lines
1.8 KiB
JavaScript
// Copyright (C) 2016 the V8 project authors. All rights reserved.
|
|
// This code is governed by the BSD license found in the LICENSE file.
|
|
/*---
|
|
description: >
|
|
IteratorClose is invoked when evaluation of AssignmentElementList returns
|
|
a "throw" completion and the iterator has not been marked as "done"
|
|
info: |
|
|
ArrayAssignmentPattern :
|
|
[ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
|
|
|
|
[...]
|
|
3. Let iteratorRecord be Record {[[iterator]]: iterator, [[done]]: false}.
|
|
4. Let status be the result of performing
|
|
IteratorDestructuringAssignmentEvaluation of AssignmentElementList using
|
|
iteratorRecord as the argument.
|
|
5. If status is an abrupt completion, then
|
|
a. If iteratorRecord.[[done]] is false, return IteratorClose(iterator,
|
|
status).
|
|
b. Return Completion(status).
|
|
|
|
7.4.6 IteratorClose( iterator, completion )
|
|
|
|
[...]
|
|
6. Let innerResult be Call(return, iterator, « »).
|
|
[...]
|
|
features: [Symbol.iterator]
|
|
es6id: 12.14.5.2
|
|
esid: sec-runtime-semantics-destructuringassignmentevaluation
|
|
---*/
|
|
|
|
var nextCount = 0;
|
|
var returnCount = 0;
|
|
var thisValue = null;
|
|
var args = null;
|
|
var iterable = {};
|
|
var thrower = function() {
|
|
throw new Test262Error();
|
|
};
|
|
var iterator = {
|
|
next: function() {
|
|
nextCount += 1;
|
|
return { done: true };
|
|
},
|
|
return: function() {
|
|
returnCount += 1;
|
|
thisValue = this;
|
|
args = arguments;
|
|
}
|
|
};
|
|
iterable[Symbol.iterator] = function() {
|
|
return iterator;
|
|
};
|
|
|
|
assert.throws(Test262Error, function() {
|
|
[ {}[thrower()] , ] = iterable;
|
|
});
|
|
|
|
assert.sameValue(nextCount, 0);
|
|
assert.sameValue(returnCount, 1);
|
|
assert.sameValue(thisValue, iterator, 'correct `this` value');
|
|
assert(!!args, 'arguments object provided');
|
|
assert.sameValue(args.length, 0, 'zero arguments specified');
|