Index: src/parsing/parser.cc |
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
index 82baee0f6ab3ade75be6643d44e6673bb75d9131..d926e92d770079fd24f5feefb3f67d4968d06672 100644 |
--- a/src/parsing/parser.cc |
+++ b/src/parsing/parser.cc |
@@ -1063,7 +1063,7 @@ FunctionLiteral* Parser::ParseLazy(Isolate* isolate, ParseInfo* info, |
SetLanguageMode(scope, shared_info->language_mode()); |
scope->set_start_position(shared_info->start_position()); |
- ExpressionClassifier formals_classifier; |
+ ExpressionClassifier formals_classifier(this); |
ParserFormalParameters formals(scope); |
Checkpoint checkpoint(this); |
{ |
@@ -1605,9 +1605,9 @@ Statement* Parser::ParseExportDefault(bool* ok) { |
default: { |
int pos = peek_position(); |
- ExpressionClassifier classifier; |
+ ExpressionClassifier classifier(this); |
Expression* expr = ParseAssignmentExpression(true, &classifier, CHECK_OK); |
- expr = ParserTraits::RewriteNonPattern(expr, &classifier, CHECK_OK); |
+ RewriteNonPattern(&classifier, CHECK_OK); |
ExpectSemicolon(CHECK_OK); |
result = factory()->NewExpressionStatement(expr, pos); |
@@ -2377,7 +2377,7 @@ Block* Parser::ParseVariableDeclarations( |
Expression* pattern; |
int decl_pos = peek_position(); |
{ |
- ExpressionClassifier pattern_classifier; |
+ ExpressionClassifier pattern_classifier(this); |
Token::Value next = peek(); |
pattern = ParsePrimaryExpression(&pattern_classifier, CHECK_OK); |
ValidateBindingPattern(&pattern_classifier, CHECK_OK); |
@@ -2402,10 +2402,10 @@ Block* Parser::ParseVariableDeclarations( |
Expression* value = NULL; |
int initializer_position = RelocInfo::kNoPosition; |
if (Check(Token::ASSIGN)) { |
- ExpressionClassifier classifier; |
+ ExpressionClassifier classifier(this); |
value = ParseAssignmentExpression(var_context != kForStatement, |
&classifier, CHECK_OK); |
- value = ParserTraits::RewriteNonPattern(value, &classifier, CHECK_OK); |
+ RewriteNonPattern(&classifier, CHECK_OK); |
variable_loc.end_pos = scanner()->location().end_pos; |
if (!parsing_result->first_initializer_loc.IsValid()) { |
@@ -2521,13 +2521,13 @@ Statement* Parser::ParseExpressionOrLabelledStatement( |
IsClassConstructor(function_state_->kind())) { |
bool is_this = peek() == Token::THIS; |
Expression* expr; |
- ExpressionClassifier classifier; |
+ ExpressionClassifier classifier(this); |
if (is_this) { |
expr = ParseStrongInitializationExpression(&classifier, CHECK_OK); |
} else { |
expr = ParseStrongSuperCallExpression(&classifier, CHECK_OK); |
} |
- expr = ParserTraits::RewriteNonPattern(expr, &classifier, CHECK_OK); |
+ RewriteNonPattern(&classifier, CHECK_OK); |
switch (peek()) { |
case Token::SEMICOLON: |
Consume(Token::SEMICOLON); |
@@ -3060,7 +3060,7 @@ TryStatement* Parser::ParseTryStatement(bool* ok) { |
catch_scope = NewScope(scope_, CATCH_SCOPE); |
catch_scope->set_start_position(scanner()->location().beg_pos); |
- ExpressionClassifier pattern_classifier; |
+ ExpressionClassifier pattern_classifier(this); |
Expression* pattern = ParsePrimaryExpression(&pattern_classifier, CHECK_OK); |
ValidateBindingPattern(&pattern_classifier, CHECK_OK); |
@@ -3690,10 +3690,9 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
Expression* enumerable; |
if (mode == ForEachStatement::ITERATE) { |
- ExpressionClassifier classifier; |
+ ExpressionClassifier classifier(this); |
enumerable = ParseAssignmentExpression(true, &classifier, CHECK_OK); |
- enumerable = ParserTraits::RewriteNonPattern(enumerable, &classifier, |
- CHECK_OK); |
+ RewriteNonPattern(&classifier, CHECK_OK); |
} else { |
enumerable = ParseExpression(true, CHECK_OK); |
} |
@@ -3783,7 +3782,7 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
} |
} else { |
int lhs_beg_pos = peek_position(); |
- ExpressionClassifier classifier; |
+ ExpressionClassifier classifier(this); |
Expression* expression = ParseExpression(false, &classifier, CHECK_OK); |
int lhs_end_pos = scanner()->location().end_pos; |
ForEachStatement::VisitMode mode; |
@@ -3801,8 +3800,7 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
if (is_destructuring) { |
ValidateAssignmentPattern(&classifier, CHECK_OK); |
} else { |
- expression = |
- ParserTraits::RewriteNonPattern(expression, &classifier, CHECK_OK); |
+ RewriteNonPattern(&classifier, CHECK_OK); |
} |
if (is_for_each) { |
@@ -3818,10 +3816,9 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels, |
Expression* enumerable; |
if (mode == ForEachStatement::ITERATE) { |
- ExpressionClassifier classifier; |
+ ExpressionClassifier classifier(this); |
enumerable = ParseAssignmentExpression(true, &classifier, CHECK_OK); |
- enumerable = ParserTraits::RewriteNonPattern(enumerable, &classifier, |
- CHECK_OK); |
+ RewriteNonPattern(&classifier, CHECK_OK); |
} else { |
enumerable = ParseExpression(true, CHECK_OK); |
} |
@@ -4113,7 +4110,7 @@ void ParserTraits::ParseArrowFunctionFormalParameterList( |
ParseArrowFunctionFormalParameters(parameters, expr, params_loc, ok); |
if (!*ok) return; |
- ExpressionClassifier classifier; |
+ Type::ExpressionClassifier classifier(parser_); |
if (!parameters->is_simple) { |
classifier.RecordNonSimpleParameter(); |
} |
@@ -4214,17 +4211,18 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
int materialized_literal_count = -1; |
int expected_property_count = -1; |
DuplicateFinder duplicate_finder(scanner()->unicode_cache()); |
- ExpressionClassifier formals_classifier(&duplicate_finder); |
FunctionLiteral::EagerCompileHint eager_compile_hint = |
parenthesized_function_ ? FunctionLiteral::kShouldEagerCompile |
: FunctionLiteral::kShouldLazyCompile; |
bool should_be_used_once_hint = false; |
+ bool has_duplicate_parameters; |
// Parse function. |
{ |
AstNodeFactory function_factory(ast_value_factory()); |
FunctionState function_state(&function_state_, &scope_, scope, kind, |
&function_factory); |
scope_->SetScopeName(function_name); |
+ ExpressionClassifier formals_classifier(this, &duplicate_finder); |
if (is_generator) { |
// For generators, allocating variables in contexts is currently a win |
@@ -4402,10 +4400,10 @@ FunctionLiteral* Parser::ParseFunctionLiteral( |
// If body can be inspected, rewrite queued destructuring assignments |
ParserTraits::RewriteDestructuringAssignments(); |
} |
+ has_duplicate_parameters = |
+ !formals_classifier.is_valid_formal_parameter_list_without_duplicates(); |
} |
- bool has_duplicate_parameters = |
- !formals_classifier.is_valid_formal_parameter_list_without_duplicates(); |
FunctionLiteral::ParameterFlag duplicate_parameters = |
has_duplicate_parameters ? FunctionLiteral::kHasDuplicateParameters |
: FunctionLiteral::kNoDuplicateParameters; |
@@ -4539,8 +4537,7 @@ class InitializerRewriter : public AstExpressionVisitor { |
private: |
void VisitExpression(Expression* expr) { |
- RewritableAssignmentExpression* to_rewrite = |
- expr->AsRewritableAssignmentExpression(); |
+ RewritableExpression* to_rewrite = expr->AsRewritableExpression(); |
if (to_rewrite == nullptr || to_rewrite->is_rewritten()) return; |
Parser::PatternRewriter::RewriteDestructuringAssignment(parser_, to_rewrite, |
@@ -4882,9 +4879,9 @@ ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, |
Expression* extends = NULL; |
if (Check(Token::EXTENDS)) { |
block_scope->set_start_position(scanner()->location().end_pos); |
- ExpressionClassifier classifier; |
+ ExpressionClassifier classifier(this); |
extends = ParseLeftHandSideExpression(&classifier, CHECK_OK); |
- extends = ParserTraits::RewriteNonPattern(extends, &classifier, CHECK_OK); |
+ RewriteNonPattern(&classifier, CHECK_OK); |
} else { |
block_scope->set_start_position(scanner()->location().end_pos); |
} |
@@ -4905,13 +4902,12 @@ ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, |
const bool is_static = false; |
bool is_computed_name = false; // Classes do not care about computed |
// property names here. |
- ExpressionClassifier classifier; |
+ ExpressionClassifier classifier(this); |
const AstRawString* property_name = nullptr; |
ObjectLiteral::Property* property = ParsePropertyDefinition( |
&checker, in_class, has_extends, is_static, &is_computed_name, |
&has_seen_constructor, &classifier, &property_name, CHECK_OK); |
- property = ParserTraits::RewriteNonPatternObjectLiteralProperty( |
- property, &classifier, CHECK_OK); |
+ RewriteNonPattern(&classifier, CHECK_OK); |
if (has_seen_constructor && constructor == NULL) { |
constructor = GetPropertyValue(property)->AsFunctionLiteral(); |
@@ -4962,7 +4958,7 @@ Expression* Parser::ParseV8Intrinsic(bool* ok) { |
const AstRawString* name = ParseIdentifier(kAllowRestrictedIdentifiers, |
CHECK_OK); |
Scanner::Location spread_pos; |
- ExpressionClassifier classifier; |
+ ExpressionClassifier classifier(this); |
ZoneList<Expression*>* args = |
ParseArguments(&spread_pos, &classifier, CHECK_OK); |
@@ -5533,17 +5529,19 @@ void ParserTraits::RewriteDestructuringAssignments() { |
} |
-Expression* ParserTraits::RewriteNonPattern( |
- Expression* expr, const ExpressionClassifier* classifier, bool* ok) { |
- return parser_->RewriteNonPattern(expr, classifier, ok); |
+void ParserTraits::RewriteNonPattern(Type::ExpressionClassifier* classifier, |
+ bool* ok) { |
+ parser_->RewriteNonPattern(classifier, ok); |
} |
-ObjectLiteralProperty* ParserTraits::RewriteNonPatternObjectLiteralProperty( |
- ObjectLiteralProperty* property, const ExpressionClassifier* classifier, |
- bool* ok) { |
- return parser_->RewriteNonPatternObjectLiteralProperty(property, classifier, |
- ok); |
+Zone* ParserTraits::zone() const { |
+ return parser_->function_state_->scope()->zone(); |
+} |
+ |
+ |
+ZoneList<Expression*>* ParserTraits::GetNonPatternList() const { |
+ return parser_->function_state_->non_patterns_to_rewrite(); |
} |
@@ -5555,6 +5553,7 @@ class NonPatternRewriter : public AstExpressionRewriter { |
private: |
bool RewriteExpression(Expression* expr) override { |
+ if (expr->IsRewritableExpression()) return true; |
// Rewrite only what could have been a pattern but is not. |
if (expr->IsArrayLiteral()) { |
// Spread rewriting in array literals. |
@@ -5584,45 +5583,37 @@ class NonPatternRewriter : public AstExpressionRewriter { |
}; |
-Expression* Parser::RewriteNonPattern(Expression* expr, |
- const ExpressionClassifier* classifier, |
- bool* ok) { |
+void Parser::RewriteNonPattern(ExpressionClassifier* classifier, bool* ok) { |
ValidateExpression(classifier, ok); |
- if (!*ok) return expr; |
- NonPatternRewriter rewriter(stack_limit_, this); |
- Expression* result = reinterpret_cast<Expression*>(rewriter.Rewrite(expr)); |
- DCHECK_NOT_NULL(result); |
- return result; |
-} |
- |
- |
-ObjectLiteralProperty* Parser::RewriteNonPatternObjectLiteralProperty( |
- ObjectLiteralProperty* property, const ExpressionClassifier* classifier, |
- bool* ok) { |
- if (property != nullptr) { |
- // Do not rewrite (computed) key expressions |
- Expression* value = RewriteNonPattern(property->value(), classifier, ok); |
- property->set_value(value); |
+ if (!*ok) return; |
+ auto non_patterns_to_rewrite = function_state_->non_patterns_to_rewrite(); |
+ int begin = classifier->GetNonPatternBegin(); |
+ int end = non_patterns_to_rewrite->length(); |
+ if (begin < end) { |
+ NonPatternRewriter rewriter(stack_limit_, this); |
+ for (int i = begin; i < end; i++) { |
+ DCHECK(non_patterns_to_rewrite->at(i)->IsRewritableExpression()); |
+ rewriter.Rewrite(non_patterns_to_rewrite->at(i)); |
+ } |
+ non_patterns_to_rewrite->Rewind(begin); |
} |
- return property; |
} |
void Parser::RewriteDestructuringAssignments() { |
- FunctionState* func = function_state_; |
if (!allow_harmony_destructuring_assignment()) return; |
- const List<DestructuringAssignment>& assignments = |
- func->destructuring_assignments_to_rewrite(); |
+ const auto& assignments = |
+ function_state_->destructuring_assignments_to_rewrite(); |
for (int i = assignments.length() - 1; i >= 0; --i) { |
// Rewrite list in reverse, so that nested assignment patterns are rewritten |
// correctly. |
- DestructuringAssignment pair = assignments.at(i); |
- RewritableAssignmentExpression* to_rewrite = |
- pair.assignment->AsRewritableAssignmentExpression(); |
- Scope* scope = pair.scope; |
+ const DestructuringAssignment& pair = assignments.at(i); |
+ RewritableExpression* to_rewrite = |
+ pair.assignment->AsRewritableExpression(); |
DCHECK_NOT_NULL(to_rewrite); |
if (!to_rewrite->is_rewritten()) { |
- PatternRewriter::RewriteDestructuringAssignment(this, to_rewrite, scope); |
+ PatternRewriter::RewriteDestructuringAssignment(this, to_rewrite, |
+ pair.scope); |
} |
} |
} |
@@ -5748,12 +5739,18 @@ Expression* Parser::RewriteSpreads(ArrayLiteral* lit) { |
void ParserTraits::QueueDestructuringAssignmentForRewriting(Expression* expr) { |
- DCHECK(expr->IsRewritableAssignmentExpression()); |
+ DCHECK(expr->IsRewritableExpression()); |
parser_->function_state_->AddDestructuringAssignment( |
Parser::DestructuringAssignment(expr, parser_->scope_)); |
} |
+void ParserTraits::QueueNonPatternForRewriting(Expression* expr) { |
+ DCHECK(expr->IsRewritableExpression()); |
+ parser_->function_state_->AddNonPatternForRewriting(expr); |
+} |
+ |
+ |
void ParserTraits::SetFunctionNameFromPropertyName( |
ObjectLiteralProperty* property, const AstRawString* name) { |
Expression* value = property->value(); |