mirror of
				https://github.com/tc39/test262.git
				synced 2025-11-03 21:24:30 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			52 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// 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');
 |