| Index: src/parser.cc
|
| diff --git a/src/parser.cc b/src/parser.cc
|
| index 844dd7060caf334ca240c0b2f697de8883dcf894..615c6ea029a98f3e22db6737ba197ba82d60b4e9 100644
|
| --- a/src/parser.cc
|
| +++ b/src/parser.cc
|
| @@ -1609,7 +1609,13 @@ Block* Parser::ParseVariableDeclarations(VariableDeclarationContext var_context,
|
| // ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[',']
|
|
|
| Variable::Mode mode = Variable::VAR;
|
| + // True if the binding needs initialization. 'let' and 'const' declared
|
| + // bindings are created uninitialized by their declaration nodes and
|
| + // need initialization. 'var' declared bindings are always initialized
|
| + // immediately by their declaration nodes.
|
| + bool needs_init = false;
|
| bool is_const = false;
|
| + Token::Value init_op = Token::INIT_VAR;
|
| if (peek() == Token::VAR) {
|
| Consume(Token::VAR);
|
| } else if (peek() == Token::CONST) {
|
| @@ -1621,6 +1627,8 @@ Block* Parser::ParseVariableDeclarations(VariableDeclarationContext var_context,
|
| }
|
| mode = Variable::CONST;
|
| is_const = true;
|
| + needs_init = true;
|
| + init_op = Token::INIT_CONST;
|
| } else if (peek() == Token::LET) {
|
| Consume(Token::LET);
|
| if (var_context != kSourceElement &&
|
| @@ -1631,6 +1639,8 @@ Block* Parser::ParseVariableDeclarations(VariableDeclarationContext var_context,
|
| return NULL;
|
| }
|
| mode = Variable::LET;
|
| + needs_init = true;
|
| + init_op = Token::INIT_LET;
|
| } else {
|
| UNREACHABLE(); // by current callers
|
| }
|
| @@ -1732,9 +1742,8 @@ Block* Parser::ParseVariableDeclarations(VariableDeclarationContext var_context,
|
| }
|
| }
|
|
|
| - // Make sure that 'const c' actually initializes 'c' to undefined
|
| - // even though it seems like a stupid thing to do.
|
| - if (value == NULL && is_const) {
|
| + // Make sure that 'const x' and 'let x' initialize 'x' to undefined.
|
| + if (value == NULL && needs_init) {
|
| value = GetLiteralUndefined();
|
| }
|
|
|
| @@ -1822,12 +1831,11 @@ Block* Parser::ParseVariableDeclarations(VariableDeclarationContext var_context,
|
| // for constant lookups is always the function context, while it is
|
| // the top context for variables). Sigh...
|
| if (value != NULL) {
|
| - Token::Value op = (is_const ? Token::INIT_CONST : Token::INIT_VAR);
|
| bool in_with = is_const ? false : inside_with();
|
| VariableProxy* proxy =
|
| initialization_scope->NewUnresolved(name, in_with);
|
| Assignment* assignment =
|
| - new(zone()) Assignment(isolate(), op, proxy, value, position);
|
| + new(zone()) Assignment(isolate(), init_op, proxy, value, position);
|
| if (block) {
|
| block->AddStatement(new(zone()) ExpressionStatement(assignment));
|
| }
|
|
|