diff options
Diffstat (limited to '')
-rw-r--r-- | js/src/tests/test262/language/statements/for-of/body-dstr-assign-error.js | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/js/src/tests/test262/language/statements/for-of/body-dstr-assign-error.js b/js/src/tests/test262/language/statements/for-of/body-dstr-assign-error.js new file mode 100644 index 0000000000..f9a4dfd242 --- /dev/null +++ b/js/src/tests/test262/language/statements/for-of/body-dstr-assign-error.js @@ -0,0 +1,53 @@ +// Copyright (C) 2015 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind +description: > + If the left-hand side requires a DestructuringAssignment operation and that + operation produces an error, the iterator should be closed and the error + forwarded to the runtime. +info: | + ... + Else, + If lhsKind is assignment, then + Let status be the result of performing DestructuringAssignmentEvaluation of + assignmentPattern using nextValue as the argument. + ... + If status is an abrupt completion, then + Set the running execution context's LexicalEnvironment to oldEnv. + If iterationKind is enumerate, then + Return status. + +features: [destructuring-assignment, for-of, Symbol.iterator] +---*/ + +var callCount = 0; +var iterationCount = 0; +var iterable = {}; +var x = { + set attr(_) { + throw new Test262Error(); + } +}; + +iterable[Symbol.iterator] = function() { + return { + next: function() { + return { done: false, value: [0] }; + }, + return: function() { + callCount += 1; + } + } +}; + +assert.throws(Test262Error, function() { + for ([x.attr] of iterable) { + iterationCount += 1; + } +}); + +assert.sameValue(iterationCount, 0, 'The loop body is not evaluated'); +assert.sameValue(callCount, 1, 'Iterator is closed'); + +reportCompare(0, 0); |