| Index: src/parser.cc | 
| diff --git a/src/parser.cc b/src/parser.cc | 
| index a863165b015ac78d883a88f5ffc5bfab5e727e51..abd06591c4057e6c91e130ccee7f7d43821544da 100644 | 
| --- a/src/parser.cc | 
| +++ b/src/parser.cc | 
| @@ -1849,18 +1849,21 @@ Block* Parser::ParseVariableDeclarations(VariableDeclarationContext var_context, | 
| block->AddStatement(new(zone()) ExpressionStatement(initialize)); | 
| } | 
|  | 
| -    // Add an assignment node to the initialization statement block if | 
| -    // we still have a pending initialization value. We must distinguish | 
| -    // between variables and constants: Variable initializations are simply | 
| +    // Add an assignment node to the initialization statement block if we still | 
| +    // have a pending initialization value. We must distinguish between | 
| +    // different kinds of declarations: 'var' initializations are simply | 
| // assignments (with all the consequences if they are inside a 'with' | 
| // statement - they may change a 'with' object property). Constant | 
| // initializations always assign to the declared constant which is | 
| // always at the function scope level. This is only relevant for | 
| // dynamically looked-up variables and constants (the start context | 
| // for constant lookups is always the function context, while it is | 
| -    // the top context for variables). Sigh... | 
| +    // the top context for var declared variables). Sigh... | 
| +    // For 'let' declared variables the initialization is in the same scope | 
| +    // as the declaration. Thus dynamic lookups are unnecessary even if the | 
| +    // block scope is inside a with. | 
| if (value != NULL) { | 
| -      bool in_with = is_const ? false : inside_with(); | 
| +      bool in_with = mode == Variable::VAR ? inside_with() : false; | 
| VariableProxy* proxy = | 
| initialization_scope->NewUnresolved(name, in_with); | 
| Assignment* assignment = | 
|  |