Chromium Code Reviews| Index: src/parsing/parser.cc |
| diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
| index 12666fe8ef4fe5ecbe715897dc6de69ff7644816..d1ea614b56ad75107d8990c714c021bf40ed3005 100644 |
| --- a/src/parsing/parser.cc |
| +++ b/src/parsing/parser.cc |
| @@ -1261,7 +1261,7 @@ Statement* Parser::ParseStatementListItem(bool* ok) { |
| default: |
| break; |
| } |
| - return ParseStatement(NULL, ok); |
| + return ParseStatement(NULL, kAllowLabelledFunctionStatement, ok); |
| } |
| @@ -1711,9 +1711,10 @@ Statement* Parser::ParseExportDeclaration(bool* ok) { |
| return result; |
| } |
| - |
| -Statement* Parser::ParseStatement(ZoneList<const AstRawString*>* labels, |
| - bool* ok) { |
| +Statement* Parser::ParseStatement( |
| + ZoneList<const AstRawString*>* labels, |
| + AllowLabelledFunctionStatement allow_labelled_function_statement, |
| + bool* ok) { |
| // Statement :: |
| // EmptyStatement |
| // ... |
| @@ -1722,12 +1723,13 @@ Statement* Parser::ParseStatement(ZoneList<const AstRawString*>* labels, |
| Next(); |
| return factory()->NewEmptyStatement(RelocInfo::kNoPosition); |
| } |
| - return ParseSubStatement(labels, ok); |
| + return ParseSubStatement(labels, allow_labelled_function_statement, ok); |
| } |
| - |
| -Statement* Parser::ParseSubStatement(ZoneList<const AstRawString*>* labels, |
| - bool* ok) { |
| +Statement* Parser::ParseSubStatement( |
| + ZoneList<const AstRawString*>* labels, |
| + AllowLabelledFunctionStatement allow_labelled_function_statement, |
| + bool* ok) { |
| // Statement :: |
| // Block |
| // VariableStatement |
| @@ -1825,7 +1827,8 @@ Statement* Parser::ParseSubStatement(ZoneList<const AstRawString*>* labels, |
| // Fall through. |
| default: |
| - return ParseExpressionOrLabelledStatement(labels, ok); |
| + return ParseExpressionOrLabelledStatement( |
| + labels, allow_labelled_function_statement, ok); |
| } |
| } |
| @@ -2426,9 +2429,10 @@ static bool ContainsLabel(ZoneList<const AstRawString*>* labels, |
| return false; |
| } |
| - |
| Statement* Parser::ParseExpressionOrLabelledStatement( |
| - ZoneList<const AstRawString*>* labels, bool* ok) { |
| + ZoneList<const AstRawString*>* labels, |
| + AllowLabelledFunctionStatement allow_labelled_function_statement, |
|
adamk
2016/03/24 01:15:52
How about "allow_function" for this name (here and
|
| + bool* ok) { |
| // ExpressionStatement | LabelledStatement :: |
| // Expression ';' |
| // Identifier ':' Statement |
| @@ -2481,9 +2485,14 @@ Statement* Parser::ParseExpressionOrLabelledStatement( |
| Expect(Token::COLON, CHECK_OK); |
| // ES#sec-labelled-function-declarations Labelled Function Declarations |
| if (peek() == Token::FUNCTION && is_sloppy(language_mode())) { |
| - return ParseFunctionDeclaration(labels, ok); |
| + if (allow_labelled_function_statement == |
| + kAllowLabelledFunctionStatement) { |
| + return ParseFunctionDeclaration(labels, ok); |
| + } else { |
| + return ParseScopedStatement(labels, true, ok); |
| + } |
| } |
| - return ParseStatement(labels, ok); |
| + return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok); |
| } |
| // If we have an extension, we allow a native function declaration. |
| @@ -3471,7 +3480,7 @@ Statement* Parser::ParseScopedStatement(ZoneList<const AstRawString*>* labels, |
| bool legacy, bool* ok) { |
| if (is_strict(language_mode()) || peek() != Token::FUNCTION || |
| (legacy && allow_harmony_restrictive_declarations())) { |
| - return ParseSubStatement(labels, ok); |
| + return ParseSubStatement(labels, kDisallowLabelledFunctionStatement, ok); |
| } else { |
| if (legacy) { |
| ++use_counts_[v8::Isolate::kLegacyFunctionDeclaration]; |