--- old/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java 2016-03-18 16:54:29.545727364 +0100 +++ new/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java 2016-03-18 16:54:29.405727370 +0100 @@ -1761,7 +1761,7 @@ return false; } enterStatement(forNode); - if (forNode.isForIn()) { + if (forNode.isForIn() || forNode.isForOf()) { enterForIn(forNode); } else { final Expression init = forNode.getInit(); @@ -1776,7 +1776,15 @@ private void enterForIn(final ForNode forNode) { loadExpression(forNode.getModify(), TypeBounds.OBJECT); - method.invoke(forNode.isForEach() ? ScriptRuntime.TO_VALUE_ITERATOR : ScriptRuntime.TO_PROPERTY_ITERATOR); + if (forNode.isForEach()) { + method.invoke(ScriptRuntime.TO_VALUE_ITERATOR); + } else if (forNode.isForIn()) { + method.invoke(ScriptRuntime.TO_PROPERTY_ITERATOR); + } else if (forNode.isForOf()) { + method.invoke(ScriptRuntime.TO_ES6_ITERATOR); + } else { + throw new IllegalArgumentException("Unexpected for node"); + } final Symbol iterSymbol = forNode.getIterator(); final int iterSlot = iterSymbol.getSlot(Type.OBJECT); method.store(iterSymbol, ITERATOR_TYPE); @@ -3326,7 +3334,7 @@ if (needsScope && varNode.isLet()) { method.loadCompilerConstant(SCOPE); method.loadUndefined(Type.OBJECT); - final int flags = getScopeCallSiteFlags(identSymbol) | (varNode.isBlockScoped() ? CALLSITE_DECLARE : 0); + final int flags = getScopeCallSiteFlags(identSymbol) | CALLSITE_DECLARE; assert isFastScope(identSymbol); storeFastScopeVar(identSymbol, flags); }