Review request for JDK-8151810: for-in iteration does not provide per-iteration scope

Hannes Wallnoefer hannes.wallnoefer at oracle.com
Mon Mar 21 09:23:26 UTC 2016


Please review JDK-8151810: for-in iteration does not provide 
per-iteration scope.

http://cr.openjdk.java.net/~hannesw/8151810/webrev/

This issue popped up while I was implementing ES6 for-of statement. It 
turns out that like for-of, the ES5 for-in statement needs a 
per-iteration scope when used with a lexical declaration which I oversaw 
in my initial implementation of ES6 block scope.

With normal for-statement this is pretty straightforward, because the 
spec says that values from the previous iteration are reused in the next 
iteration, which means that a const is actually a single const through 
all iterations of the loop. This means that we can simply clone the 
existing per-iteration scope at the end of the loop, which is what we do.

However, with for-in/of per iteration scopes are independent of each 
other. Therefore, something like "for (const a of [1, 2, 3]) {...}" 
actually gets a new const for each iteration. Now we could fake it and 
use a cloned scope and reset the const using some magic, but doing that 
caused all kinds of problems (weird interaction with const declaration 
logic and temporal dead zone detection, unstable scope maps etc).

So the solution I came up with is that the block that provides the scope 
for for-in statements (which is a synthetic block/block statement) 
registers its scope creator in case it has one. The for-node can then 
reuse the scope creator to create an object with the exact same property 
map and uninitialized consts/lets.

Hannes


More information about the nashorn-dev mailing list