// Copyright (C) 2020 Alexey Shvayka. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-iteratorclose description: > If retrieving an iterator's `return` method generates an error while closing the iterator with non-throw completion, the error should be forwarded to the runtime. info: | IteratorClose ( iteratorRecord, completion ) [...] 4. Let innerResult be GetMethod(iterator, "return"). 5. If innerResult.[[Type]] is normal, [...] 6. If completion.[[Type]] is throw, return Completion(completion). 7. If innerResult.[[Type]] is throw, return Completion(innerResult). GetMethod ( V, P ) [...] 2. Let func be ? GetV(V, P). 3. If func is either undefined or null, return undefined. 4. If IsCallable(func) is false, throw a TypeError exception. features: [Symbol.iterator] ---*/ var iterable = {}; var iterationCount = 0; iterable[Symbol.iterator] = function() { return { next: function() { return { done: false, value: null }; }, return: 1, }; }; assert.throws(TypeError, function() { for (var x of iterable) { iterationCount += 1; break; } }); assert.sameValue(iterationCount, 1, 'The loop body is evaluated'); reportCompare(0, 0);