| 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 874 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 | 885 |
| 886 // When PreParser is in use, lazy compilation is already being done, | 886 // When PreParser is in use, lazy compilation is already being done, |
| 887 // things cannot get lazier than that. | 887 // things cannot get lazier than that. |
| 888 bool AllowsLazyCompilation() const { return false; } | 888 bool AllowsLazyCompilation() const { return false; } |
| 889 | 889 |
| 890 void set_start_position(int position) {} | 890 void set_start_position(int position) {} |
| 891 void set_end_position(int position) {} | 891 void set_end_position(int position) {} |
| 892 | 892 |
| 893 bool IsDeclared(const PreParserIdentifier& identifier) const { return false; } | 893 bool IsDeclared(const PreParserIdentifier& identifier) const { return false; } |
| 894 void DeclareParameter(const PreParserIdentifier& identifier, VariableMode) {} | 894 void DeclareParameter(const PreParserIdentifier& identifier, VariableMode) {} |
| 895 void RecordArgumentsUsage() {} |
| 896 void RecordThisUsage() {} |
| 895 | 897 |
| 896 // Allow scope->Foo() to work. | 898 // Allow scope->Foo() to work. |
| 897 PreParserScope* operator->() { return this; } | 899 PreParserScope* operator->() { return this; } |
| 898 | 900 |
| 899 private: | 901 private: |
| 900 ScopeType scope_type_; | 902 ScopeType scope_type_; |
| 901 StrictMode strict_mode_; | 903 StrictMode strict_mode_; |
| 902 }; | 904 }; |
| 903 | 905 |
| 904 | 906 |
| (...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1537 AllowEvalOrArgumentsAsIdentifier allow_eval_or_arguments, | 1539 AllowEvalOrArgumentsAsIdentifier allow_eval_or_arguments, |
| 1538 bool* ok) { | 1540 bool* ok) { |
| 1539 Token::Value next = Next(); | 1541 Token::Value next = Next(); |
| 1540 if (next == Token::IDENTIFIER) { | 1542 if (next == Token::IDENTIFIER) { |
| 1541 IdentifierT name = this->GetSymbol(scanner()); | 1543 IdentifierT name = this->GetSymbol(scanner()); |
| 1542 if (allow_eval_or_arguments == kDontAllowEvalOrArguments && | 1544 if (allow_eval_or_arguments == kDontAllowEvalOrArguments && |
| 1543 strict_mode() == STRICT && this->IsEvalOrArguments(name)) { | 1545 strict_mode() == STRICT && this->IsEvalOrArguments(name)) { |
| 1544 ReportMessage("strict_eval_arguments"); | 1546 ReportMessage("strict_eval_arguments"); |
| 1545 *ok = false; | 1547 *ok = false; |
| 1546 } | 1548 } |
| 1549 if (name->IsArguments()) scope_->RecordArgumentsUsage(); |
| 1547 return name; | 1550 return name; |
| 1548 } else if (strict_mode() == SLOPPY && | 1551 } else if (strict_mode() == SLOPPY && |
| 1549 (next == Token::FUTURE_STRICT_RESERVED_WORD || | 1552 (next == Token::FUTURE_STRICT_RESERVED_WORD || |
| 1550 (next == Token::LET) || | 1553 (next == Token::LET) || |
| 1551 (next == Token::YIELD && !is_generator()))) { | 1554 (next == Token::YIELD && !is_generator()))) { |
| 1552 return this->GetSymbol(scanner()); | 1555 return this->GetSymbol(scanner()); |
| 1553 } else { | 1556 } else { |
| 1554 this->ReportUnexpectedToken(next); | 1557 this->ReportUnexpectedToken(next); |
| 1555 *ok = false; | 1558 *ok = false; |
| 1556 return Traits::EmptyIdentifier(); | 1559 return Traits::EmptyIdentifier(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1567 *is_strict_reserved = false; | 1570 *is_strict_reserved = false; |
| 1568 } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || | 1571 } else if (next == Token::FUTURE_STRICT_RESERVED_WORD || |
| 1569 next == Token::LET || | 1572 next == Token::LET || |
| 1570 (next == Token::YIELD && !this->is_generator())) { | 1573 (next == Token::YIELD && !this->is_generator())) { |
| 1571 *is_strict_reserved = true; | 1574 *is_strict_reserved = true; |
| 1572 } else { | 1575 } else { |
| 1573 ReportUnexpectedToken(next); | 1576 ReportUnexpectedToken(next); |
| 1574 *ok = false; | 1577 *ok = false; |
| 1575 return Traits::EmptyIdentifier(); | 1578 return Traits::EmptyIdentifier(); |
| 1576 } | 1579 } |
| 1577 return this->GetSymbol(scanner()); | 1580 |
| 1581 IdentifierT name = this->GetSymbol(scanner()); |
| 1582 if (name->IsArguments()) scope_->RecordArgumentsUsage(); |
| 1583 return name; |
| 1578 } | 1584 } |
| 1579 | 1585 |
| 1580 | 1586 |
| 1581 template <class Traits> | 1587 template <class Traits> |
| 1582 typename ParserBase<Traits>::IdentifierT | 1588 typename ParserBase<Traits>::IdentifierT |
| 1583 ParserBase<Traits>::ParseIdentifierName(bool* ok) { | 1589 ParserBase<Traits>::ParseIdentifierName(bool* ok) { |
| 1584 Token::Value next = Next(); | 1590 Token::Value next = Next(); |
| 1585 if (next != Token::IDENTIFIER && next != Token::FUTURE_RESERVED_WORD && | 1591 if (next != Token::IDENTIFIER && next != Token::FUTURE_RESERVED_WORD && |
| 1586 next != Token::LET && next != Token::YIELD && | 1592 next != Token::LET && next != Token::YIELD && |
| 1587 next != Token::FUTURE_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) { | 1593 next != Token::FUTURE_STRICT_RESERVED_WORD && !Token::IsKeyword(next)) { |
| 1588 this->ReportUnexpectedToken(next); | 1594 this->ReportUnexpectedToken(next); |
| 1589 *ok = false; | 1595 *ok = false; |
| 1590 return Traits::EmptyIdentifier(); | 1596 return Traits::EmptyIdentifier(); |
| 1591 } | 1597 } |
| 1592 return this->GetSymbol(scanner()); | 1598 |
| 1599 IdentifierT name = this->GetSymbol(scanner()); |
| 1600 if (name->IsArguments()) scope_->RecordArgumentsUsage(); |
| 1601 return name; |
| 1593 } | 1602 } |
| 1594 | 1603 |
| 1595 | 1604 |
| 1596 template <class Traits> | 1605 template <class Traits> |
| 1597 typename ParserBase<Traits>::IdentifierT | 1606 typename ParserBase<Traits>::IdentifierT |
| 1598 ParserBase<Traits>::ParseIdentifierNameOrGetOrSet(bool* is_get, | 1607 ParserBase<Traits>::ParseIdentifierNameOrGetOrSet(bool* is_get, |
| 1599 bool* is_set, | 1608 bool* is_set, |
| 1600 bool* ok) { | 1609 bool* ok) { |
| 1601 IdentifierT result = ParseIdentifierName(ok); | 1610 IdentifierT result = ParseIdentifierName(ok); |
| 1602 if (!*ok) return Traits::EmptyIdentifier(); | 1611 if (!*ok) return Traits::EmptyIdentifier(); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1659 // ObjectLiteral | 1668 // ObjectLiteral |
| 1660 // RegExpLiteral | 1669 // RegExpLiteral |
| 1661 // '(' Expression ')' | 1670 // '(' Expression ')' |
| 1662 | 1671 |
| 1663 int pos = peek_position(); | 1672 int pos = peek_position(); |
| 1664 ExpressionT result = this->EmptyExpression(); | 1673 ExpressionT result = this->EmptyExpression(); |
| 1665 Token::Value token = peek(); | 1674 Token::Value token = peek(); |
| 1666 switch (token) { | 1675 switch (token) { |
| 1667 case Token::THIS: { | 1676 case Token::THIS: { |
| 1668 Consume(Token::THIS); | 1677 Consume(Token::THIS); |
| 1678 scope_->RecordThisUsage(); |
| 1669 result = this->ThisExpression(scope_, factory()); | 1679 result = this->ThisExpression(scope_, factory()); |
| 1670 break; | 1680 break; |
| 1671 } | 1681 } |
| 1672 | 1682 |
| 1673 case Token::NULL_LITERAL: | 1683 case Token::NULL_LITERAL: |
| 1674 case Token::TRUE_LITERAL: | 1684 case Token::TRUE_LITERAL: |
| 1675 case Token::FALSE_LITERAL: | 1685 case Token::FALSE_LITERAL: |
| 1676 case Token::NUMBER: | 1686 case Token::NUMBER: |
| 1677 Next(); | 1687 Next(); |
| 1678 result = this->ExpressionFromLiteral(token, pos, scanner(), factory()); | 1688 result = this->ExpressionFromLiteral(token, pos, scanner(), factory()); |
| (...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2619 parser()->ReportMessage("accessor_get_set"); | 2629 parser()->ReportMessage("accessor_get_set"); |
| 2620 } | 2630 } |
| 2621 *ok = false; | 2631 *ok = false; |
| 2622 } | 2632 } |
| 2623 } | 2633 } |
| 2624 | 2634 |
| 2625 | 2635 |
| 2626 } } // v8::internal | 2636 } } // v8::internal |
| 2627 | 2637 |
| 2628 #endif // V8_PREPARSER_H | 2638 #endif // V8_PREPARSER_H |
| OLD | NEW |