Chromium Code Reviews| Index: src/parsing/parser-base.h |
| diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
| index e75e87a65a427da96e9382f58b0a9a8c33fa8460..a11733a87596aebbc2b505d50b87beef382c765a 100644 |
| --- a/src/parsing/parser-base.h |
| +++ b/src/parsing/parser-base.h |
| @@ -122,6 +122,12 @@ class ParserBase : public Traits { |
| bool allow_##name() const { return allow_##name##_; } \ |
| void set_allow_##name(bool allow) { allow_##name##_ = allow; } |
| +#define SCANNER_ACCESSORS(name) \ |
| + bool allow_##name() const { return scanner_->allow_##name(); } \ |
| + void set_allow_##name(bool allow) { \ |
| + return scanner_->set_allow_##name(allow); \ |
| + } |
| + |
| ALLOW_ACCESSORS(lazy); |
| ALLOW_ACCESSORS(natives); |
| ALLOW_ACCESSORS(harmony_sloppy); |
| @@ -134,6 +140,7 @@ class ParserBase : public Traits { |
| ALLOW_ACCESSORS(legacy_const); |
| ALLOW_ACCESSORS(harmony_do_expressions); |
| ALLOW_ACCESSORS(harmony_function_name); |
| + SCANNER_ACCESSORS(harmony_exponentiation_operator); |
| #undef ALLOW_ACCESSORS |
| uintptr_t stack_limit() const { return stack_limit_; } |
| @@ -2111,6 +2118,11 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, int flags, |
| Traits::SetFunctionNameFromIdentifierRef(right, expression); |
| } |
| + if (op == Token::ASSIGN_EXP) { |
| + DCHECK(!is_destructuring_assignment); |
| + return Traits::RewriteAssignExponentiation(expression, right, pos); |
| + } |
| + |
| ExpressionT result = factory()->NewAssignment(op, expression, right, pos); |
| if (is_destructuring_assignment) { |
| @@ -2211,7 +2223,15 @@ ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, |
| ExpressionClassifier* classifier, |
| bool* ok) { |
| DCHECK(prec >= 4); |
| + bool is_unary_op = Token::IsUnaryOp(peek()); |
| ExpressionT x = this->ParseUnaryExpression(classifier, CHECK_OK); |
| + |
| + if (peek() == Token::EXP && is_unary_op) { |
| + ReportUnexpectedTokenAt(scanner()->peek_location(), Token::EXP); |
| + *ok = false; |
| + return this->EmptyExpression(); |
| + } |
| + |
| for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) { |
| // prec1 >= 4 |
| while (Precedence(peek(), accept_IN) == prec1) { |
| @@ -2221,8 +2241,11 @@ ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, |
| Token::Value op = Next(); |
| Scanner::Location op_location = scanner()->location(); |
| int pos = position(); |
| + // TODO(caitp): cleanup right associativity of exponentiation operator |
| + // somehow |
|
Dan Ehrenberg
2016/02/11 08:16:50
Seems like a good thing to do before submitting th
caitp (gmail)
2016/02/11 12:57:24
Yes it does-- the model for existing right associa
caitp (gmail)
2016/02/11 15:32:34
I've simplified the unary-op SyntaxError code and
|
| ExpressionT y = |
| - ParseBinaryExpression(prec1 + 1, accept_IN, classifier, CHECK_OK); |
| + ParseBinaryExpression(op == Token::EXP ? prec1 : prec1 + 1, accept_IN, |
| + classifier, CHECK_OK); |
| y = Traits::RewriteNonPattern(y, classifier, CHECK_OK); |
| if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos, |
| @@ -2308,16 +2331,15 @@ ParserBase<Traits>::ParseUnaryExpression(ExpressionClassifier* classifier, |
| ArrowFormalParametersUnexpectedToken(classifier); |
| op = Next(); |
| int beg_pos = peek_position(); |
| - ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK); |
| + ExpressionT expression = |
| + this->ParseLeftHandSideExpression(classifier, CHECK_OK); |
| expression = this->CheckAndRewriteReferenceExpression( |
| expression, beg_pos, scanner()->location().end_pos, |
| MessageTemplate::kInvalidLhsInPrefixOp, CHECK_OK); |
| this->MarkExpressionAsAssigned(expression); |
| expression = Traits::RewriteNonPattern(expression, classifier, CHECK_OK); |
| - return factory()->NewCountOperation(op, |
| - true /* prefix */, |
| - expression, |
| + return factory()->NewCountOperation(op, true /* prefix */, expression, |
| position()); |
| } else { |