for-of loops, IteratorClose and the rest of the iterations in the spec

Andreas Rossberg rossberg at
Wed Sep 10 07:53:02 PDT 2014

On 10 September 2014 16:45, Erik Arvidsson <erik.arvidsson at> wrote:
> For or loops are spec'ed to call the internal spec function, IteratorClose
> when there is an abrupt completion in the loop body (an exception was
> thrown, return and break)
> The point of this was to allow cleaning up the iterator in case it holds on
> to some kind of resource.
> The problem is that none of the other iterations in the spec calls
> IteratorClose. For example,
> ```js
> class MySet extends Set {
>   add(v) {
>     if (valueNoGood(v)) throw new NoGoodError();
>     return super(v);
>   }
> }
> new MySet(new ReadLines('~/test.txt'));
> ```
> In the above code `ReadLines.prototype.return` is never called, defeating
> the whole purpose of adding return hooks to for-of.
> I see two options here.
> 1. Add IteratorClose to all places in the spec where we use iterators.
> 2. Remove IteratorClose from for-of loops.
> I know we talked about this before on several occasions but I'm still
> unhappy with the current state.

I concur. In particular, it should be possible to implement (the
equivalent of) various library functions consuming iterables with
for-of. Otherwise, we will likely enter a world with unpredictable
discrepancies between ES library functions and user-provided ones.


More information about the es-discuss mailing list