| Index: src/parsing/parser-base.h
|
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h
|
| index d8cd60573090b21cdbe2c550d32b72d33f822b2d..f097456850a82d010851781558c3da219b957388 100644
|
| --- a/src/parsing/parser-base.h
|
| +++ b/src/parsing/parser-base.h
|
| @@ -88,6 +88,7 @@ class ParserBase : public Traits {
|
| typedef typename Traits::Type::Literal LiteralT;
|
| typedef typename Traits::Type::ObjectLiteralProperty ObjectLiteralPropertyT;
|
| typedef typename Traits::Type::StatementList StatementListT;
|
| + typedef typename Traits::Type::ExpressionClassifier ExpressionClassifier;
|
|
|
| ParserBase(Zone* zone, Scanner* scanner, uintptr_t stack_limit,
|
| v8::Extension* extension, AstValueFactory* ast_value_factory,
|
| @@ -244,10 +245,6 @@ class ParserBase : public Traits {
|
| return destructuring_assignments_to_rewrite_;
|
| }
|
|
|
| - void AddDestructuringAssignment(DestructuringAssignment pair) {
|
| - destructuring_assignments_to_rewrite_.Add(pair);
|
| - }
|
| -
|
| List<ExpressionT>& expressions_in_tail_position() {
|
| return expressions_in_tail_position_;
|
| }
|
| @@ -264,7 +261,21 @@ class ParserBase : public Traits {
|
| collect_expressions_in_tail_position_ = collect;
|
| }
|
|
|
| + ZoneList<ExpressionT>* non_patterns_to_rewrite() {
|
| + return &non_patterns_to_rewrite_;
|
| + }
|
| +
|
| private:
|
| + void AddDestructuringAssignment(DestructuringAssignment pair) {
|
| + destructuring_assignments_to_rewrite_.Add(pair);
|
| + }
|
| +
|
| + V8_INLINE Scope* scope() { return *scope_stack_; }
|
| +
|
| + void AddNonPatternForRewriting(ExpressionT expr) {
|
| + non_patterns_to_rewrite_.Add(expr, (*scope_stack_)->zone());
|
| + }
|
| +
|
| // Used to assign an index to each literal that needs materialization in
|
| // the function. Includes regexp literals, and boilerplate for object and
|
| // array literals.
|
| @@ -296,12 +307,12 @@ class ParserBase : public Traits {
|
| List<DestructuringAssignment> destructuring_assignments_to_rewrite_;
|
| List<ExpressionT> expressions_in_tail_position_;
|
| bool collect_expressions_in_tail_position_;
|
| -
|
| - void RewriteDestructuringAssignments();
|
| + ZoneList<ExpressionT> non_patterns_to_rewrite_;
|
|
|
| typename Traits::Type::Factory* factory_;
|
|
|
| friend class ParserTraits;
|
| + friend class PreParserTraits;
|
| friend class Checkpoint;
|
| };
|
|
|
| @@ -590,8 +601,8 @@ class ParserBase : public Traits {
|
| Scanner::Location location, Token::Value token,
|
| MessageTemplate::Template message = MessageTemplate::kUnexpectedToken);
|
|
|
| -
|
| - void ReportClassifierError(const ExpressionClassifier::Error& error) {
|
| + void ReportClassifierError(
|
| + const typename ExpressionClassifier::Error& error) {
|
| Traits::ReportMessageAt(error.location, error.message, error.arg,
|
| error.type);
|
| }
|
| @@ -669,7 +680,7 @@ class ParserBase : public Traits {
|
| // neither a valid binding pattern nor a valid parenthesized formal
|
| // parameter list, show the "arrow formal parameters" error if the formals
|
| // started with a parenthesis, and the binding pattern error otherwise.
|
| - const ExpressionClassifier::Error& error =
|
| + const typename ExpressionClassifier::Error& error =
|
| parenthesized_formals ? classifier->arrow_formal_parameters_error()
|
| : classifier->binding_pattern_error();
|
| ReportClassifierError(error);
|
| @@ -837,11 +848,6 @@ class ParserBase : public Traits {
|
| return true;
|
| }
|
|
|
| - bool IsAssignmentExpression(ExpressionT expression) {
|
| - return expression->IsAssignment() ||
|
| - expression->IsRewritableAssignmentExpression();
|
| - }
|
| -
|
| bool IsValidPattern(ExpressionT expression) {
|
| return expression->IsObjectLiteral() || expression->IsArrayLiteral();
|
| }
|
| @@ -968,6 +974,7 @@ ParserBase<Traits>::FunctionState::FunctionState(
|
| scope_stack_(scope_stack),
|
| outer_scope_(*scope_stack),
|
| collect_expressions_in_tail_position_(true),
|
| + non_patterns_to_rewrite_(0, scope->zone()),
|
| factory_(factory) {
|
| *scope_stack_ = scope;
|
| *function_state_stack = this;
|
| @@ -1054,7 +1061,7 @@ void ParserBase<Traits>::ReportUnexpectedTokenAt(
|
| template <class Traits>
|
| typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier(
|
| AllowRestrictedIdentifiers allow_restricted_identifiers, bool* ok) {
|
| - ExpressionClassifier classifier;
|
| + ExpressionClassifier classifier(this);
|
| auto result = ParseAndClassifyIdentifier(&classifier, ok);
|
| if (!*ok) return Traits::EmptyIdentifier();
|
|
|
| @@ -1425,9 +1432,9 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier,
|
| template <class Traits>
|
| typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
|
| bool accept_IN, bool* ok) {
|
| - ExpressionClassifier classifier;
|
| + ExpressionClassifier classifier(this);
|
| ExpressionT result = ParseExpression(accept_IN, &classifier, CHECK_OK);
|
| - result = Traits::RewriteNonPattern(result, &classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(&classifier, CHECK_OK);
|
| return result;
|
| }
|
|
|
| @@ -1439,10 +1446,10 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
|
| // AssignmentExpression
|
| // Expression ',' AssignmentExpression
|
|
|
| - ExpressionClassifier binding_classifier;
|
| + ExpressionClassifier binding_classifier(this);
|
| ExpressionT result =
|
| this->ParseAssignmentExpression(accept_IN, &binding_classifier, CHECK_OK);
|
| - classifier->Accumulate(binding_classifier,
|
| + classifier->Accumulate(&binding_classifier,
|
| ExpressionClassifier::AllProductions);
|
| bool is_simple_parameter_list = this->IsIdentifier(result);
|
| bool seen_rest = false;
|
| @@ -1467,6 +1474,8 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
|
| int pos = position(), expr_pos = peek_position();
|
| ExpressionT right = this->ParseAssignmentExpression(
|
| accept_IN, &binding_classifier, CHECK_OK);
|
| + classifier->Accumulate(&binding_classifier,
|
| + ExpressionClassifier::AllProductions);
|
| if (is_rest) {
|
| if (!this->IsIdentifier(right) && !IsValidPattern(right)) {
|
| classifier->RecordArrowFormalParametersError(
|
| @@ -1477,8 +1486,6 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
|
| }
|
| is_simple_parameter_list =
|
| is_simple_parameter_list && this->IsIdentifier(right);
|
| - classifier->Accumulate(binding_classifier,
|
| - ExpressionClassifier::AllProductions);
|
| result = factory()->NewBinaryOperation(Token::COMMA, result, right, pos);
|
| }
|
| if (!is_simple_parameter_list || seen_rest) {
|
| @@ -1522,7 +1529,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral(
|
| first_spread_index = values->length();
|
| }
|
|
|
| - if (IsAssignmentExpression(argument)) {
|
| + if (argument->IsAssignment()) {
|
| classifier->RecordPatternError(
|
| Scanner::Location(start_pos, scanner()->location().end_pos),
|
| MessageTemplate::kInvalidDestructuringTarget);
|
| @@ -1552,8 +1559,14 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral(
|
| // Update the scope information before the pre-parsing bailout.
|
| int literal_index = function_state_->NextMaterializedLiteralIndex();
|
|
|
| - return factory()->NewArrayLiteral(values, first_spread_index, literal_index,
|
| - is_strong(language_mode()), pos);
|
| + ExpressionT result =
|
| + factory()->NewArrayLiteral(values, first_spread_index, literal_index,
|
| + is_strong(language_mode()), pos);
|
| + if (first_spread_index >= 0) {
|
| + result = factory()->NewRewritableExpression(result);
|
| + Traits::QueueNonPatternForRewriting(result);
|
| + }
|
| + return result;
|
| }
|
|
|
|
|
| @@ -1592,12 +1605,11 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParsePropertyName(
|
| case Token::LBRACK: {
|
| *is_computed_name = true;
|
| Consume(Token::LBRACK);
|
| - ExpressionClassifier computed_name_classifier;
|
| + ExpressionClassifier computed_name_classifier(this);
|
| ExpressionT expression =
|
| ParseAssignmentExpression(true, &computed_name_classifier, CHECK_OK);
|
| - expression = Traits::RewriteNonPattern(
|
| - expression, &computed_name_classifier, CHECK_OK);
|
| - classifier->Accumulate(computed_name_classifier,
|
| + Traits::RewriteNonPattern(&computed_name_classifier, CHECK_OK);
|
| + classifier->Accumulate(&computed_name_classifier,
|
| ExpressionClassifier::ExpressionProductions);
|
| Expect(Token::RBRACK, CHECK_OK);
|
| return expression;
|
| @@ -1685,12 +1697,12 @@ ParserBase<Traits>::ParsePropertyDefinition(
|
|
|
| if (peek() == Token::ASSIGN) {
|
| Consume(Token::ASSIGN);
|
| - ExpressionClassifier rhs_classifier;
|
| + ExpressionClassifier rhs_classifier(this);
|
| ExpressionT rhs = this->ParseAssignmentExpression(
|
| true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
|
| - rhs = Traits::RewriteNonPattern(
|
| - rhs, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
|
| - classifier->Accumulate(rhs_classifier,
|
| + Traits::RewriteNonPattern(&rhs_classifier,
|
| + CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
|
| + classifier->Accumulate(&rhs_classifier,
|
| ExpressionClassifier::ExpressionProductions);
|
| value = factory()->NewAssignment(Token::ASSIGN, lhs, rhs,
|
| RelocInfo::kNoPosition);
|
| @@ -1752,8 +1764,7 @@ ParserBase<Traits>::ParsePropertyDefinition(
|
| ObjectLiteralPropertyT property = ParsePropertyDefinition(
|
| checker, true, has_extends, true, is_computed_name, nullptr, classifier,
|
| name, ok);
|
| - property = Traits::RewriteNonPatternObjectLiteralProperty(property,
|
| - classifier, ok);
|
| + Traits::RewriteNonPattern(classifier, ok);
|
| return property;
|
| }
|
|
|
| @@ -1892,8 +1903,7 @@ typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments(
|
|
|
| ExpressionT argument = this->ParseAssignmentExpression(
|
| true, classifier, CHECK_OK_CUSTOM(NullExpressionList));
|
| - argument = Traits::RewriteNonPattern(argument, classifier,
|
| - CHECK_OK_CUSTOM(NullExpressionList));
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK_CUSTOM(NullExpressionList));
|
| if (is_spread) {
|
| if (!spread_arg.IsValid()) {
|
| spread_arg.beg_pos = start_pos;
|
| @@ -1960,7 +1970,8 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN,
|
|
|
| FuncNameInferrer::State fni_state(fni_);
|
| ParserBase<Traits>::Checkpoint checkpoint(this);
|
| - ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder());
|
| + ExpressionClassifier arrow_formals_classifier(this,
|
| + classifier->duplicate_finder());
|
| bool parenthesized_formals = peek() == Token::LPAREN;
|
| if (!parenthesized_formals) {
|
| ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier);
|
| @@ -2010,17 +2021,24 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN,
|
|
|
| // "expression" was not itself an arrow function parameter list, but it might
|
| // form part of one. Propagate speculative formal parameter error locations.
|
| + // Do not merge pending non-pattern expressions yet!
|
| classifier->Accumulate(
|
| - arrow_formals_classifier,
|
| + &arrow_formals_classifier,
|
| ExpressionClassifier::StandardProductions |
|
| - ExpressionClassifier::FormalParametersProductions |
|
| - ExpressionClassifier::CoverInitializedNameProduction);
|
| + ExpressionClassifier::FormalParametersProductions |
|
| + ExpressionClassifier::CoverInitializedNameProduction,
|
| + false);
|
|
|
| if (!Token::IsAssignmentOp(peek())) {
|
| // Parsed conditional expression only (no assignment).
|
| + // Now pending non-pattern expressions must be merged.
|
| + classifier->MergeNonPatterns(&arrow_formals_classifier);
|
| return expression;
|
| }
|
|
|
| + // Now pending non-pattern expressions must be discarded.
|
| + arrow_formals_classifier.Discard();
|
| +
|
| if (!(allow_harmony_destructuring_bind() ||
|
| allow_harmony_default_parameters())) {
|
| BindingPatternUnexpectedToken(classifier);
|
| @@ -2054,14 +2072,14 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN,
|
| }
|
| int pos = position();
|
|
|
| - ExpressionClassifier rhs_classifier;
|
| + ExpressionClassifier rhs_classifier(this);
|
|
|
| ExpressionT right =
|
| this->ParseAssignmentExpression(accept_IN, &rhs_classifier, CHECK_OK);
|
| - right = Traits::RewriteNonPattern(right, &rhs_classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(&rhs_classifier, CHECK_OK);
|
| classifier->Accumulate(
|
| - rhs_classifier, ExpressionClassifier::ExpressionProductions |
|
| - ExpressionClassifier::CoverInitializedNameProduction);
|
| + &rhs_classifier, ExpressionClassifier::ExpressionProductions |
|
| + ExpressionClassifier::CoverInitializedNameProduction);
|
|
|
| // TODO(1231235): We try to estimate the set of properties set by
|
| // constructors. We define a new property whenever there is an
|
| @@ -2093,7 +2111,7 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN,
|
| ExpressionT result = factory()->NewAssignment(op, expression, right, pos);
|
|
|
| if (is_destructuring_assignment) {
|
| - result = factory()->NewRewritableAssignmentExpression(result);
|
| + result = factory()->NewRewritableExpression(result);
|
| Traits::QueueDestructuringAssignmentForRewriting(result);
|
| }
|
|
|
| @@ -2135,8 +2153,7 @@ ParserBase<Traits>::ParseYieldExpression(ExpressionClassifier* classifier,
|
| // Delegating yields require an RHS; fall through.
|
| default:
|
| expression = ParseAssignmentExpression(false, classifier, CHECK_OK);
|
| - expression =
|
| - Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| break;
|
| }
|
| }
|
| @@ -2166,7 +2183,7 @@ ParserBase<Traits>::ParseConditionalExpression(bool accept_IN,
|
| ExpressionT expression =
|
| this->ParseBinaryExpression(4, accept_IN, classifier, CHECK_OK);
|
| if (peek() != Token::CONDITIONAL) return expression;
|
| - expression = Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
| BindingPatternUnexpectedToken(classifier);
|
| Consume(Token::CONDITIONAL);
|
| @@ -2174,11 +2191,11 @@ ParserBase<Traits>::ParseConditionalExpression(bool accept_IN,
|
| // expressions we always accept the 'in' keyword; see ECMA-262,
|
| // section 11.12, page 58.
|
| ExpressionT left = ParseAssignmentExpression(true, classifier, CHECK_OK);
|
| - left = Traits::RewriteNonPattern(left, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| Expect(Token::COLON, CHECK_OK);
|
| ExpressionT right =
|
| ParseAssignmentExpression(accept_IN, classifier, CHECK_OK);
|
| - right = Traits::RewriteNonPattern(right, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| return factory()->NewConditional(expression, left, right, pos);
|
| }
|
|
|
| @@ -2194,7 +2211,7 @@ ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN,
|
| for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) {
|
| // prec1 >= 4
|
| while (Precedence(peek(), accept_IN) == prec1) {
|
| - x = Traits::RewriteNonPattern(x, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| BindingPatternUnexpectedToken(classifier);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
| Token::Value op = Next();
|
| @@ -2202,7 +2219,7 @@ ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN,
|
| int pos = position();
|
| ExpressionT y =
|
| ParseBinaryExpression(prec1 + 1, accept_IN, classifier, CHECK_OK);
|
| - y = Traits::RewriteNonPattern(y, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
|
|
| if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos,
|
| factory())) {
|
| @@ -2265,7 +2282,7 @@ ParserBase<Traits>::ParseUnaryExpression(ExpressionClassifier* classifier,
|
| op = Next();
|
| int pos = position();
|
| ExpressionT expression = ParseUnaryExpression(classifier, CHECK_OK);
|
| - expression = Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
|
|
| if (op == Token::DELETE && is_strict(language_mode())) {
|
| if (is_strong(language_mode())) {
|
| @@ -2292,7 +2309,7 @@ ParserBase<Traits>::ParseUnaryExpression(ExpressionClassifier* classifier,
|
| expression, beg_pos, scanner()->location().end_pos,
|
| MessageTemplate::kInvalidLhsInPrefixOp, CHECK_OK);
|
| this->MarkExpressionAsAssigned(expression);
|
| - expression = Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
|
|
| return factory()->NewCountOperation(op,
|
| true /* prefix */,
|
| @@ -2324,7 +2341,7 @@ ParserBase<Traits>::ParsePostfixExpression(ExpressionClassifier* classifier,
|
| expression, lhs_beg_pos, scanner()->location().end_pos,
|
| MessageTemplate::kInvalidLhsInPostfixOp, CHECK_OK);
|
| expression = this->MarkExpressionAsAssigned(expression);
|
| - expression = Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
|
|
| Token::Value next = Next();
|
| expression =
|
| @@ -2350,20 +2367,20 @@ ParserBase<Traits>::ParseLeftHandSideExpression(
|
| while (true) {
|
| switch (peek()) {
|
| case Token::LBRACK: {
|
| - result = Traits::RewriteNonPattern(result, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| BindingPatternUnexpectedToken(classifier);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
| Consume(Token::LBRACK);
|
| int pos = position();
|
| ExpressionT index = ParseExpression(true, classifier, CHECK_OK);
|
| - index = Traits::RewriteNonPattern(index, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| result = factory()->NewProperty(result, index, pos);
|
| Expect(Token::RBRACK, CHECK_OK);
|
| break;
|
| }
|
|
|
| case Token::LPAREN: {
|
| - result = Traits::RewriteNonPattern(result, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| BindingPatternUnexpectedToken(classifier);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
|
|
| @@ -2427,7 +2444,7 @@ ParserBase<Traits>::ParseLeftHandSideExpression(
|
| }
|
|
|
| case Token::PERIOD: {
|
| - result = Traits::RewriteNonPattern(result, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| BindingPatternUnexpectedToken(classifier);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
| Consume(Token::PERIOD);
|
| @@ -2441,7 +2458,7 @@ ParserBase<Traits>::ParseLeftHandSideExpression(
|
|
|
| case Token::TEMPLATE_SPAN:
|
| case Token::TEMPLATE_TAIL: {
|
| - result = Traits::RewriteNonPattern(result, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| BindingPatternUnexpectedToken(classifier);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
| result = ParseTemplateLiteral(result, position(), classifier, CHECK_OK);
|
| @@ -2493,7 +2510,7 @@ ParserBase<Traits>::ParseMemberWithNewPrefixesExpression(
|
| } else {
|
| result = this->ParseMemberWithNewPrefixesExpression(classifier, CHECK_OK);
|
| }
|
| - result = Traits::RewriteNonPattern(result, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| if (peek() == Token::LPAREN) {
|
| // NewExpression with arguments.
|
| Scanner::Location spread_pos;
|
| @@ -2609,7 +2626,7 @@ ParserBase<Traits>::ParseStrongInitializationExpression(
|
| Consume(Token::LBRACK);
|
| int pos = position();
|
| ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK);
|
| - index = Traits::RewriteNonPattern(index, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| left = factory()->NewProperty(this_expr, index, pos);
|
| if (fni_ != NULL) {
|
| this->PushPropertyName(fni_, index);
|
| @@ -2645,7 +2662,7 @@ ParserBase<Traits>::ParseStrongInitializationExpression(
|
|
|
| ExpressionT right =
|
| this->ParseAssignmentExpression(true, classifier, CHECK_OK);
|
| - right = Traits::RewriteNonPattern(right, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| this->CheckAssigningFunctionLiteralToProperty(left, right);
|
| function_state_->AddProperty();
|
| if (fni_ != NULL) {
|
| @@ -2809,15 +2826,14 @@ ParserBase<Traits>::ParseMemberExpressionContinuation(
|
| while (true) {
|
| switch (peek()) {
|
| case Token::LBRACK: {
|
| - expression =
|
| - Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| BindingPatternUnexpectedToken(classifier);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
|
|
| Consume(Token::LBRACK);
|
| int pos = position();
|
| ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK);
|
| - index = Traits::RewriteNonPattern(index, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| expression = factory()->NewProperty(expression, index, pos);
|
| if (fni_ != NULL) {
|
| this->PushPropertyName(fni_, index);
|
| @@ -2826,8 +2842,7 @@ ParserBase<Traits>::ParseMemberExpressionContinuation(
|
| break;
|
| }
|
| case Token::PERIOD: {
|
| - expression =
|
| - Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| BindingPatternUnexpectedToken(classifier);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
|
|
| @@ -2843,8 +2858,7 @@ ParserBase<Traits>::ParseMemberExpressionContinuation(
|
| }
|
| case Token::TEMPLATE_SPAN:
|
| case Token::TEMPLATE_TAIL: {
|
| - expression =
|
| - Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| BindingPatternUnexpectedToken(classifier);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
| int pos;
|
| @@ -2899,13 +2913,14 @@ void ParserBase<Traits>::ParseFormalParameter(
|
|
|
| ExpressionT initializer = Traits::EmptyExpression();
|
| if (!is_rest && allow_harmony_default_parameters() && Check(Token::ASSIGN)) {
|
| - ExpressionClassifier init_classifier;
|
| + ExpressionClassifier init_classifier(this);
|
| initializer = ParseAssignmentExpression(true, &init_classifier, ok);
|
| if (!*ok) return;
|
| - initializer = Traits::RewriteNonPattern(initializer, &init_classifier, ok);
|
| + Traits::RewriteNonPattern(&init_classifier, ok);
|
| ValidateFormalParameterInitializer(&init_classifier, ok);
|
| if (!*ok) return;
|
| parameters->is_simple = false;
|
| + init_classifier.Discard();
|
| classifier->RecordNonSimpleParameter();
|
|
|
| if (allow_harmony_function_name()) {
|
| @@ -3073,10 +3088,10 @@ ParserBase<Traits>::ParseArrowFunctionLiteral(
|
| // Single-expression body
|
| int pos = position();
|
| parenthesized_function_ = false;
|
| - ExpressionClassifier classifier;
|
| + ExpressionClassifier classifier(this);
|
| ExpressionT expression =
|
| ParseAssignmentExpression(accept_IN, &classifier, CHECK_OK);
|
| - expression = Traits::RewriteNonPattern(expression, &classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(&classifier, CHECK_OK);
|
| body = this->NewStatementList(1, zone());
|
| this->AddParameterInitializationBlock(formal_parameters, body, CHECK_OK);
|
| body->Add(factory()->NewReturnStatement(expression, pos), zone());
|
| @@ -3182,7 +3197,7 @@ ParserBase<Traits>::ParseTemplateLiteral(ExpressionT tag, int start,
|
|
|
| int expr_pos = peek_position();
|
| ExpressionT expression = this->ParseExpression(true, classifier, CHECK_OK);
|
| - expression = Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(classifier, CHECK_OK);
|
| Traits::AddTemplateExpression(&ts, expression);
|
|
|
| if (peek() != Token::RBRACE) {
|
| @@ -3236,7 +3251,7 @@ typename ParserBase<Traits>::ExpressionT
|
| ParserBase<Traits>::CheckAndRewriteReferenceExpression(
|
| ExpressionT expression, int beg_pos, int end_pos,
|
| MessageTemplate::Template message, ParseErrorType type, bool* ok) {
|
| - ExpressionClassifier classifier;
|
| + ExpressionClassifier classifier(this);
|
| ExpressionT result = ClassifyAndRewriteReferenceExpression(
|
| &classifier, expression, beg_pos, end_pos, message, type);
|
| ValidateExpression(&classifier, ok);
|
| @@ -3290,7 +3305,7 @@ template <typename Traits>
|
| void ParserBase<Traits>::CheckDestructuringElement(
|
| ExpressionT expression, ExpressionClassifier* classifier, int begin,
|
| int end) {
|
| - if (!IsValidPattern(expression) && !IsAssignmentExpression(expression) &&
|
| + if (!IsValidPattern(expression) && !expression->IsAssignment() &&
|
| !IsValidReferenceExpression(expression)) {
|
| classifier->RecordAssignmentPatternError(
|
| Scanner::Location(begin, end),
|
| @@ -3356,6 +3371,8 @@ void ParserBase<Traits>::ClassLiteralChecker::CheckProperty(
|
| return;
|
| }
|
| }
|
| +
|
| +
|
| } // namespace internal
|
| } // namespace v8
|
|
|
|
|