| 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/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
| (...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 static PreParserIdentifier Yield() { | 701 static PreParserIdentifier Yield() { |
| 702 return PreParserIdentifier(kYieldIdentifier); | 702 return PreParserIdentifier(kYieldIdentifier); |
| 703 } | 703 } |
| 704 static PreParserIdentifier Prototype() { | 704 static PreParserIdentifier Prototype() { |
| 705 return PreParserIdentifier(kPrototypeIdentifier); | 705 return PreParserIdentifier(kPrototypeIdentifier); |
| 706 } | 706 } |
| 707 static PreParserIdentifier Constructor() { | 707 static PreParserIdentifier Constructor() { |
| 708 return PreParserIdentifier(kConstructorIdentifier); | 708 return PreParserIdentifier(kConstructorIdentifier); |
| 709 } | 709 } |
| 710 bool IsEval() const { return type_ == kEvalIdentifier; } | 710 bool IsEval() const { return type_ == kEvalIdentifier; } |
| 711 bool IsArguments(const AstValueFactory* = NULL) const { | 711 bool IsArguments() const { return type_ == kArgumentsIdentifier; } |
| 712 return type_ == kArgumentsIdentifier; | 712 bool IsEvalOrArguments() const { return IsEval() || IsArguments(); } |
| 713 } | |
| 714 bool IsLet() const { return type_ == kLetIdentifier; } | 713 bool IsLet() const { return type_ == kLetIdentifier; } |
| 715 bool IsStatic() const { return type_ == kStaticIdentifier; } | 714 bool IsStatic() const { return type_ == kStaticIdentifier; } |
| 716 bool IsYield() const { return type_ == kYieldIdentifier; } | 715 bool IsYield() const { return type_ == kYieldIdentifier; } |
| 717 bool IsPrototype() const { return type_ == kPrototypeIdentifier; } | 716 bool IsPrototype() const { return type_ == kPrototypeIdentifier; } |
| 718 bool IsConstructor() const { return type_ == kConstructorIdentifier; } | 717 bool IsConstructor() const { return type_ == kConstructorIdentifier; } |
| 719 bool IsEvalOrArguments() const { | |
| 720 return type_ == kEvalIdentifier || type_ == kArgumentsIdentifier; | |
| 721 } | |
| 722 bool IsFutureReserved() const { return type_ == kFutureReservedIdentifier; } | 718 bool IsFutureReserved() const { return type_ == kFutureReservedIdentifier; } |
| 723 bool IsFutureStrictReserved() const { | 719 bool IsFutureStrictReserved() const { |
| 724 return type_ == kFutureStrictReservedIdentifier || | 720 return type_ == kFutureStrictReservedIdentifier || |
| 725 type_ == kLetIdentifier || type_ == kStaticIdentifier || | 721 type_ == kLetIdentifier || type_ == kStaticIdentifier || |
| 726 type_ == kYieldIdentifier; | 722 type_ == kYieldIdentifier; |
| 727 } | 723 } |
| 728 bool IsValidStrictVariable() const { return type_ == kUnknownIdentifier; } | 724 bool IsValidStrictVariable() const { return type_ == kUnknownIdentifier; } |
| 729 V8_INLINE bool IsValidArrowParam() const { | 725 V8_INLINE bool IsValidArrowParam() const { |
| 730 // A valid identifier can be an arrow function parameter | 726 // A valid identifier can be an arrow function parameter |
| 731 // except for eval, arguments, yield, and reserved keywords. | 727 // except for eval, arguments, yield, and reserved keywords. |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1212 typedef PreParserExpressionList PropertyList; | 1208 typedef PreParserExpressionList PropertyList; |
| 1213 typedef PreParserStatementList StatementList; | 1209 typedef PreParserStatementList StatementList; |
| 1214 | 1210 |
| 1215 // For constructing objects returned by the traversing functions. | 1211 // For constructing objects returned by the traversing functions. |
| 1216 typedef PreParserFactory Factory; | 1212 typedef PreParserFactory Factory; |
| 1217 }; | 1213 }; |
| 1218 | 1214 |
| 1219 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} | 1215 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} |
| 1220 | 1216 |
| 1221 // Helper functions for recursive descent. | 1217 // Helper functions for recursive descent. |
| 1218 static bool IsEval(PreParserIdentifier identifier) { |
| 1219 return identifier.IsEval(); |
| 1220 } |
| 1221 |
| 1222 static bool IsArguments(PreParserIdentifier identifier) { |
| 1223 return identifier.IsArguments(); |
| 1224 } |
| 1225 |
| 1222 static bool IsEvalOrArguments(PreParserIdentifier identifier) { | 1226 static bool IsEvalOrArguments(PreParserIdentifier identifier) { |
| 1223 return identifier.IsEvalOrArguments(); | 1227 return identifier.IsEvalOrArguments(); |
| 1224 } | 1228 } |
| 1225 | 1229 |
| 1226 static bool IsPrototype(PreParserIdentifier identifier) { | 1230 static bool IsPrototype(PreParserIdentifier identifier) { |
| 1227 return identifier.IsPrototype(); | 1231 return identifier.IsPrototype(); |
| 1228 } | 1232 } |
| 1229 | 1233 |
| 1230 static bool IsConstructor(PreParserIdentifier identifier) { | 1234 static bool IsConstructor(PreParserIdentifier identifier) { |
| 1231 return identifier.IsConstructor(); | 1235 return identifier.IsConstructor(); |
| (...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1707 } | 1711 } |
| 1708 | 1712 |
| 1709 | 1713 |
| 1710 template<class Traits> | 1714 template<class Traits> |
| 1711 typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier( | 1715 typename ParserBase<Traits>::IdentifierT ParserBase<Traits>::ParseIdentifier( |
| 1712 AllowEvalOrArgumentsAsIdentifier allow_eval_or_arguments, | 1716 AllowEvalOrArgumentsAsIdentifier allow_eval_or_arguments, |
| 1713 bool* ok) { | 1717 bool* ok) { |
| 1714 Token::Value next = Next(); | 1718 Token::Value next = Next(); |
| 1715 if (next == Token::IDENTIFIER) { | 1719 if (next == Token::IDENTIFIER) { |
| 1716 IdentifierT name = this->GetSymbol(scanner()); | 1720 IdentifierT name = this->GetSymbol(scanner()); |
| 1717 if (allow_eval_or_arguments == kDontAllowEvalOrArguments && | 1721 if (allow_eval_or_arguments == kDontAllowEvalOrArguments) { |
| 1718 is_strict(language_mode()) && this->IsEvalOrArguments(name)) { | 1722 if (is_strict(language_mode()) && this->IsEvalOrArguments(name)) { |
| 1719 ReportMessage("strict_eval_arguments"); | 1723 ReportMessage("strict_eval_arguments"); |
| 1720 *ok = false; | 1724 *ok = false; |
| 1725 } |
| 1726 } else { |
| 1727 if (is_strong(language_mode()) && this->IsArguments(name)) { |
| 1728 ReportMessage("strong_arguments"); |
| 1729 *ok = false; |
| 1730 } |
| 1721 } | 1731 } |
| 1722 if (name->IsArguments(ast_value_factory())) scope_->RecordArgumentsUsage(); | 1732 if (this->IsArguments(name)) scope_->RecordArgumentsUsage(); |
| 1723 return name; | 1733 return name; |
| 1724 } else if (is_sloppy(language_mode()) && | 1734 } else if (is_sloppy(language_mode()) && |
| 1725 (next == Token::FUTURE_STRICT_RESERVED_WORD || | 1735 (next == Token::FUTURE_STRICT_RESERVED_WORD || |
| 1726 next == Token::LET || next == Token::STATIC || | 1736 next == Token::LET || next == Token::STATIC || |
| 1727 (next == Token::YIELD && !is_generator()))) { | 1737 (next == Token::YIELD && !is_generator()))) { |
| 1728 return this->GetSymbol(scanner()); | 1738 return this->GetSymbol(scanner()); |
| 1729 } else { | 1739 } else { |
| 1730 this->ReportUnexpectedToken(next); | 1740 this->ReportUnexpectedToken(next); |
| 1731 *ok = false; | 1741 *ok = false; |
| 1732 return Traits::EmptyIdentifier(); | 1742 return Traits::EmptyIdentifier(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1745 next == Token::STATIC || | 1755 next == Token::STATIC || |
| 1746 (next == Token::YIELD && !this->is_generator())) { | 1756 (next == Token::YIELD && !this->is_generator())) { |
| 1747 *is_strict_reserved = true; | 1757 *is_strict_reserved = true; |
| 1748 } else { | 1758 } else { |
| 1749 ReportUnexpectedToken(next); | 1759 ReportUnexpectedToken(next); |
| 1750 *ok = false; | 1760 *ok = false; |
| 1751 return Traits::EmptyIdentifier(); | 1761 return Traits::EmptyIdentifier(); |
| 1752 } | 1762 } |
| 1753 | 1763 |
| 1754 IdentifierT name = this->GetSymbol(scanner()); | 1764 IdentifierT name = this->GetSymbol(scanner()); |
| 1755 if (name->IsArguments(ast_value_factory())) scope_->RecordArgumentsUsage(); | 1765 if (this->IsArguments(name)) scope_->RecordArgumentsUsage(); |
| 1756 return name; | 1766 return name; |
| 1757 } | 1767 } |
| 1758 | 1768 |
| 1759 | 1769 |
| 1760 template <class Traits> | 1770 template <class Traits> |
| 1761 typename ParserBase<Traits>::IdentifierT | 1771 typename ParserBase<Traits>::IdentifierT |
| 1762 ParserBase<Traits>::ParseIdentifierName(bool* ok) { | 1772 ParserBase<Traits>::ParseIdentifierName(bool* ok) { |
| 1763 Token::Value next = Next(); | 1773 Token::Value next = Next(); |
| 1764 if (next != Token::IDENTIFIER && next != Token::FUTURE_RESERVED_WORD && | 1774 if (next != Token::IDENTIFIER && next != Token::FUTURE_RESERVED_WORD && |
| 1765 next != Token::LET && next != Token::STATIC && next != Token::YIELD && | 1775 next != Token::LET && next != Token::STATIC && next != Token::YIELD && |
| 1766 next != Token::FUTURE_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) { | 1776 next != Token::FUTURE_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) { |
| 1767 this->ReportUnexpectedToken(next); | 1777 this->ReportUnexpectedToken(next); |
| 1768 *ok = false; | 1778 *ok = false; |
| 1769 return Traits::EmptyIdentifier(); | 1779 return Traits::EmptyIdentifier(); |
| 1770 } | 1780 } |
| 1771 | 1781 |
| 1772 IdentifierT name = this->GetSymbol(scanner()); | 1782 IdentifierT name = this->GetSymbol(scanner()); |
| 1773 if (name->IsArguments(ast_value_factory())) scope_->RecordArgumentsUsage(); | 1783 if (this->IsArguments(name)) scope_->RecordArgumentsUsage(); |
| 1774 return name; | 1784 return name; |
| 1775 } | 1785 } |
| 1776 | 1786 |
| 1777 | 1787 |
| 1778 template <class Traits> | 1788 template <class Traits> |
| 1779 typename ParserBase<Traits>::IdentifierT | 1789 typename ParserBase<Traits>::IdentifierT |
| 1780 ParserBase<Traits>::ParseIdentifierNameOrGetOrSet(bool* is_get, | 1790 ParserBase<Traits>::ParseIdentifierNameOrGetOrSet(bool* is_get, |
| 1781 bool* is_set, | 1791 bool* is_set, |
| 1782 bool* ok) { | 1792 bool* ok) { |
| 1783 IdentifierT result = ParseIdentifierName(ok); | 1793 IdentifierT result = ParseIdentifierName(ok); |
| (...skipping 1299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3083 *ok = false; | 3093 *ok = false; |
| 3084 return; | 3094 return; |
| 3085 } | 3095 } |
| 3086 has_seen_constructor_ = true; | 3096 has_seen_constructor_ = true; |
| 3087 return; | 3097 return; |
| 3088 } | 3098 } |
| 3089 } | 3099 } |
| 3090 } } // v8::internal | 3100 } } // v8::internal |
| 3091 | 3101 |
| 3092 #endif // V8_PREPARSER_H | 3102 #endif // V8_PREPARSER_H |
| OLD | NEW |