--- old/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java 2016-03-18 11:22:28.106479371 +0100 +++ new/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java 2016-03-18 11:22:28.022479374 +0100 @@ -1104,12 +1104,14 @@ } finally { defaultNames.pop(); } - } else if (varType == CONST) { + } else if (varType == CONST && isStatement) { throw error(AbstractParser.message("missing.const.assignment", name.getName())); } + // Only set declaration flag on lexically scoped let/const as it adds runtime overhead. + final IdentNode actualName = varType == LET || varType == CONST ? name.setIsDeclaredHere() : name; // Allocate var node. - final VarNode var = new VarNode(varLine, varToken, sourceOrder, finish, name.setIsDeclaredHere(), init, varFlags); + final VarNode var = new VarNode(varLine, varToken, sourceOrder, finish, actualName, init, varFlags); vars.add(var); appendStatement(var); @@ -1247,7 +1249,6 @@ expect(LPAREN); - switch (type) { case VAR: // Var declaration captured in for outer block.