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 |