Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(555)

Unified Diff: src/parsing/parser-base.h

Issue 1678303002: [es7] implement exponentiation operator proposal (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: update webkit test expectations Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 {

Powered by Google App Engine
This is Rietveld 408576698