| Index: src/parsing/parser-base.h
|
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h
|
| index 35aee16b0a9b1f9b1f723d14acbe0808289dc590..a1ca30d4114d71bde6cc0cceebc5d7a403dee6ff 100644
|
| --- a/src/parsing/parser-base.h
|
| +++ b/src/parsing/parser-base.h
|
| @@ -745,10 +745,9 @@ class ParserBase : public Traits {
|
| bool* ok);
|
|
|
| enum AssignmentExpressionFlags {
|
| - kIsLeftHandSide = 0,
|
| - kIsRightHandSide = 1 << 0,
|
| - kIsPatternElement = 1 << 1,
|
| - kIsPossibleArrowFormals = 1 << 2
|
| + kIsNormalAssignment = 0,
|
| + kIsPossiblePatternElement = 1 << 0,
|
| + kIsPossibleArrowFormals = 1 << 1
|
| };
|
|
|
| ExpressionT ParseAssignmentExpression(bool accept_IN, int flags,
|
| @@ -757,7 +756,7 @@ class ParserBase : public Traits {
|
| ExpressionT ParseAssignmentExpression(bool accept_IN,
|
| ExpressionClassifier* classifier,
|
| bool* ok) {
|
| - return ParseAssignmentExpression(accept_IN, kIsLeftHandSide, classifier,
|
| + return ParseAssignmentExpression(accept_IN, kIsNormalAssignment, classifier,
|
| ok);
|
| }
|
| ExpressionT ParseYieldExpression(ExpressionClassifier* classifier, bool* ok);
|
| @@ -1036,11 +1035,6 @@ typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier(
|
| if (!*ok) return Traits::EmptyIdentifier();
|
| ValidateBindingPattern(&classifier, ok);
|
| if (!*ok) return Traits::EmptyIdentifier();
|
| - } else {
|
| -#if 0 // TODO(nikolaos): is this needed?
|
| - ValidateExpression(&classifier, ok);
|
| - if (!*ok) return Traits::EmptyIdentifier();
|
| -#endif
|
| }
|
|
|
| return result;
|
| @@ -1356,9 +1350,6 @@ ParserBase<Traits>::ParsePrimaryExpression(ExpressionClassifier* classifier,
|
| classifier, CHECK_OK);
|
| Expect(Token::RPAREN, CHECK_OK);
|
| if (peek() != Token::ARROW) {
|
| -#if 0 // TODO(nikolaos): is this needed?
|
| - ValidateExpression(classifier, CHECK_OK);
|
| -#endif
|
| expr->set_is_parenthesized();
|
| }
|
| return expr;
|
| @@ -1423,7 +1414,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
|
| bool accept_IN, bool* ok) {
|
| ExpressionClassifier classifier;
|
| ExpressionT result = ParseExpression(accept_IN, &classifier, CHECK_OK);
|
| - result = Traits::RewriteExpression(result, &classifier, CHECK_OK);
|
| + result = Traits::RewriteNonPattern(result, &classifier, CHECK_OK);
|
| return result;
|
| }
|
|
|
| @@ -1431,7 +1422,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
|
| template <class Traits>
|
| typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
|
| bool accept_IN, ExpressionClassifier* classifier, bool* ok) {
|
| - return ParseExpression(accept_IN, kIsLeftHandSide, classifier, ok);
|
| + return ParseExpression(accept_IN, kIsNormalAssignment, classifier, ok);
|
| }
|
|
|
|
|
| @@ -1532,7 +1523,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral(
|
| MessageTemplate::kElementAfterRest);
|
| }
|
| } else {
|
| - elem = this->ParseAssignmentExpression(true, kIsPatternElement,
|
| + elem = this->ParseAssignmentExpression(true, kIsPossiblePatternElement,
|
| classifier, CHECK_OK);
|
| }
|
| values->Add(elem, zone_);
|
| @@ -1589,7 +1580,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParsePropertyName(
|
| ExpressionClassifier computed_name_classifier;
|
| ExpressionT expression =
|
| ParseAssignmentExpression(true, &computed_name_classifier, CHECK_OK);
|
| - expression = Traits::RewriteExpression(
|
| + expression = Traits::RewriteNonPattern(
|
| expression, &computed_name_classifier, CHECK_OK);
|
| classifier->Accumulate(computed_name_classifier,
|
| ExpressionClassifier::ExpressionProductions);
|
| @@ -1662,7 +1653,7 @@ ParserBase<Traits>::ParsePropertyDefinition(
|
| }
|
| Consume(Token::COLON);
|
| value = this->ParseAssignmentExpression(
|
| - true, kIsPatternElement, classifier,
|
| + true, kIsPossiblePatternElement, classifier,
|
| CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
|
|
|
| return factory()->NewObjectLiteralProperty(name_expression, value, false,
|
| @@ -1704,7 +1695,7 @@ ParserBase<Traits>::ParsePropertyDefinition(
|
| ExpressionClassifier rhs_classifier;
|
| ExpressionT rhs = this->ParseAssignmentExpression(
|
| true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
|
| - rhs = Traits::RewriteExpression(
|
| + rhs = Traits::RewriteNonPattern(
|
| rhs, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty));
|
| classifier->Accumulate(rhs_classifier,
|
| ExpressionClassifier::ExpressionProductions);
|
| @@ -1913,7 +1904,7 @@ typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments(
|
|
|
| ExpressionT argument = this->ParseAssignmentExpression(
|
| true, classifier, CHECK_OK_CUSTOM(NullExpressionList));
|
| - argument = Traits::RewriteExpression(argument, classifier,
|
| + argument = Traits::RewriteNonPattern(argument, classifier,
|
| CHECK_OK_CUSTOM(NullExpressionList));
|
| if (is_spread) {
|
| if (!spread_arg.IsValid()) {
|
| @@ -1972,10 +1963,9 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, int flags,
|
| // ArrowFunction
|
| // YieldExpression
|
| // LeftHandSideExpression AssignmentOperator AssignmentExpression
|
| - bool is_rhs = flags & kIsRightHandSide;
|
| - bool is_pattern_element = flags & kIsPatternElement;
|
| + bool maybe_pattern_element = flags & kIsPossiblePatternElement;
|
| + bool maybe_arrow_formals = flags & kIsPossibleArrowFormals;
|
| bool is_destructuring_assignment = false;
|
| - bool is_arrow_formals = flags & kIsPossibleArrowFormals;
|
| int lhs_beg_pos = peek_position();
|
|
|
| if (peek() == Token::YIELD && is_generator()) {
|
| @@ -2020,7 +2010,7 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, int flags,
|
| }
|
| expression = this->ParseArrowFunctionLiteral(
|
| accept_IN, parameters, arrow_formals_classifier, CHECK_OK);
|
| - if (is_pattern_element) {
|
| + if (maybe_pattern_element) {
|
| classifier->RecordPatternError(
|
| Scanner::Location(lhs_beg_pos, scanner()->location().end_pos),
|
| MessageTemplate::kInvalidDestructuringTarget);
|
| @@ -2049,13 +2039,9 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, int flags,
|
|
|
| if (!Token::IsAssignmentOp(peek())) {
|
| // Parsed conditional expression only (no assignment).
|
| - if (is_pattern_element) {
|
| + if (maybe_pattern_element) {
|
| CheckDestructuringElement(expression, classifier, lhs_beg_pos,
|
| scanner()->location().end_pos);
|
| - } else if (is_rhs && maybe_pattern) {
|
| -#if 0 // TODO(nikolaos): is this needed?
|
| - ValidateExpression(classifier, CHECK_OK);
|
| -#endif
|
| }
|
| return expression;
|
| }
|
| @@ -2070,12 +2056,12 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, int flags,
|
| classifier->ForgiveCoverInitializedNameError();
|
| ValidateAssignmentPattern(classifier, CHECK_OK);
|
| is_destructuring_assignment = true;
|
| - } else if (is_arrow_formals) {
|
| + } else if (maybe_arrow_formals) {
|
| expression = this->ClassifyAndRewriteReferenceExpression(
|
| classifier, expression, lhs_beg_pos, scanner()->location().end_pos,
|
| MessageTemplate::kInvalidLhsInAssignment);
|
| } else {
|
| - if (is_pattern_element) {
|
| + if (maybe_pattern_element) {
|
| CheckDestructuringElement(expression, classifier, lhs_beg_pos,
|
| scanner()->location().end_pos);
|
| }
|
| @@ -2096,12 +2082,9 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, int flags,
|
|
|
| ExpressionClassifier rhs_classifier;
|
|
|
| - int rhs_flags = flags;
|
| - rhs_flags &= ~(kIsPatternElement | kIsPossibleArrowFormals);
|
| - rhs_flags |= kIsRightHandSide;
|
| - ExpressionT right = this->ParseAssignmentExpression(
|
| - accept_IN, rhs_flags, &rhs_classifier, CHECK_OK);
|
| - right = Traits::RewriteExpression(right, &rhs_classifier, CHECK_OK);
|
| + ExpressionT right =
|
| + this->ParseAssignmentExpression(accept_IN, &rhs_classifier, CHECK_OK);
|
| + right = Traits::RewriteNonPattern(right, &rhs_classifier, CHECK_OK);
|
| classifier->Accumulate(
|
| rhs_classifier, ExpressionClassifier::ExpressionProductions |
|
| ExpressionClassifier::CoverInitializedNameProduction);
|
| @@ -2174,7 +2157,7 @@ ParserBase<Traits>::ParseYieldExpression(ExpressionClassifier* classifier,
|
| default:
|
| expression = ParseAssignmentExpression(false, classifier, CHECK_OK);
|
| expression =
|
| - Traits::RewriteExpression(expression, classifier, CHECK_OK);
|
| + Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| break;
|
| }
|
| }
|
| @@ -2207,7 +2190,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::RewriteExpression(expression, classifier, CHECK_OK);
|
| + expression = Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
| BindingPatternUnexpectedToken(classifier);
|
| Consume(Token::CONDITIONAL);
|
| @@ -2215,11 +2198,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::RewriteExpression(left, classifier, CHECK_OK);
|
| + left = Traits::RewriteNonPattern(left, classifier, CHECK_OK);
|
| Expect(Token::COLON, CHECK_OK);
|
| ExpressionT right =
|
| ParseAssignmentExpression(accept_IN, classifier, CHECK_OK);
|
| - right = Traits::RewriteExpression(right, classifier, CHECK_OK);
|
| + right = Traits::RewriteNonPattern(right, classifier, CHECK_OK);
|
| return factory()->NewConditional(expression, left, right, pos);
|
| }
|
|
|
| @@ -2235,7 +2218,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::RewriteExpression(x, classifier, CHECK_OK);
|
| + x = Traits::RewriteNonPattern(x, classifier, CHECK_OK);
|
| BindingPatternUnexpectedToken(classifier);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
| Token::Value op = Next();
|
| @@ -2243,7 +2226,7 @@ ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN,
|
| int pos = position();
|
| ExpressionT y =
|
| ParseBinaryExpression(prec1 + 1, accept_IN, classifier, CHECK_OK);
|
| - y = Traits::RewriteExpression(y, classifier, CHECK_OK);
|
| + y = Traits::RewriteNonPattern(y, classifier, CHECK_OK);
|
|
|
| if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos,
|
| factory())) {
|
| @@ -2306,7 +2289,7 @@ ParserBase<Traits>::ParseUnaryExpression(ExpressionClassifier* classifier,
|
| op = Next();
|
| int pos = position();
|
| ExpressionT expression = ParseUnaryExpression(classifier, CHECK_OK);
|
| - expression = Traits::RewriteExpression(expression, classifier, CHECK_OK);
|
| + expression = Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
|
|
| if (op == Token::DELETE && is_strict(language_mode())) {
|
| if (is_strong(language_mode())) {
|
| @@ -2333,7 +2316,7 @@ ParserBase<Traits>::ParseUnaryExpression(ExpressionClassifier* classifier,
|
| expression, beg_pos, scanner()->location().end_pos,
|
| MessageTemplate::kInvalidLhsInPrefixOp, CHECK_OK);
|
| this->MarkExpressionAsAssigned(expression);
|
| - expression = Traits::RewriteExpression(expression, classifier, CHECK_OK);
|
| + expression = Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
|
|
| return factory()->NewCountOperation(op,
|
| true /* prefix */,
|
| @@ -2365,7 +2348,7 @@ ParserBase<Traits>::ParsePostfixExpression(ExpressionClassifier* classifier,
|
| expression, lhs_beg_pos, scanner()->location().end_pos,
|
| MessageTemplate::kInvalidLhsInPostfixOp, CHECK_OK);
|
| expression = this->MarkExpressionAsAssigned(expression);
|
| - expression = Traits::RewriteExpression(expression, classifier, CHECK_OK);
|
| + expression = Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
|
|
| Token::Value next = Next();
|
| expression =
|
| @@ -2396,14 +2379,14 @@ ParserBase<Traits>::ParseLeftHandSideExpression(
|
| Consume(Token::LBRACK);
|
| int pos = position();
|
| ExpressionT index = ParseExpression(true, classifier, CHECK_OK);
|
| - index = Traits::RewriteExpression(index, classifier, CHECK_OK);
|
| + index = Traits::RewriteNonPattern(index, classifier, CHECK_OK);
|
| result = factory()->NewProperty(result, index, pos);
|
| Expect(Token::RBRACK, CHECK_OK);
|
| break;
|
| }
|
|
|
| case Token::LPAREN: {
|
| - result = Traits::RewriteExpression(result, classifier, CHECK_OK);
|
| + result = Traits::RewriteNonPattern(result, classifier, CHECK_OK);
|
| BindingPatternUnexpectedToken(classifier);
|
| ArrowFormalParametersUnexpectedToken(classifier);
|
|
|
| @@ -2531,7 +2514,7 @@ ParserBase<Traits>::ParseMemberWithNewPrefixesExpression(
|
| } else {
|
| result = this->ParseMemberWithNewPrefixesExpression(classifier, CHECK_OK);
|
| }
|
| - result = Traits::RewriteExpression(result, classifier, CHECK_OK);
|
| + result = Traits::RewriteNonPattern(result, classifier, CHECK_OK);
|
| if (peek() == Token::LPAREN) {
|
| // NewExpression with arguments.
|
| Scanner::Location spread_pos;
|
| @@ -2631,7 +2614,7 @@ ParserBase<Traits>::ParseStrongInitializationExpression(
|
| Consume(Token::LBRACK);
|
| int pos = position();
|
| ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK);
|
| - index = Traits::RewriteExpression(index, classifier, CHECK_OK);
|
| + index = Traits::RewriteNonPattern(index, classifier, CHECK_OK);
|
| left = factory()->NewProperty(this_expr, index, pos);
|
| if (fni_ != NULL) {
|
| this->PushPropertyName(fni_, index);
|
| @@ -2667,7 +2650,7 @@ ParserBase<Traits>::ParseStrongInitializationExpression(
|
|
|
| ExpressionT right =
|
| this->ParseAssignmentExpression(true, classifier, CHECK_OK);
|
| - right = Traits::RewriteExpression(right, classifier, CHECK_OK);
|
| + right = Traits::RewriteNonPattern(right, classifier, CHECK_OK);
|
| this->CheckAssigningFunctionLiteralToProperty(left, right);
|
| function_state_->AddProperty();
|
| if (fni_ != NULL) {
|
| @@ -2824,7 +2807,7 @@ ParserBase<Traits>::ParseMemberExpressionContinuation(
|
| Consume(Token::LBRACK);
|
| int pos = position();
|
| ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK);
|
| - index = Traits::RewriteExpression(index, classifier, CHECK_OK);
|
| + index = Traits::RewriteNonPattern(index, classifier, CHECK_OK);
|
| expression = factory()->NewProperty(expression, index, pos);
|
| if (fni_ != NULL) {
|
| this->PushPropertyName(fni_, index);
|
| @@ -2905,7 +2888,7 @@ void ParserBase<Traits>::ParseFormalParameter(
|
| ExpressionClassifier init_classifier;
|
| initializer = ParseAssignmentExpression(true, &init_classifier, ok);
|
| if (!*ok) return;
|
| - initializer = Traits::RewriteExpression(initializer, &init_classifier, ok);
|
| + initializer = Traits::RewriteNonPattern(initializer, &init_classifier, ok);
|
| ValidateFormalParameterInitializer(&init_classifier, ok);
|
| if (!*ok) return;
|
| parameters->is_simple = false;
|
| @@ -3079,7 +3062,7 @@ ParserBase<Traits>::ParseArrowFunctionLiteral(
|
| ExpressionClassifier classifier;
|
| ExpressionT expression =
|
| ParseAssignmentExpression(accept_IN, &classifier, CHECK_OK);
|
| - expression = Traits::RewriteExpression(expression, &classifier, CHECK_OK);
|
| + expression = Traits::RewriteNonPattern(expression, &classifier, CHECK_OK);
|
| body = this->NewStatementList(1, zone());
|
| this->AddParameterInitializationBlock(formal_parameters, body, CHECK_OK);
|
| body->Add(factory()->NewReturnStatement(expression, pos), zone());
|
| @@ -3185,7 +3168,7 @@ ParserBase<Traits>::ParseTemplateLiteral(ExpressionT tag, int start,
|
|
|
| int expr_pos = peek_position();
|
| ExpressionT expression = this->ParseExpression(true, classifier, CHECK_OK);
|
| - expression = Traits::RewriteExpression(expression, classifier, CHECK_OK);
|
| + expression = Traits::RewriteNonPattern(expression, classifier, CHECK_OK);
|
| Traits::AddTemplateExpression(&ts, expression);
|
|
|
| if (peek() != Token::RBRACE) {
|
|
|