mirror of
				https://github.com/tc39/test262.git
				synced 2025-11-04 05:33:50 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.3 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-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset
 | 
						|
description: >
 | 
						|
  If the left-hand side is not a lexical binding and the assignment produces
 | 
						|
  an error, the iterator should be closed and the error forwarded to the
 | 
						|
  runtime.
 | 
						|
info: |
 | 
						|
  ...
 | 
						|
  If destructuring is false, then
 | 
						|
    If lhsRef is an abrupt completion, then
 | 
						|
      Let status be lhsRef.
 | 
						|
    Else if lhsKind is lexicalBinding, then
 | 
						|
      Let status be InitializeReferencedBinding(lhsRef, nextValue).
 | 
						|
    Else,
 | 
						|
      Let status be PutValue(lhsRef, nextValue).
 | 
						|
  ...
 | 
						|
 | 
						|
features: [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');
 |