Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Side by Side Diff: src/preparser.h

Issue 422923004: Track usage of "this" and "arguments" in Scope (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix nits Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | src/runtime/runtime-debug.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 609 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 static PreParserIdentifier Yield() { 620 static PreParserIdentifier Yield() {
621 return PreParserIdentifier(kYieldIdentifier); 621 return PreParserIdentifier(kYieldIdentifier);
622 } 622 }
623 static PreParserIdentifier Prototype() { 623 static PreParserIdentifier Prototype() {
624 return PreParserIdentifier(kPrototypeIdentifier); 624 return PreParserIdentifier(kPrototypeIdentifier);
625 } 625 }
626 static PreParserIdentifier Constructor() { 626 static PreParserIdentifier Constructor() {
627 return PreParserIdentifier(kConstructorIdentifier); 627 return PreParserIdentifier(kConstructorIdentifier);
628 } 628 }
629 bool IsEval() const { return type_ == kEvalIdentifier; } 629 bool IsEval() const { return type_ == kEvalIdentifier; }
630 bool IsArguments() const { return type_ == kArgumentsIdentifier; } 630 bool IsArguments(const AstValueFactory* = NULL) const {
631 return type_ == kArgumentsIdentifier;
632 }
631 bool IsYield() const { return type_ == kYieldIdentifier; } 633 bool IsYield() const { return type_ == kYieldIdentifier; }
632 bool IsPrototype() const { return type_ == kPrototypeIdentifier; } 634 bool IsPrototype() const { return type_ == kPrototypeIdentifier; }
633 bool IsConstructor() const { return type_ == kConstructorIdentifier; } 635 bool IsConstructor() const { return type_ == kConstructorIdentifier; }
634 bool IsEvalOrArguments() const { 636 bool IsEvalOrArguments() const {
635 return type_ == kEvalIdentifier || type_ == kArgumentsIdentifier; 637 return type_ == kEvalIdentifier || type_ == kArgumentsIdentifier;
636 } 638 }
637 bool IsFutureReserved() const { return type_ == kFutureReservedIdentifier; } 639 bool IsFutureReserved() const { return type_ == kFutureReservedIdentifier; }
638 bool IsFutureStrictReserved() const { 640 bool IsFutureStrictReserved() const {
639 return type_ == kFutureStrictReservedIdentifier; 641 return type_ == kFutureStrictReservedIdentifier;
640 } 642 }
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 963
962 // When PreParser is in use, lazy compilation is already being done, 964 // When PreParser is in use, lazy compilation is already being done,
963 // things cannot get lazier than that. 965 // things cannot get lazier than that.
964 bool AllowsLazyCompilation() const { return false; } 966 bool AllowsLazyCompilation() const { return false; }
965 967
966 void set_start_position(int position) {} 968 void set_start_position(int position) {}
967 void set_end_position(int position) {} 969 void set_end_position(int position) {}
968 970
969 bool IsDeclared(const PreParserIdentifier& identifier) const { return false; } 971 bool IsDeclared(const PreParserIdentifier& identifier) const { return false; }
970 void DeclareParameter(const PreParserIdentifier& identifier, VariableMode) {} 972 void DeclareParameter(const PreParserIdentifier& identifier, VariableMode) {}
973 void RecordArgumentsUsage() {}
974 void RecordThisUsage() {}
971 975
972 // Allow scope->Foo() to work. 976 // Allow scope->Foo() to work.
973 PreParserScope* operator->() { return this; } 977 PreParserScope* operator->() { return this; }
974 978
975 private: 979 private:
976 ScopeType scope_type_; 980 ScopeType scope_type_;
977 StrictMode strict_mode_; 981 StrictMode strict_mode_;
978 }; 982 };
979 983
980 984
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after
1648 AllowEvalOrArgumentsAsIdentifier allow_eval_or_arguments, 1652 AllowEvalOrArgumentsAsIdentifier allow_eval_or_arguments,
1649 bool* ok) { 1653 bool* ok) {
1650 Token::Value next = Next(); 1654 Token::Value next = Next();
1651 if (next == Token::IDENTIFIER) { 1655 if (next == Token::IDENTIFIER) {
1652 IdentifierT name = this->GetSymbol(scanner()); 1656 IdentifierT name = this->GetSymbol(scanner());
1653 if (allow_eval_or_arguments == kDontAllowEvalOrArguments && 1657 if (allow_eval_or_arguments == kDontAllowEvalOrArguments &&
1654 strict_mode() == STRICT && this->IsEvalOrArguments(name)) { 1658 strict_mode() == STRICT && this->IsEvalOrArguments(name)) {
1655 ReportMessage("strict_eval_arguments"); 1659 ReportMessage("strict_eval_arguments");
1656 *ok = false; 1660 *ok = false;
1657 } 1661 }
1662 if (name->IsArguments(this->ast_value_factory()))
1663 scope_->RecordArgumentsUsage();
1658 return name; 1664 return name;
1659 } else if (strict_mode() == SLOPPY && 1665 } else if (strict_mode() == SLOPPY &&
1660 (next == Token::FUTURE_STRICT_RESERVED_WORD || 1666 (next == Token::FUTURE_STRICT_RESERVED_WORD ||
1661 (next == Token::LET) || 1667 (next == Token::LET) ||
1662 (next == Token::YIELD && !is_generator()))) { 1668 (next == Token::YIELD && !is_generator()))) {
1663 return this->GetSymbol(scanner()); 1669 return this->GetSymbol(scanner());
1664 } else { 1670 } else {
1665 this->ReportUnexpectedToken(next); 1671 this->ReportUnexpectedToken(next);
1666 *ok = false; 1672 *ok = false;
1667 return Traits::EmptyIdentifier(); 1673 return Traits::EmptyIdentifier();
(...skipping 10 matching lines...) Expand all
1678 *is_strict_reserved = false; 1684 *is_strict_reserved = false;
1679 } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || 1685 } else if (next == Token::FUTURE_STRICT_RESERVED_WORD ||
1680 next == Token::LET || 1686 next == Token::LET ||
1681 (next == Token::YIELD && !this->is_generator())) { 1687 (next == Token::YIELD && !this->is_generator())) {
1682 *is_strict_reserved = true; 1688 *is_strict_reserved = true;
1683 } else { 1689 } else {
1684 ReportUnexpectedToken(next); 1690 ReportUnexpectedToken(next);
1685 *ok = false; 1691 *ok = false;
1686 return Traits::EmptyIdentifier(); 1692 return Traits::EmptyIdentifier();
1687 } 1693 }
1688 return this->GetSymbol(scanner()); 1694
1695 IdentifierT name = this->GetSymbol(scanner());
1696 if (name->IsArguments(this->ast_value_factory()))
1697 scope_->RecordArgumentsUsage();
1698 return name;
1689 } 1699 }
1690 1700
1691 1701
1692 template <class Traits> 1702 template <class Traits>
1693 typename ParserBase<Traits>::IdentifierT 1703 typename ParserBase<Traits>::IdentifierT
1694 ParserBase<Traits>::ParseIdentifierName(bool* ok) { 1704 ParserBase<Traits>::ParseIdentifierName(bool* ok) {
1695 Token::Value next = Next(); 1705 Token::Value next = Next();
1696 if (next != Token::IDENTIFIER && next != Token::FUTURE_RESERVED_WORD && 1706 if (next != Token::IDENTIFIER && next != Token::FUTURE_RESERVED_WORD &&
1697 next != Token::LET && next != Token::YIELD && 1707 next != Token::LET && next != Token::YIELD &&
1698 next != Token::FUTURE_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) { 1708 next != Token::FUTURE_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) {
1699 this->ReportUnexpectedToken(next); 1709 this->ReportUnexpectedToken(next);
1700 *ok = false; 1710 *ok = false;
1701 return Traits::EmptyIdentifier(); 1711 return Traits::EmptyIdentifier();
1702 } 1712 }
1703 return this->GetSymbol(scanner()); 1713
1714 IdentifierT name = this->GetSymbol(scanner());
1715 if (name->IsArguments(this->ast_value_factory()))
1716 scope_->RecordArgumentsUsage();
1717 return name;
1704 } 1718 }
1705 1719
1706 1720
1707 template <class Traits> 1721 template <class Traits>
1708 typename ParserBase<Traits>::IdentifierT 1722 typename ParserBase<Traits>::IdentifierT
1709 ParserBase<Traits>::ParseIdentifierNameOrGetOrSet(bool* is_get, 1723 ParserBase<Traits>::ParseIdentifierNameOrGetOrSet(bool* is_get,
1710 bool* is_set, 1724 bool* is_set,
1711 bool* ok) { 1725 bool* ok) {
1712 IdentifierT result = ParseIdentifierName(ok); 1726 IdentifierT result = ParseIdentifierName(ok);
1713 if (!*ok) return Traits::EmptyIdentifier(); 1727 if (!*ok) return Traits::EmptyIdentifier();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1771 // RegExpLiteral 1785 // RegExpLiteral
1772 // ClassLiteral 1786 // ClassLiteral
1773 // '(' Expression ')' 1787 // '(' Expression ')'
1774 1788
1775 int pos = peek_position(); 1789 int pos = peek_position();
1776 ExpressionT result = this->EmptyExpression(); 1790 ExpressionT result = this->EmptyExpression();
1777 Token::Value token = peek(); 1791 Token::Value token = peek();
1778 switch (token) { 1792 switch (token) {
1779 case Token::THIS: { 1793 case Token::THIS: {
1780 Consume(Token::THIS); 1794 Consume(Token::THIS);
1795 scope_->RecordThisUsage();
1781 result = this->ThisExpression(scope_, factory()); 1796 result = this->ThisExpression(scope_, factory());
1782 break; 1797 break;
1783 } 1798 }
1784 1799
1785 case Token::NULL_LITERAL: 1800 case Token::NULL_LITERAL:
1786 case Token::TRUE_LITERAL: 1801 case Token::TRUE_LITERAL:
1787 case Token::FALSE_LITERAL: 1802 case Token::FALSE_LITERAL:
1788 case Token::NUMBER: 1803 case Token::NUMBER:
1789 Next(); 1804 Next();
1790 result = this->ExpressionFromLiteral(token, pos, scanner(), factory()); 1805 result = this->ExpressionFromLiteral(token, pos, scanner(), factory());
(...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after
2618 } 2633 }
2619 DCHECK(false); 2634 DCHECK(false);
2620 return this->EmptyExpression(); 2635 return this->EmptyExpression();
2621 } 2636 }
2622 2637
2623 2638
2624 template <class Traits> 2639 template <class Traits>
2625 typename ParserBase<Traits>::ExpressionT ParserBase< 2640 typename ParserBase<Traits>::ExpressionT ParserBase<
2626 Traits>::ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast, 2641 Traits>::ParseArrowFunctionLiteral(int start_pos, ExpressionT params_ast,
2627 bool* ok) { 2642 bool* ok) {
2628 // TODO(aperez): Change this to use ARROW_SCOPE 2643 typename Traits::Type::ScopePtr scope = this->NewScope(scope_, ARROW_SCOPE);
2629 typename Traits::Type::ScopePtr scope =
2630 this->NewScope(scope_, FUNCTION_SCOPE);
2631 typename Traits::Type::StatementList body; 2644 typename Traits::Type::StatementList body;
2632 typename Traits::Type::AstProperties ast_properties; 2645 typename Traits::Type::AstProperties ast_properties;
2633 BailoutReason dont_optimize_reason = kNoReason; 2646 BailoutReason dont_optimize_reason = kNoReason;
2634 int num_parameters = -1; 2647 int num_parameters = -1;
2635 int materialized_literal_count = -1; 2648 int materialized_literal_count = -1;
2636 int expected_property_count = -1; 2649 int expected_property_count = -1;
2637 int handler_count = 0; 2650 int handler_count = 0;
2638 2651
2639 { 2652 {
2640 FunctionState function_state(&function_state_, &scope_, &scope, zone(), 2653 FunctionState function_state(&function_state_, &scope_, &scope, zone(),
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
2845 DCHECK(IsAccessorAccessorConflict(old_type, type)); 2858 DCHECK(IsAccessorAccessorConflict(old_type, type));
2846 // Both accessors of the same type. 2859 // Both accessors of the same type.
2847 parser()->ReportMessage("accessor_get_set"); 2860 parser()->ReportMessage("accessor_get_set");
2848 } 2861 }
2849 *ok = false; 2862 *ok = false;
2850 } 2863 }
2851 } 2864 }
2852 } } // v8::internal 2865 } } // v8::internal
2853 2866
2854 #endif // V8_PREPARSER_H 2867 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/runtime/runtime-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698