Just a minor thing: consider if it’d make sense to move most of 
CodeGenerator.providesScopeCreator it’d into a method on the Block (all parts 
of the expression except for _es6 env check). Looking at 
CodeGenerator.providesScopeCreator it’s doing an awful lot of “block.” this and 
“block.” that.

Other than that, +1.

Attila.


> On Mar 21, 2016, at 10:23 AM, Hannes Wallnoefer 
> <hannes.wallnoe...@oracle.com> wrote:
> 
> 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

Reply via email to