| Index: src/parser.h | 
| diff --git a/src/parser.h b/src/parser.h | 
| index 39d0d9278b132fd4dfc5a9ebd104661f1f846205..78f2176cae9cf01d838e60a8eac824111e1630ee 100644 | 
| --- a/src/parser.h | 
| +++ b/src/parser.h | 
| @@ -751,6 +751,10 @@ class ParserTraits { | 
| ZoneList<v8::internal::Statement*>* NewStatementList(int size, Zone* zone) { | 
| return new(zone) ZoneList<v8::internal::Statement*>(size, zone); | 
| } | 
| + | 
| +  V8_INLINE void AddParameterInitializationBlock( | 
| +      ZoneList<v8::internal::Statement*>* body, bool* ok); | 
| + | 
| V8_INLINE Scope* NewScope(Scope* parent_scope, ScopeType scope_type, | 
| FunctionKind kind = kNormalFunction); | 
|  | 
| @@ -1121,6 +1125,8 @@ class Parser : public ParserBase<ParserTraits> { | 
| PreParser::PreParseResult ParseLazyFunctionBodyWithPreParser( | 
| SingletonLogger* logger, Scanner::BookmarkScope* bookmark = nullptr); | 
|  | 
| +  Block* BuildParameterInitializationBlock(bool* ok); | 
| + | 
| // Consumes the ending }. | 
| ZoneList<Statement*>* ParseEagerFunctionBody( | 
| const AstRawString* function_name, int pos, Variable* fvar, | 
| @@ -1274,13 +1280,14 @@ void ParserTraits::DeclareFormalParameter(Scope* scope, Expression* pattern, | 
| ExpressionClassifier* classifier, | 
| bool is_rest) { | 
| bool is_duplicate = false; | 
| -  if (!pattern->IsVariableProxy()) { | 
| -    // TODO(dslomov): implement. | 
| -    DCHECK(parser_->allow_harmony_destructuring()); | 
| -    return; | 
| -  } | 
| -  auto name = pattern->AsVariableProxy()->raw_name(); | 
| -  Variable* var = scope->DeclareParameter(name, VAR, is_rest, &is_duplicate); | 
| +  bool is_simple_name = pattern->IsVariableProxy(); | 
| +  DCHECK(parser_->allow_harmony_destructuring() || is_simple_name); | 
| + | 
| +  const AstRawString* name = is_simple_name | 
| +                                 ? pattern->AsVariableProxy()->raw_name() | 
| +                                 : parser_->ast_value_factory()->empty_string(); | 
| +  Variable* var = scope->DeclareParameter( | 
| +      name, is_simple_name ? nullptr : pattern, VAR, is_rest, &is_duplicate); | 
| if (is_sloppy(scope->language_mode())) { | 
| // TODO(sigurds) Mark every parameter as maybe assigned. This is a | 
| // conservative approximation necessary to account for parameters | 
| @@ -1292,6 +1299,16 @@ void ParserTraits::DeclareFormalParameter(Scope* scope, Expression* pattern, | 
| parser_->scanner()->location()); | 
| } | 
| } | 
| + | 
| + | 
| +void ParserTraits::AddParameterInitializationBlock( | 
| +    ZoneList<v8::internal::Statement*>* body, bool* ok) { | 
| +  auto* init_block = parser_->BuildParameterInitializationBlock(ok); | 
| +  if (!*ok) return; | 
| +  if (init_block != nullptr) { | 
| +    body->Add(init_block, parser_->zone()); | 
| +  } | 
| +} | 
| } }  // namespace v8::internal | 
|  | 
| #endif  // V8_PARSER_H_ | 
|  |