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]; |