| Index: src/parser.cc | 
| diff --git a/src/parser.cc b/src/parser.cc | 
| index ecc65301350c9e61805e5bb7ca71aae054704961..96b5d9466c380aeea747343d2e905a1716a31266 100644 | 
| --- a/src/parser.cc | 
| +++ b/src/parser.cc | 
| @@ -1998,12 +1998,14 @@ VariableProxy* Parser::NewUnresolved(const AstRawString* name, | 
|  | 
| Variable* Parser::Declare(Declaration* declaration, | 
| DeclarationDescriptor::Kind declaration_kind, | 
| -                          bool resolve, bool* ok) { | 
| +                          bool resolve, bool* ok, Scope* scope) { | 
| VariableProxy* proxy = declaration->proxy(); | 
| DCHECK(proxy->raw_name() != NULL); | 
| const AstRawString* name = proxy->raw_name(); | 
| VariableMode mode = declaration->mode(); | 
| -  Scope* declaration_scope = DeclarationScope(mode); | 
| +  if (scope == nullptr) scope = scope_; | 
| +  Scope* declaration_scope = | 
| +      IsLexicalVariableMode(mode) ? scope : scope->DeclarationScope(); | 
| Variable* var = NULL; | 
|  | 
| // If a suitable scope exists, then we can statically declare this | 
| @@ -2477,6 +2479,7 @@ void Parser::ParseVariableDeclarations(VariableDeclarationContext var_context, | 
| parsing_result->descriptor.declaration_scope = | 
| DeclarationScope(parsing_result->descriptor.mode); | 
| parsing_result->descriptor.scope = scope_; | 
| +  parsing_result->descriptor.hoist_scope = nullptr; | 
|  | 
|  | 
| bool first_declaration = true; | 
| @@ -4336,6 +4339,7 @@ Block* Parser::BuildParameterInitializationBlock( | 
| descriptor.parser = this; | 
| descriptor.declaration_scope = scope_; | 
| descriptor.scope = scope_; | 
| +    descriptor.hoist_scope = nullptr; | 
| descriptor.mode = LET; | 
| descriptor.is_const = false; | 
| descriptor.needs_init = true; | 
| @@ -4356,10 +4360,35 @@ Block* Parser::BuildParameterInitializationBlock( | 
| RelocInfo::kNoPosition); | 
| descriptor.initialization_pos = parameter.initializer->position(); | 
| } | 
| -    DeclarationParsingResult::Declaration decl( | 
| -        parameter.pattern, parameter.pattern->position(), initial_value); | 
| -    PatternRewriter::DeclareAndInitializeVariables(init_block, &descriptor, | 
| -                                                   &decl, nullptr, CHECK_OK); | 
| + | 
| +    Scope* param_scope = scope_; | 
| +    Block* param_block = init_block; | 
| +    if (parameter.initializer != nullptr && scope_->calls_sloppy_eval()) { | 
| +      param_scope = NewScope(scope_, BLOCK_SCOPE); | 
| +      param_scope->set_is_declaration_scope(); | 
| +      param_scope->set_start_position(parameter.pattern->position()); | 
| +      param_scope->set_end_position(RelocInfo::kNoPosition); | 
| +      param_scope->RecordEvalCall(); | 
| +      param_block = factory()->NewBlock(NULL, 8, true, RelocInfo::kNoPosition); | 
| +      param_block->set_scope(param_scope); | 
| +      descriptor.hoist_scope = scope_; | 
| +    } | 
| + | 
| +    { | 
| +      BlockState block_state(&scope_, param_scope); | 
| +      DeclarationParsingResult::Declaration decl( | 
| +          parameter.pattern, parameter.pattern->position(), initial_value); | 
| +      PatternRewriter::DeclareAndInitializeVariables(param_block, &descriptor, | 
| +                                                     &decl, nullptr, CHECK_OK); | 
| +    } | 
| + | 
| +    if (parameter.initializer != nullptr && scope_->calls_sloppy_eval()) { | 
| +      param_scope = param_scope->FinalizeBlockScope(); | 
| +      if (param_scope != nullptr) { | 
| +        CheckConflictingVarDeclarations(param_scope, CHECK_OK); | 
| +      } | 
| +      init_block->AddStatement(param_block, zone()); | 
| +    } | 
| } | 
| return init_block; | 
| } | 
| @@ -4393,7 +4422,7 @@ ZoneList<Statement*>* Parser::ParseEagerFunctionBody( | 
| } | 
|  | 
| ZoneList<Statement*>* body = result; | 
| -  Scope* inner_scope = nullptr; | 
| +  Scope* inner_scope = scope_; | 
| Block* inner_block = nullptr; | 
| if (!parameters.is_simple) { | 
| inner_scope = NewScope(scope_, BLOCK_SCOPE); | 
| @@ -4405,7 +4434,7 @@ ZoneList<Statement*>* Parser::ParseEagerFunctionBody( | 
| } | 
|  | 
| { | 
| -    BlockState block_state(&scope_, inner_scope ? inner_scope : scope_); | 
| +    BlockState block_state(&scope_, inner_scope); | 
|  | 
| // For generators, allocate and yield an iterator on function entry. | 
| if (IsGeneratorFunction(kind)) { | 
|  |