Index: src/parsing/parser-base.h |
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
index dc67e536c8e0eb76f9921bd712fa9fbc0ddb0e58..9c3d92c7d1c9f7f53c68bc0217c114c098668e06 100644 |
--- a/src/parsing/parser-base.h |
+++ b/src/parsing/parser-base.h |
@@ -121,6 +121,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); |
@@ -131,6 +137,7 @@ class ParserBase : public Traits { |
ALLOW_ACCESSORS(harmony_do_expressions); |
ALLOW_ACCESSORS(harmony_function_name); |
ALLOW_ACCESSORS(harmony_function_sent); |
+ SCANNER_ACCESSORS(harmony_exponentiation_operator); |
#undef ALLOW_ACCESSORS |
nickie
2016/03/21 08:51:49
Shouldn't there be an #undef SCANNER_ACCESSORS her
caitp (gmail)
2016/03/21 10:44:17
Yes, there should! I'm surprised this doesn't trig
caitp (gmail)
2016/03/21 10:50:03
well, I guess I used a different name in scanner.h
|
uintptr_t stack_limit() const { return stack_limit_; } |
@@ -2010,6 +2017,11 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, |
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) { |
@@ -2119,8 +2131,11 @@ ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, |
ArrowFormalParametersUnexpectedToken(classifier); |
Token::Value op = Next(); |
int pos = position(); |
+ |
+ const bool is_right_associative = op == Token::EXP; |
+ const int next_prec = is_right_associative ? prec1 : prec1 + 1; |
ExpressionT y = |
- ParseBinaryExpression(prec1 + 1, accept_IN, classifier, CHECK_OK); |
+ ParseBinaryExpression(next_prec, accept_IN, classifier, CHECK_OK); |
Traits::RewriteNonPattern(classifier, CHECK_OK); |
if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos, |
@@ -2148,6 +2163,9 @@ ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, |
x = factory()->NewUnaryOperation(Token::NOT, x, pos); |
} |
} |
+ |
+ } else if (op == Token::EXP) { |
+ x = Traits::RewriteExponentiation(x, y, pos); |
} else { |
// We have a "normal" binary operation. |
x = factory()->NewBinaryOperation(op, x, y, pos); |
@@ -2193,6 +2211,12 @@ ParserBase<Traits>::ParseUnaryExpression(ExpressionClassifier* classifier, |
} |
} |
+ if (peek() == Token::EXP) { |
+ ReportUnexpectedToken(Next()); |
+ *ok = false; |
+ return this->EmptyExpression(); |
+ } |
+ |
// Allow Traits do rewrite the expression. |
return this->BuildUnaryExpression(expression, op, pos, factory()); |
} else if (Token::IsCountOp(op)) { |