| 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 |