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

Side by Side 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: Try to make MSVC happy Created 4 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_PARSING_PARSER_BASE_H 5 #ifndef V8_PARSING_PARSER_BASE_H
6 #define V8_PARSING_PARSER_BASE_H 6 #define V8_PARSING_PARSER_BASE_H
7 7
8 #include "src/ast/scopes.h" 8 #include "src/ast/scopes.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/hashmap.h" 10 #include "src/hashmap.h"
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 allow_harmony_restrictive_declarations_(false), 114 allow_harmony_restrictive_declarations_(false),
115 allow_legacy_const_(true), 115 allow_legacy_const_(true),
116 allow_harmony_do_expressions_(false), 116 allow_harmony_do_expressions_(false),
117 allow_harmony_function_name_(false), 117 allow_harmony_function_name_(false),
118 allow_harmony_function_sent_(false) {} 118 allow_harmony_function_sent_(false) {}
119 119
120 #define ALLOW_ACCESSORS(name) \ 120 #define ALLOW_ACCESSORS(name) \
121 bool allow_##name() const { return allow_##name##_; } \ 121 bool allow_##name() const { return allow_##name##_; } \
122 void set_allow_##name(bool allow) { allow_##name##_ = allow; } 122 void set_allow_##name(bool allow) { allow_##name##_ = allow; }
123 123
124 #define SCANNER_ACCESSORS(name) \
125 bool allow_##name() const { return scanner_->allow_##name(); } \
126 void set_allow_##name(bool allow) { \
127 return scanner_->set_allow_##name(allow); \
128 }
129
124 ALLOW_ACCESSORS(lazy); 130 ALLOW_ACCESSORS(lazy);
125 ALLOW_ACCESSORS(natives); 131 ALLOW_ACCESSORS(natives);
126 ALLOW_ACCESSORS(harmony_sloppy); 132 ALLOW_ACCESSORS(harmony_sloppy);
127 ALLOW_ACCESSORS(harmony_sloppy_function); 133 ALLOW_ACCESSORS(harmony_sloppy_function);
128 ALLOW_ACCESSORS(harmony_sloppy_let); 134 ALLOW_ACCESSORS(harmony_sloppy_let);
129 ALLOW_ACCESSORS(harmony_restrictive_declarations); 135 ALLOW_ACCESSORS(harmony_restrictive_declarations);
130 ALLOW_ACCESSORS(legacy_const); 136 ALLOW_ACCESSORS(legacy_const);
131 ALLOW_ACCESSORS(harmony_do_expressions); 137 ALLOW_ACCESSORS(harmony_do_expressions);
132 ALLOW_ACCESSORS(harmony_function_name); 138 ALLOW_ACCESSORS(harmony_function_name);
133 ALLOW_ACCESSORS(harmony_function_sent); 139 ALLOW_ACCESSORS(harmony_function_sent);
140 SCANNER_ACCESSORS(harmony_exponentiation_operator);
134 #undef ALLOW_ACCESSORS 141 #undef ALLOW_ACCESSORS
135 142
136 uintptr_t stack_limit() const { return stack_limit_; } 143 uintptr_t stack_limit() const { return stack_limit_; }
137 144
138 protected: 145 protected:
139 enum AllowRestrictedIdentifiers { 146 enum AllowRestrictedIdentifiers {
140 kAllowRestrictedIdentifiers, 147 kAllowRestrictedIdentifiers,
141 kDontAllowRestrictedIdentifiers 148 kDontAllowRestrictedIdentifiers
142 }; 149 };
143 150
(...skipping 1859 matching lines...) Expand 10 before | Expand all | Expand 10 after
2003 fni_->Infer(); 2010 fni_->Infer();
2004 } else { 2011 } else {
2005 fni_->RemoveLastFunction(); 2012 fni_->RemoveLastFunction();
2006 } 2013 }
2007 } 2014 }
2008 2015
2009 if (op == Token::ASSIGN && allow_harmony_function_name()) { 2016 if (op == Token::ASSIGN && allow_harmony_function_name()) {
2010 Traits::SetFunctionNameFromIdentifierRef(right, expression); 2017 Traits::SetFunctionNameFromIdentifierRef(right, expression);
2011 } 2018 }
2012 2019
2020 if (op == Token::ASSIGN_EXP) {
2021 DCHECK(!is_destructuring_assignment);
2022 return Traits::RewriteAssignExponentiation(expression, right, pos);
2023 }
2024
2013 ExpressionT result = factory()->NewAssignment(op, expression, right, pos); 2025 ExpressionT result = factory()->NewAssignment(op, expression, right, pos);
2014 2026
2015 if (is_destructuring_assignment) { 2027 if (is_destructuring_assignment) {
2016 result = factory()->NewRewritableExpression(result); 2028 result = factory()->NewRewritableExpression(result);
2017 Traits::QueueDestructuringAssignmentForRewriting(result); 2029 Traits::QueueDestructuringAssignmentForRewriting(result);
2018 } 2030 }
2019 2031
2020 return result; 2032 return result;
2021 } 2033 }
2022 2034
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
2112 DCHECK(prec >= 4); 2124 DCHECK(prec >= 4);
2113 ExpressionT x = this->ParseUnaryExpression(classifier, CHECK_OK); 2125 ExpressionT x = this->ParseUnaryExpression(classifier, CHECK_OK);
2114 for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) { 2126 for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) {
2115 // prec1 >= 4 2127 // prec1 >= 4
2116 while (Precedence(peek(), accept_IN) == prec1) { 2128 while (Precedence(peek(), accept_IN) == prec1) {
2117 Traits::RewriteNonPattern(classifier, CHECK_OK); 2129 Traits::RewriteNonPattern(classifier, CHECK_OK);
2118 BindingPatternUnexpectedToken(classifier); 2130 BindingPatternUnexpectedToken(classifier);
2119 ArrowFormalParametersUnexpectedToken(classifier); 2131 ArrowFormalParametersUnexpectedToken(classifier);
2120 Token::Value op = Next(); 2132 Token::Value op = Next();
2121 int pos = position(); 2133 int pos = position();
2134
2135 const bool is_right_associative = op == Token::EXP;
2136 const int next_prec = is_right_associative ? prec1 : prec1 + 1;
2122 ExpressionT y = 2137 ExpressionT y =
2123 ParseBinaryExpression(prec1 + 1, accept_IN, classifier, CHECK_OK); 2138 ParseBinaryExpression(next_prec, accept_IN, classifier, CHECK_OK);
2124 Traits::RewriteNonPattern(classifier, CHECK_OK); 2139 Traits::RewriteNonPattern(classifier, CHECK_OK);
2125 2140
2126 if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos, 2141 if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos,
2127 factory())) { 2142 factory())) {
2128 continue; 2143 continue;
2129 } 2144 }
2130 2145
2131 // For now we distinguish between comparisons and other binary 2146 // For now we distinguish between comparisons and other binary
2132 // operations. (We could combine the two and get rid of this 2147 // operations. (We could combine the two and get rid of this
2133 // code and AST node eventually.) 2148 // code and AST node eventually.)
2134 if (Token::IsCompareOp(op)) { 2149 if (Token::IsCompareOp(op)) {
2135 // We have a comparison. 2150 // We have a comparison.
2136 Token::Value cmp = op; 2151 Token::Value cmp = op;
2137 switch (op) { 2152 switch (op) {
2138 case Token::NE: cmp = Token::EQ; break; 2153 case Token::NE: cmp = Token::EQ; break;
2139 case Token::NE_STRICT: cmp = Token::EQ_STRICT; break; 2154 case Token::NE_STRICT: cmp = Token::EQ_STRICT; break;
2140 default: break; 2155 default: break;
2141 } 2156 }
2142 if (FLAG_harmony_instanceof && cmp == Token::INSTANCEOF) { 2157 if (FLAG_harmony_instanceof && cmp == Token::INSTANCEOF) {
2143 x = Traits::RewriteInstanceof(x, y, pos); 2158 x = Traits::RewriteInstanceof(x, y, pos);
2144 } else { 2159 } else {
2145 x = factory()->NewCompareOperation(cmp, x, y, pos); 2160 x = factory()->NewCompareOperation(cmp, x, y, pos);
2146 if (cmp != op) { 2161 if (cmp != op) {
2147 // The comparison was negated - add a NOT. 2162 // The comparison was negated - add a NOT.
2148 x = factory()->NewUnaryOperation(Token::NOT, x, pos); 2163 x = factory()->NewUnaryOperation(Token::NOT, x, pos);
2149 } 2164 }
2150 } 2165 }
2166
2167 } else if (op == Token::EXP) {
2168 x = Traits::RewriteExponentiation(x, y, pos);
2151 } else { 2169 } else {
2152 // We have a "normal" binary operation. 2170 // We have a "normal" binary operation.
2153 x = factory()->NewBinaryOperation(op, x, y, pos); 2171 x = factory()->NewBinaryOperation(op, x, y, pos);
2154 } 2172 }
2155 } 2173 }
2156 } 2174 }
2157 return x; 2175 return x;
2158 } 2176 }
2159 2177
2160 2178
(...skipping 25 matching lines...) Expand all
2186 2204
2187 if (op == Token::DELETE && is_strict(language_mode())) { 2205 if (op == Token::DELETE && is_strict(language_mode())) {
2188 if (this->IsIdentifier(expression)) { 2206 if (this->IsIdentifier(expression)) {
2189 // "delete identifier" is a syntax error in strict mode. 2207 // "delete identifier" is a syntax error in strict mode.
2190 ReportMessage(MessageTemplate::kStrictDelete); 2208 ReportMessage(MessageTemplate::kStrictDelete);
2191 *ok = false; 2209 *ok = false;
2192 return this->EmptyExpression(); 2210 return this->EmptyExpression();
2193 } 2211 }
2194 } 2212 }
2195 2213
2214 if (peek() == Token::EXP) {
2215 ReportUnexpectedToken(Next());
2216 *ok = false;
2217 return this->EmptyExpression();
2218 }
2219
2196 // Allow Traits do rewrite the expression. 2220 // Allow Traits do rewrite the expression.
2197 return this->BuildUnaryExpression(expression, op, pos, factory()); 2221 return this->BuildUnaryExpression(expression, op, pos, factory());
2198 } else if (Token::IsCountOp(op)) { 2222 } else if (Token::IsCountOp(op)) {
2199 BindingPatternUnexpectedToken(classifier); 2223 BindingPatternUnexpectedToken(classifier);
2200 ArrowFormalParametersUnexpectedToken(classifier); 2224 ArrowFormalParametersUnexpectedToken(classifier);
2201 op = Next(); 2225 op = Next();
2202 int beg_pos = peek_position(); 2226 int beg_pos = peek_position();
2203 ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK); 2227 ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK);
2204 expression = this->CheckAndRewriteReferenceExpression( 2228 expression = this->CheckAndRewriteReferenceExpression(
2205 expression, beg_pos, scanner()->location().end_pos, 2229 expression, beg_pos, scanner()->location().end_pos,
(...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after
3083 has_seen_constructor_ = true; 3107 has_seen_constructor_ = true;
3084 return; 3108 return;
3085 } 3109 }
3086 } 3110 }
3087 3111
3088 3112
3089 } // namespace internal 3113 } // namespace internal
3090 } // namespace v8 3114 } // namespace v8
3091 3115
3092 #endif // V8_PARSING_PARSER_BASE_H 3116 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698