OLD | NEW |
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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 allow_strong_mode_(false), | 117 allow_strong_mode_(false), |
118 allow_legacy_const_(true), | 118 allow_legacy_const_(true), |
119 allow_harmony_do_expressions_(false), | 119 allow_harmony_do_expressions_(false), |
120 allow_harmony_function_name_(false), | 120 allow_harmony_function_name_(false), |
121 allow_harmony_function_sent_(false) {} | 121 allow_harmony_function_sent_(false) {} |
122 | 122 |
123 #define ALLOW_ACCESSORS(name) \ | 123 #define ALLOW_ACCESSORS(name) \ |
124 bool allow_##name() const { return allow_##name##_; } \ | 124 bool allow_##name() const { return allow_##name##_; } \ |
125 void set_allow_##name(bool allow) { allow_##name##_ = allow; } | 125 void set_allow_##name(bool allow) { allow_##name##_ = allow; } |
126 | 126 |
| 127 #define SCANNER_ACCESSORS(name) \ |
| 128 bool allow_##name() const { return scanner_->allow_##name(); } \ |
| 129 void set_allow_##name(bool allow) { \ |
| 130 return scanner_->set_allow_##name(allow); \ |
| 131 } |
| 132 |
127 ALLOW_ACCESSORS(lazy); | 133 ALLOW_ACCESSORS(lazy); |
128 ALLOW_ACCESSORS(natives); | 134 ALLOW_ACCESSORS(natives); |
129 ALLOW_ACCESSORS(harmony_sloppy); | 135 ALLOW_ACCESSORS(harmony_sloppy); |
130 ALLOW_ACCESSORS(harmony_sloppy_function); | 136 ALLOW_ACCESSORS(harmony_sloppy_function); |
131 ALLOW_ACCESSORS(harmony_sloppy_let); | 137 ALLOW_ACCESSORS(harmony_sloppy_let); |
132 ALLOW_ACCESSORS(harmony_default_parameters); | 138 ALLOW_ACCESSORS(harmony_default_parameters); |
133 ALLOW_ACCESSORS(harmony_destructuring_bind); | 139 ALLOW_ACCESSORS(harmony_destructuring_bind); |
134 ALLOW_ACCESSORS(harmony_destructuring_assignment); | 140 ALLOW_ACCESSORS(harmony_destructuring_assignment); |
135 ALLOW_ACCESSORS(strong_mode); | 141 ALLOW_ACCESSORS(strong_mode); |
136 ALLOW_ACCESSORS(legacy_const); | 142 ALLOW_ACCESSORS(legacy_const); |
137 ALLOW_ACCESSORS(harmony_do_expressions); | 143 ALLOW_ACCESSORS(harmony_do_expressions); |
138 ALLOW_ACCESSORS(harmony_function_name); | 144 ALLOW_ACCESSORS(harmony_function_name); |
139 ALLOW_ACCESSORS(harmony_function_sent); | 145 ALLOW_ACCESSORS(harmony_function_sent); |
| 146 SCANNER_ACCESSORS(harmony_exponentiation_operator); |
140 #undef ALLOW_ACCESSORS | 147 #undef ALLOW_ACCESSORS |
141 | 148 |
142 uintptr_t stack_limit() const { return stack_limit_; } | 149 uintptr_t stack_limit() const { return stack_limit_; } |
143 | 150 |
144 protected: | 151 protected: |
145 enum AllowRestrictedIdentifiers { | 152 enum AllowRestrictedIdentifiers { |
146 kAllowRestrictedIdentifiers, | 153 kAllowRestrictedIdentifiers, |
147 kDontAllowRestrictedIdentifiers | 154 kDontAllowRestrictedIdentifiers |
148 }; | 155 }; |
149 | 156 |
(...skipping 1951 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2101 fni_->Infer(); | 2108 fni_->Infer(); |
2102 } else { | 2109 } else { |
2103 fni_->RemoveLastFunction(); | 2110 fni_->RemoveLastFunction(); |
2104 } | 2111 } |
2105 } | 2112 } |
2106 | 2113 |
2107 if (op == Token::ASSIGN && allow_harmony_function_name()) { | 2114 if (op == Token::ASSIGN && allow_harmony_function_name()) { |
2108 Traits::SetFunctionNameFromIdentifierRef(right, expression); | 2115 Traits::SetFunctionNameFromIdentifierRef(right, expression); |
2109 } | 2116 } |
2110 | 2117 |
| 2118 if (op == Token::ASSIGN_EXP) { |
| 2119 DCHECK(!is_destructuring_assignment); |
| 2120 return Traits::RewriteExponentiation(expression, right, op, pos); |
| 2121 } |
| 2122 |
2111 ExpressionT result = factory()->NewAssignment(op, expression, right, pos); | 2123 ExpressionT result = factory()->NewAssignment(op, expression, right, pos); |
2112 | 2124 |
2113 if (is_destructuring_assignment) { | 2125 if (is_destructuring_assignment) { |
2114 result = factory()->NewRewritableExpression(result); | 2126 result = factory()->NewRewritableExpression(result); |
2115 Traits::QueueDestructuringAssignmentForRewriting(result); | 2127 Traits::QueueDestructuringAssignmentForRewriting(result); |
2116 } | 2128 } |
2117 | 2129 |
2118 return result; | 2130 return result; |
2119 } | 2131 } |
2120 | 2132 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2210 ExpressionT x = this->ParseUnaryExpression(classifier, CHECK_OK); | 2222 ExpressionT x = this->ParseUnaryExpression(classifier, CHECK_OK); |
2211 for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) { | 2223 for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) { |
2212 // prec1 >= 4 | 2224 // prec1 >= 4 |
2213 while (Precedence(peek(), accept_IN) == prec1) { | 2225 while (Precedence(peek(), accept_IN) == prec1) { |
2214 Traits::RewriteNonPattern(classifier, CHECK_OK); | 2226 Traits::RewriteNonPattern(classifier, CHECK_OK); |
2215 BindingPatternUnexpectedToken(classifier); | 2227 BindingPatternUnexpectedToken(classifier); |
2216 ArrowFormalParametersUnexpectedToken(classifier); | 2228 ArrowFormalParametersUnexpectedToken(classifier); |
2217 Token::Value op = Next(); | 2229 Token::Value op = Next(); |
2218 Scanner::Location op_location = scanner()->location(); | 2230 Scanner::Location op_location = scanner()->location(); |
2219 int pos = position(); | 2231 int pos = position(); |
| 2232 |
| 2233 const bool is_right_associative = op == Token::EXP; |
| 2234 const int next_prec = is_right_associative ? prec1 : prec1 + 1; |
2220 ExpressionT y = | 2235 ExpressionT y = |
2221 ParseBinaryExpression(prec1 + 1, accept_IN, classifier, CHECK_OK); | 2236 ParseBinaryExpression(next_prec, accept_IN, classifier, CHECK_OK); |
2222 Traits::RewriteNonPattern(classifier, CHECK_OK); | 2237 Traits::RewriteNonPattern(classifier, CHECK_OK); |
2223 | 2238 |
2224 if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos, | 2239 if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos, |
2225 factory())) { | 2240 factory())) { |
2226 continue; | 2241 continue; |
2227 } | 2242 } |
2228 | 2243 |
2229 // For now we distinguish between comparisons and other binary | 2244 // For now we distinguish between comparisons and other binary |
2230 // operations. (We could combine the two and get rid of this | 2245 // operations. (We could combine the two and get rid of this |
2231 // code and AST node eventually.) | 2246 // code and AST node eventually.) |
(...skipping 11 matching lines...) Expand all Loading... |
2243 return this->EmptyExpression(); | 2258 return this->EmptyExpression(); |
2244 } else if (FLAG_harmony_instanceof && cmp == Token::INSTANCEOF) { | 2259 } else if (FLAG_harmony_instanceof && cmp == Token::INSTANCEOF) { |
2245 x = Traits::RewriteInstanceof(x, y, pos); | 2260 x = Traits::RewriteInstanceof(x, y, pos); |
2246 } else { | 2261 } else { |
2247 x = factory()->NewCompareOperation(cmp, x, y, pos); | 2262 x = factory()->NewCompareOperation(cmp, x, y, pos); |
2248 if (cmp != op) { | 2263 if (cmp != op) { |
2249 // The comparison was negated - add a NOT. | 2264 // The comparison was negated - add a NOT. |
2250 x = factory()->NewUnaryOperation(Token::NOT, x, pos); | 2265 x = factory()->NewUnaryOperation(Token::NOT, x, pos); |
2251 } | 2266 } |
2252 } | 2267 } |
| 2268 |
| 2269 } else if (op == Token::EXP) { |
| 2270 x = Traits::RewriteExponentiation(x, y, op, pos); |
2253 } else { | 2271 } else { |
2254 // We have a "normal" binary operation. | 2272 // We have a "normal" binary operation. |
2255 x = factory()->NewBinaryOperation(op, x, y, pos); | 2273 x = factory()->NewBinaryOperation(op, x, y, pos); |
2256 } | 2274 } |
2257 } | 2275 } |
2258 } | 2276 } |
2259 return x; | 2277 return x; |
2260 } | 2278 } |
2261 | 2279 |
2262 | 2280 |
(...skipping 29 matching lines...) Expand all Loading... |
2292 *ok = false; | 2310 *ok = false; |
2293 return this->EmptyExpression(); | 2311 return this->EmptyExpression(); |
2294 } else if (this->IsIdentifier(expression)) { | 2312 } else if (this->IsIdentifier(expression)) { |
2295 // "delete identifier" is a syntax error in strict mode. | 2313 // "delete identifier" is a syntax error in strict mode. |
2296 ReportMessage(MessageTemplate::kStrictDelete); | 2314 ReportMessage(MessageTemplate::kStrictDelete); |
2297 *ok = false; | 2315 *ok = false; |
2298 return this->EmptyExpression(); | 2316 return this->EmptyExpression(); |
2299 } | 2317 } |
2300 } | 2318 } |
2301 | 2319 |
| 2320 if (peek() == Token::EXP) { |
| 2321 ReportUnexpectedToken(Next()); |
| 2322 *ok = false; |
| 2323 return this->EmptyExpression(); |
| 2324 } |
| 2325 |
2302 // Allow Traits do rewrite the expression. | 2326 // Allow Traits do rewrite the expression. |
2303 return this->BuildUnaryExpression(expression, op, pos, factory()); | 2327 return this->BuildUnaryExpression(expression, op, pos, factory()); |
2304 } else if (Token::IsCountOp(op)) { | 2328 } else if (Token::IsCountOp(op)) { |
2305 BindingPatternUnexpectedToken(classifier); | 2329 BindingPatternUnexpectedToken(classifier); |
2306 ArrowFormalParametersUnexpectedToken(classifier); | 2330 ArrowFormalParametersUnexpectedToken(classifier); |
2307 op = Next(); | 2331 op = Next(); |
2308 int beg_pos = peek_position(); | 2332 int beg_pos = peek_position(); |
2309 ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK); | 2333 ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK); |
2310 expression = this->CheckAndRewriteReferenceExpression( | 2334 expression = this->CheckAndRewriteReferenceExpression( |
2311 expression, beg_pos, scanner()->location().end_pos, | 2335 expression, beg_pos, scanner()->location().end_pos, |
(...skipping 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3372 has_seen_constructor_ = true; | 3396 has_seen_constructor_ = true; |
3373 return; | 3397 return; |
3374 } | 3398 } |
3375 } | 3399 } |
3376 | 3400 |
3377 | 3401 |
3378 } // namespace internal | 3402 } // namespace internal |
3379 } // namespace v8 | 3403 } // namespace v8 |
3380 | 3404 |
3381 #endif // V8_PARSING_PARSER_BASE_H | 3405 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |