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_PREPARSER_H | 5 #ifndef V8_PREPARSER_H |
6 #define V8_PREPARSER_H | 6 #define V8_PREPARSER_H |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/func-name-inferrer.h" | 10 #include "src/func-name-inferrer.h" |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 int handler_count() { return next_handler_index_; } | 172 int handler_count() { return next_handler_index_; } |
173 | 173 |
174 void AddProperty() { expected_property_count_++; } | 174 void AddProperty() { expected_property_count_++; } |
175 int expected_property_count() { return expected_property_count_; } | 175 int expected_property_count() { return expected_property_count_; } |
176 | 176 |
177 void set_is_generator(bool is_generator) { is_generator_ = is_generator; } | 177 void set_is_generator(bool is_generator) { is_generator_ = is_generator; } |
178 bool is_generator() const { return is_generator_; } | 178 bool is_generator() const { return is_generator_; } |
179 | 179 |
180 void set_generator_object_variable( | 180 void set_generator_object_variable( |
181 typename Traits::Type::GeneratorVariable* variable) { | 181 typename Traits::Type::GeneratorVariable* variable) { |
182 ASSERT(variable != NULL); | 182 DCHECK(variable != NULL); |
183 ASSERT(!is_generator()); | 183 DCHECK(!is_generator()); |
184 generator_object_variable_ = variable; | 184 generator_object_variable_ = variable; |
185 is_generator_ = true; | 185 is_generator_ = true; |
186 } | 186 } |
187 typename Traits::Type::GeneratorVariable* generator_object_variable() | 187 typename Traits::Type::GeneratorVariable* generator_object_variable() |
188 const { | 188 const { |
189 return generator_object_variable_; | 189 return generator_object_variable_; |
190 } | 190 } |
191 | 191 |
192 typename Traits::Type::Factory* factory() { return &factory_; } | 192 typename Traits::Type::Factory* factory() { return &factory_; } |
193 | 193 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 stack_overflow_ = true; | 260 stack_overflow_ = true; |
261 } | 261 } |
262 } | 262 } |
263 return scanner()->Next(); | 263 return scanner()->Next(); |
264 } | 264 } |
265 | 265 |
266 void Consume(Token::Value token) { | 266 void Consume(Token::Value token) { |
267 Token::Value next = Next(); | 267 Token::Value next = Next(); |
268 USE(next); | 268 USE(next); |
269 USE(token); | 269 USE(token); |
270 ASSERT(next == token); | 270 DCHECK(next == token); |
271 } | 271 } |
272 | 272 |
273 bool Check(Token::Value token) { | 273 bool Check(Token::Value token) { |
274 Token::Value next = peek(); | 274 Token::Value next = peek(); |
275 if (next == token) { | 275 if (next == token) { |
276 Consume(next); | 276 Consume(next); |
277 return true; | 277 return true; |
278 } | 278 } |
279 return false; | 279 return false; |
280 } | 280 } |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 return PreParserExpression(kPropertyExpression); | 660 return PreParserExpression(kPropertyExpression); |
661 } | 661 } |
662 | 662 |
663 static PreParserExpression Call() { | 663 static PreParserExpression Call() { |
664 return PreParserExpression(kCallExpression); | 664 return PreParserExpression(kCallExpression); |
665 } | 665 } |
666 | 666 |
667 bool IsIdentifier() const { return (code_ & kTypeMask) == kTypeIdentifier; } | 667 bool IsIdentifier() const { return (code_ & kTypeMask) == kTypeIdentifier; } |
668 | 668 |
669 PreParserIdentifier AsIdentifier() const { | 669 PreParserIdentifier AsIdentifier() const { |
670 ASSERT(IsIdentifier()); | 670 DCHECK(IsIdentifier()); |
671 return PreParserIdentifier( | 671 return PreParserIdentifier( |
672 static_cast<PreParserIdentifier::Type>(code_ >> kIdentifierShift)); | 672 static_cast<PreParserIdentifier::Type>(code_ >> kIdentifierShift)); |
673 } | 673 } |
674 | 674 |
675 bool IsStringLiteral() const { | 675 bool IsStringLiteral() const { |
676 return (code_ & kTypeMask) == kTypeStringLiteral; | 676 return (code_ & kTypeMask) == kTypeStringLiteral; |
677 } | 677 } |
678 | 678 |
679 bool IsUseStrictLiteral() const { | 679 bool IsUseStrictLiteral() const { |
680 return (code_ & kUseStrictString) == kUseStrictString; | 680 return (code_ & kUseStrictString) == kUseStrictString; |
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1519 return ReportMessageAt(source_location, "unexpected_token_identifier"); | 1519 return ReportMessageAt(source_location, "unexpected_token_identifier"); |
1520 case Token::FUTURE_RESERVED_WORD: | 1520 case Token::FUTURE_RESERVED_WORD: |
1521 return ReportMessageAt(source_location, "unexpected_reserved"); | 1521 return ReportMessageAt(source_location, "unexpected_reserved"); |
1522 case Token::LET: | 1522 case Token::LET: |
1523 case Token::YIELD: | 1523 case Token::YIELD: |
1524 case Token::FUTURE_STRICT_RESERVED_WORD: | 1524 case Token::FUTURE_STRICT_RESERVED_WORD: |
1525 return ReportMessageAt(source_location, strict_mode() == SLOPPY | 1525 return ReportMessageAt(source_location, strict_mode() == SLOPPY |
1526 ? "unexpected_token_identifier" : "unexpected_strict_reserved"); | 1526 ? "unexpected_token_identifier" : "unexpected_strict_reserved"); |
1527 default: | 1527 default: |
1528 const char* name = Token::String(token); | 1528 const char* name = Token::String(token); |
1529 ASSERT(name != NULL); | 1529 DCHECK(name != NULL); |
1530 Traits::ReportMessageAt(source_location, "unexpected_token", name); | 1530 Traits::ReportMessageAt(source_location, "unexpected_token", name); |
1531 } | 1531 } |
1532 } | 1532 } |
1533 | 1533 |
1534 | 1534 |
1535 template<class Traits> | 1535 template<class Traits> |
1536 typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier( | 1536 typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier( |
1537 AllowEvalOrArgumentsAsIdentifier allow_eval_or_arguments, | 1537 AllowEvalOrArgumentsAsIdentifier allow_eval_or_arguments, |
1538 bool* ok) { | 1538 bool* ok) { |
1539 Token::Value next = Next(); | 1539 Token::Value next = Next(); |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2080 case Token::RBRACK: | 2080 case Token::RBRACK: |
2081 case Token::RPAREN: | 2081 case Token::RPAREN: |
2082 case Token::COLON: | 2082 case Token::COLON: |
2083 case Token::COMMA: | 2083 case Token::COMMA: |
2084 // The above set of tokens is the complete set of tokens that can appear | 2084 // The above set of tokens is the complete set of tokens that can appear |
2085 // after an AssignmentExpression, and none of them can start an | 2085 // after an AssignmentExpression, and none of them can start an |
2086 // AssignmentExpression. This allows us to avoid looking for an RHS for | 2086 // AssignmentExpression. This allows us to avoid looking for an RHS for |
2087 // a Yield::SUSPEND operation, given only one look-ahead token. | 2087 // a Yield::SUSPEND operation, given only one look-ahead token. |
2088 if (kind == Yield::SUSPEND) | 2088 if (kind == Yield::SUSPEND) |
2089 break; | 2089 break; |
2090 ASSERT(kind == Yield::DELEGATING); | 2090 DCHECK(kind == Yield::DELEGATING); |
2091 // Delegating yields require an RHS; fall through. | 2091 // Delegating yields require an RHS; fall through. |
2092 default: | 2092 default: |
2093 expression = ParseAssignmentExpression(false, CHECK_OK); | 2093 expression = ParseAssignmentExpression(false, CHECK_OK); |
2094 break; | 2094 break; |
2095 } | 2095 } |
2096 } | 2096 } |
2097 typename Traits::Type::YieldExpression yield = | 2097 typename Traits::Type::YieldExpression yield = |
2098 factory()->NewYield(generator_object, expression, kind, pos); | 2098 factory()->NewYield(generator_object, expression, kind, pos); |
2099 if (kind == Yield::DELEGATING) { | 2099 if (kind == Yield::DELEGATING) { |
2100 yield->set_index(function_state_->NextHandlerIndex()); | 2100 yield->set_index(function_state_->NextHandlerIndex()); |
(...skipping 22 matching lines...) Expand all Loading... |
2123 Expect(Token::COLON, CHECK_OK); | 2123 Expect(Token::COLON, CHECK_OK); |
2124 ExpressionT right = ParseAssignmentExpression(accept_IN, CHECK_OK); | 2124 ExpressionT right = ParseAssignmentExpression(accept_IN, CHECK_OK); |
2125 return factory()->NewConditional(expression, left, right, pos); | 2125 return factory()->NewConditional(expression, left, right, pos); |
2126 } | 2126 } |
2127 | 2127 |
2128 | 2128 |
2129 // Precedence >= 4 | 2129 // Precedence >= 4 |
2130 template <class Traits> | 2130 template <class Traits> |
2131 typename ParserBase<Traits>::ExpressionT | 2131 typename ParserBase<Traits>::ExpressionT |
2132 ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) { | 2132 ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, bool* ok) { |
2133 ASSERT(prec >= 4); | 2133 DCHECK(prec >= 4); |
2134 ExpressionT x = this->ParseUnaryExpression(CHECK_OK); | 2134 ExpressionT x = this->ParseUnaryExpression(CHECK_OK); |
2135 for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) { | 2135 for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) { |
2136 // prec1 >= 4 | 2136 // prec1 >= 4 |
2137 while (Precedence(peek(), accept_IN) == prec1) { | 2137 while (Precedence(peek(), accept_IN) == prec1) { |
2138 Token::Value op = Next(); | 2138 Token::Value op = Next(); |
2139 int pos = position(); | 2139 int pos = position(); |
2140 ExpressionT y = ParseBinaryExpression(prec1 + 1, accept_IN, CHECK_OK); | 2140 ExpressionT y = ParseBinaryExpression(prec1 + 1, accept_IN, CHECK_OK); |
2141 | 2141 |
2142 if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos, | 2142 if (this->ShortcutNumericLiteralBinaryExpression(&x, y, op, pos, |
2143 factory())) { | 2143 factory())) { |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2431 expression, factory()->NewStringLiteral(name, pos), pos); | 2431 expression, factory()->NewStringLiteral(name, pos), pos); |
2432 if (fni_ != NULL) { | 2432 if (fni_ != NULL) { |
2433 this->PushLiteralName(fni_, name); | 2433 this->PushLiteralName(fni_, name); |
2434 } | 2434 } |
2435 break; | 2435 break; |
2436 } | 2436 } |
2437 default: | 2437 default: |
2438 return expression; | 2438 return expression; |
2439 } | 2439 } |
2440 } | 2440 } |
2441 ASSERT(false); | 2441 DCHECK(false); |
2442 return this->EmptyExpression(); | 2442 return this->EmptyExpression(); |
2443 } | 2443 } |
2444 | 2444 |
2445 | 2445 |
2446 template <class Traits> | 2446 template <class Traits> |
2447 typename ParserBase<Traits>::ExpressionT ParserBase< | 2447 typename ParserBase<Traits>::ExpressionT ParserBase< |
2448 Traits>::ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, | 2448 Traits>::ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, |
2449 bool* ok) { | 2449 bool* ok) { |
2450 // TODO(aperez): Change this to use ARROW_SCOPE | 2450 // TODO(aperez): Change this to use ARROW_SCOPE |
2451 typename Traits::Type::ScopePtr scope = | 2451 typename Traits::Type::ScopePtr scope = |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2607 PropertyKind old_type = static_cast<PropertyKind>(old); | 2607 PropertyKind old_type = static_cast<PropertyKind>(old); |
2608 if (HasConflict(old_type, type)) { | 2608 if (HasConflict(old_type, type)) { |
2609 if (IsDataDataConflict(old_type, type)) { | 2609 if (IsDataDataConflict(old_type, type)) { |
2610 // Both are data properties. | 2610 // Both are data properties. |
2611 if (strict_mode_ == SLOPPY) return; | 2611 if (strict_mode_ == SLOPPY) return; |
2612 parser()->ReportMessage("strict_duplicate_property"); | 2612 parser()->ReportMessage("strict_duplicate_property"); |
2613 } else if (IsDataAccessorConflict(old_type, type)) { | 2613 } else if (IsDataAccessorConflict(old_type, type)) { |
2614 // Both a data and an accessor property with the same name. | 2614 // Both a data and an accessor property with the same name. |
2615 parser()->ReportMessage("accessor_data_property"); | 2615 parser()->ReportMessage("accessor_data_property"); |
2616 } else { | 2616 } else { |
2617 ASSERT(IsAccessorAccessorConflict(old_type, type)); | 2617 DCHECK(IsAccessorAccessorConflict(old_type, type)); |
2618 // Both accessors of the same type. | 2618 // Both accessors of the same type. |
2619 parser()->ReportMessage("accessor_get_set"); | 2619 parser()->ReportMessage("accessor_get_set"); |
2620 } | 2620 } |
2621 *ok = false; | 2621 *ok = false; |
2622 } | 2622 } |
2623 } | 2623 } |
2624 | 2624 |
2625 | 2625 |
2626 } } // v8::internal | 2626 } } // v8::internal |
2627 | 2627 |
2628 #endif // V8_PREPARSER_H | 2628 #endif // V8_PREPARSER_H |
OLD | NEW |