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_AST_AST_H_ | 5 #ifndef V8_AST_AST_H_ |
6 #define V8_AST_AST_H_ | 6 #define V8_AST_AST_H_ |
7 | 7 |
8 #include "src/ast/ast-value-factory.h" | 8 #include "src/ast/ast-value-factory.h" |
9 #include "src/ast/modules.h" | 9 #include "src/ast/modules.h" |
10 #include "src/ast/variables.h" | 10 #include "src/ast/variables.h" |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 V8_INLINE bool Is##type() const; \ | 206 V8_INLINE bool Is##type() const; \ |
207 V8_INLINE type* As##type(); \ | 207 V8_INLINE type* As##type(); \ |
208 V8_INLINE const type* As##type() const; | 208 V8_INLINE const type* As##type() const; |
209 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 209 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
210 #undef DECLARE_NODE_FUNCTIONS | 210 #undef DECLARE_NODE_FUNCTIONS |
211 | 211 |
212 virtual BreakableStatement* AsBreakableStatement() { return NULL; } | 212 virtual BreakableStatement* AsBreakableStatement() { return NULL; } |
213 virtual IterationStatement* AsIterationStatement() { return NULL; } | 213 virtual IterationStatement* AsIterationStatement() { return NULL; } |
214 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } | 214 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } |
215 | 215 |
216 // The interface for feedback slots, with default no-op implementations for | |
217 // node types which don't actually have this. Note that this is conceptually | |
218 // not really nice, but multiple inheritance would introduce yet another | |
219 // vtable entry per node, something we don't want for space reasons. | |
220 virtual void AssignFeedbackVectorSlots(Isolate* isolate, | |
221 FeedbackVectorSpec* spec, | |
222 FeedbackVectorSlotCache* cache) {} | |
223 | |
224 private: | 216 private: |
225 // Hidden to prevent accidental usage. It would have to load the | 217 // Hidden to prevent accidental usage. It would have to load the |
226 // current zone from the TLS. | 218 // current zone from the TLS. |
227 void* operator new(size_t size); | 219 void* operator new(size_t size); |
228 | 220 |
229 friend class CaseClause; // Generates AST IDs. | 221 friend class CaseClause; // Generates AST IDs. |
230 | 222 |
231 int position_; | 223 int position_; |
232 }; | 224 }; |
233 | 225 |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 } | 789 } |
798 | 790 |
799 Expression* each() const { return each_; } | 791 Expression* each() const { return each_; } |
800 Expression* subject() const { return subject_; } | 792 Expression* subject() const { return subject_; } |
801 | 793 |
802 void set_each(Expression* e) { each_ = e; } | 794 void set_each(Expression* e) { each_ = e; } |
803 void set_subject(Expression* e) { subject_ = e; } | 795 void set_subject(Expression* e) { subject_ = e; } |
804 | 796 |
805 // Type feedback information. | 797 // Type feedback information. |
806 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 798 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
807 FeedbackVectorSlotCache* cache) override; | 799 FeedbackVectorSlotCache* cache); |
808 FeedbackVectorSlot EachFeedbackSlot() const { return each_slot_; } | 800 FeedbackVectorSlot EachFeedbackSlot() const { return each_slot_; } |
809 FeedbackVectorSlot ForInFeedbackSlot() { | 801 FeedbackVectorSlot ForInFeedbackSlot() { |
810 DCHECK(!for_in_feedback_slot_.IsInvalid()); | 802 DCHECK(!for_in_feedback_slot_.IsInvalid()); |
811 return for_in_feedback_slot_; | 803 return for_in_feedback_slot_; |
812 } | 804 } |
813 | 805 |
814 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; | 806 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; |
815 ForInType for_in_type() const { return for_in_type_; } | 807 ForInType for_in_type() const { return for_in_type_; } |
816 void set_for_in_type(ForInType type) { for_in_type_ = type; } | 808 void set_for_in_type(ForInType type) { for_in_type_ = type; } |
817 | 809 |
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1504 | 1496 |
1505 // Unlike other AST nodes, this number of bailout IDs allocated for an | 1497 // Unlike other AST nodes, this number of bailout IDs allocated for an |
1506 // ObjectLiteral can vary, so num_ids() is not a static method. | 1498 // ObjectLiteral can vary, so num_ids() is not a static method. |
1507 int num_ids() const { | 1499 int num_ids() const { |
1508 return parent_num_ids() + 1 + 2 * properties()->length(); | 1500 return parent_num_ids() + 1 + 2 * properties()->length(); |
1509 } | 1501 } |
1510 | 1502 |
1511 // Object literals need one feedback slot for each non-trivial value, as well | 1503 // Object literals need one feedback slot for each non-trivial value, as well |
1512 // as some slots for home objects. | 1504 // as some slots for home objects. |
1513 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1505 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
1514 FeedbackVectorSlotCache* cache) override; | 1506 FeedbackVectorSlotCache* cache); |
1515 | 1507 |
1516 protected: | 1508 protected: |
1517 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, | 1509 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, |
1518 int boilerplate_properties, int pos) | 1510 int boilerplate_properties, int pos) |
1519 : MaterializedLiteral(zone, literal_index, pos), | 1511 : MaterializedLiteral(zone, literal_index, pos), |
1520 properties_(properties), | 1512 properties_(properties), |
1521 boilerplate_properties_(boilerplate_properties), | 1513 boilerplate_properties_(boilerplate_properties), |
1522 fast_elements_(false), | 1514 fast_elements_(false), |
1523 has_elements_(false), | 1515 has_elements_(false), |
1524 may_store_doubles_(false) {} | 1516 may_store_doubles_(false) {} |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1630 first_spread_index_ = -1; | 1622 first_spread_index_ = -1; |
1631 } | 1623 } |
1632 | 1624 |
1633 enum Flags { | 1625 enum Flags { |
1634 kNoFlags = 0, | 1626 kNoFlags = 0, |
1635 kShallowElements = 1, | 1627 kShallowElements = 1, |
1636 kDisableMementos = 1 << 1 | 1628 kDisableMementos = 1 << 1 |
1637 }; | 1629 }; |
1638 | 1630 |
1639 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1631 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
1640 FeedbackVectorSlotCache* cache) override; | 1632 FeedbackVectorSlotCache* cache); |
1641 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } | 1633 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } |
1642 | 1634 |
1643 protected: | 1635 protected: |
1644 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, | 1636 ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, |
1645 int first_spread_index, int literal_index, int pos) | 1637 int first_spread_index, int literal_index, int pos) |
1646 : MaterializedLiteral(zone, literal_index, pos), | 1638 : MaterializedLiteral(zone, literal_index, pos), |
1647 values_(values), | 1639 values_(values), |
1648 first_spread_index_(first_spread_index) {} | 1640 first_spread_index_(first_spread_index) {} |
1649 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } | 1641 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
1650 | 1642 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1703 int end_position() const { return end_position_; } | 1695 int end_position() const { return end_position_; } |
1704 | 1696 |
1705 // Bind this proxy to the variable var. | 1697 // Bind this proxy to the variable var. |
1706 void BindTo(Variable* var); | 1698 void BindTo(Variable* var); |
1707 | 1699 |
1708 bool UsesVariableFeedbackSlot() const { | 1700 bool UsesVariableFeedbackSlot() const { |
1709 return var()->IsUnallocated() || var()->IsLookupSlot(); | 1701 return var()->IsUnallocated() || var()->IsLookupSlot(); |
1710 } | 1702 } |
1711 | 1703 |
1712 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1704 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
1713 FeedbackVectorSlotCache* cache) override; | 1705 FeedbackVectorSlotCache* cache); |
1714 | 1706 |
1715 FeedbackVectorSlot VariableFeedbackSlot() { return variable_feedback_slot_; } | 1707 FeedbackVectorSlot VariableFeedbackSlot() { return variable_feedback_slot_; } |
1716 | 1708 |
1717 static int num_ids() { return parent_num_ids() + 1; } | 1709 static int num_ids() { return parent_num_ids() + 1; } |
1718 BailoutId BeforeId() const { return BailoutId(local_id(0)); } | 1710 BailoutId BeforeId() const { return BailoutId(local_id(0)); } |
1719 | 1711 |
1720 protected: | 1712 protected: |
1721 VariableProxy(Zone* zone, Variable* var, int start_position, | 1713 VariableProxy(Zone* zone, Variable* var, int start_position, |
1722 int end_position); | 1714 int end_position); |
1723 | 1715 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1803 bit_field_ = InlineCacheStateField::update(bit_field_, state); | 1795 bit_field_ = InlineCacheStateField::update(bit_field_, state); |
1804 } | 1796 } |
1805 void mark_for_call() { | 1797 void mark_for_call() { |
1806 bit_field_ = IsForCallField::update(bit_field_, true); | 1798 bit_field_ = IsForCallField::update(bit_field_, true); |
1807 } | 1799 } |
1808 bool is_for_call() const { return IsForCallField::decode(bit_field_); } | 1800 bool is_for_call() const { return IsForCallField::decode(bit_field_); } |
1809 | 1801 |
1810 bool IsSuperAccess() { return obj()->IsSuperPropertyReference(); } | 1802 bool IsSuperAccess() { return obj()->IsSuperPropertyReference(); } |
1811 | 1803 |
1812 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1804 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
1813 FeedbackVectorSlotCache* cache) override { | 1805 FeedbackVectorSlotCache* cache) { |
1814 FeedbackVectorSlotKind kind = key()->IsPropertyName() | 1806 FeedbackVectorSlotKind kind = key()->IsPropertyName() |
1815 ? FeedbackVectorSlotKind::LOAD_IC | 1807 ? FeedbackVectorSlotKind::LOAD_IC |
1816 : FeedbackVectorSlotKind::KEYED_LOAD_IC; | 1808 : FeedbackVectorSlotKind::KEYED_LOAD_IC; |
1817 property_feedback_slot_ = spec->AddSlot(kind); | 1809 property_feedback_slot_ = spec->AddSlot(kind); |
1818 } | 1810 } |
1819 | 1811 |
1820 FeedbackVectorSlot PropertyFeedbackSlot() const { | 1812 FeedbackVectorSlot PropertyFeedbackSlot() const { |
1821 return property_feedback_slot_; | 1813 return property_feedback_slot_; |
1822 } | 1814 } |
1823 | 1815 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1858 public: | 1850 public: |
1859 DECLARE_NODE_TYPE(Call) | 1851 DECLARE_NODE_TYPE(Call) |
1860 | 1852 |
1861 Expression* expression() const { return expression_; } | 1853 Expression* expression() const { return expression_; } |
1862 ZoneList<Expression*>* arguments() const { return arguments_; } | 1854 ZoneList<Expression*>* arguments() const { return arguments_; } |
1863 | 1855 |
1864 void set_expression(Expression* e) { expression_ = e; } | 1856 void set_expression(Expression* e) { expression_ = e; } |
1865 | 1857 |
1866 // Type feedback information. | 1858 // Type feedback information. |
1867 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1859 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
1868 FeedbackVectorSlotCache* cache) override; | 1860 FeedbackVectorSlotCache* cache); |
1869 | 1861 |
1870 FeedbackVectorSlot CallFeedbackSlot() const { return stub_slot_; } | 1862 FeedbackVectorSlot CallFeedbackSlot() const { return stub_slot_; } |
1871 | 1863 |
1872 FeedbackVectorSlot CallFeedbackICSlot() const { return ic_slot_; } | 1864 FeedbackVectorSlot CallFeedbackICSlot() const { return ic_slot_; } |
1873 | 1865 |
1874 SmallMapList* GetReceiverTypes() override { | 1866 SmallMapList* GetReceiverTypes() override { |
1875 if (expression()->IsProperty()) { | 1867 if (expression()->IsProperty()) { |
1876 return expression()->AsProperty()->GetReceiverTypes(); | 1868 return expression()->AsProperty()->GetReceiverTypes(); |
1877 } | 1869 } |
1878 return NULL; | 1870 return NULL; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1982 public: | 1974 public: |
1983 DECLARE_NODE_TYPE(CallNew) | 1975 DECLARE_NODE_TYPE(CallNew) |
1984 | 1976 |
1985 Expression* expression() const { return expression_; } | 1977 Expression* expression() const { return expression_; } |
1986 ZoneList<Expression*>* arguments() const { return arguments_; } | 1978 ZoneList<Expression*>* arguments() const { return arguments_; } |
1987 | 1979 |
1988 void set_expression(Expression* e) { expression_ = e; } | 1980 void set_expression(Expression* e) { expression_ = e; } |
1989 | 1981 |
1990 // Type feedback information. | 1982 // Type feedback information. |
1991 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1983 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
1992 FeedbackVectorSlotCache* cache) override { | 1984 FeedbackVectorSlotCache* cache) { |
1993 callnew_feedback_slot_ = spec->AddGeneralSlot(); | 1985 callnew_feedback_slot_ = spec->AddGeneralSlot(); |
1994 // Construct calls have two slots, one right after the other. | 1986 // Construct calls have two slots, one right after the other. |
1995 // The second slot stores the call count for monomorphic calls. | 1987 // The second slot stores the call count for monomorphic calls. |
1996 spec->AddGeneralSlot(); | 1988 spec->AddGeneralSlot(); |
1997 } | 1989 } |
1998 | 1990 |
1999 FeedbackVectorSlot CallNewFeedbackSlot() { | 1991 FeedbackVectorSlot CallNewFeedbackSlot() { |
2000 DCHECK(!callnew_feedback_slot_.IsInvalid()); | 1992 DCHECK(!callnew_feedback_slot_.IsInvalid()); |
2001 return callnew_feedback_slot_; | 1993 return callnew_feedback_slot_; |
2002 } | 1994 } |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2230 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } | 2222 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } |
2231 BailoutId ToNumberId() const { return BailoutId(local_id(1)); } | 2223 BailoutId ToNumberId() const { return BailoutId(local_id(1)); } |
2232 TypeFeedbackId CountBinOpFeedbackId() const { | 2224 TypeFeedbackId CountBinOpFeedbackId() const { |
2233 return TypeFeedbackId(local_id(2)); | 2225 return TypeFeedbackId(local_id(2)); |
2234 } | 2226 } |
2235 TypeFeedbackId CountStoreFeedbackId() const { | 2227 TypeFeedbackId CountStoreFeedbackId() const { |
2236 return TypeFeedbackId(local_id(3)); | 2228 return TypeFeedbackId(local_id(3)); |
2237 } | 2229 } |
2238 | 2230 |
2239 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 2231 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
2240 FeedbackVectorSlotCache* cache) override; | 2232 FeedbackVectorSlotCache* cache); |
2241 FeedbackVectorSlot CountSlot() const { return slot_; } | 2233 FeedbackVectorSlot CountSlot() const { return slot_; } |
2242 | 2234 |
2243 protected: | 2235 protected: |
2244 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, | 2236 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, |
2245 int pos) | 2237 int pos) |
2246 : Expression(zone, pos), | 2238 : Expression(zone, pos), |
2247 bit_field_( | 2239 bit_field_( |
2248 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | | 2240 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | |
2249 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), | 2241 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), |
2250 type_(NULL), | 2242 type_(NULL), |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2422 bit_field_ = IsUninitializedField::update(bit_field_, b); | 2414 bit_field_ = IsUninitializedField::update(bit_field_, b); |
2423 } | 2415 } |
2424 void set_key_type(IcCheckType key_type) { | 2416 void set_key_type(IcCheckType key_type) { |
2425 bit_field_ = KeyTypeField::update(bit_field_, key_type); | 2417 bit_field_ = KeyTypeField::update(bit_field_, key_type); |
2426 } | 2418 } |
2427 void set_store_mode(KeyedAccessStoreMode mode) { | 2419 void set_store_mode(KeyedAccessStoreMode mode) { |
2428 bit_field_ = StoreModeField::update(bit_field_, mode); | 2420 bit_field_ = StoreModeField::update(bit_field_, mode); |
2429 } | 2421 } |
2430 | 2422 |
2431 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 2423 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
2432 FeedbackVectorSlotCache* cache) override; | 2424 FeedbackVectorSlotCache* cache); |
2433 FeedbackVectorSlot AssignmentSlot() const { return slot_; } | 2425 FeedbackVectorSlot AssignmentSlot() const { return slot_; } |
2434 | 2426 |
2435 protected: | 2427 protected: |
2436 Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value, | 2428 Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value, |
2437 int pos); | 2429 int pos); |
2438 static int parent_num_ids() { return Expression::num_ids(); } | 2430 static int parent_num_ids() { return Expression::num_ids(); } |
2439 | 2431 |
2440 private: | 2432 private: |
2441 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2433 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
2442 | 2434 |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2770 // Return an AST id for a property that is used in simulate instructions. | 2762 // Return an AST id for a property that is used in simulate instructions. |
2771 BailoutId GetIdForProperty(int i) { return BailoutId(local_id(i + 5)); } | 2763 BailoutId GetIdForProperty(int i) { return BailoutId(local_id(i + 5)); } |
2772 | 2764 |
2773 // Unlike other AST nodes, this number of bailout IDs allocated for an | 2765 // Unlike other AST nodes, this number of bailout IDs allocated for an |
2774 // ClassLiteral can vary, so num_ids() is not a static method. | 2766 // ClassLiteral can vary, so num_ids() is not a static method. |
2775 int num_ids() const { return parent_num_ids() + 5 + properties()->length(); } | 2767 int num_ids() const { return parent_num_ids() + 5 + properties()->length(); } |
2776 | 2768 |
2777 // Object literals need one feedback slot for each non-trivial value, as well | 2769 // Object literals need one feedback slot for each non-trivial value, as well |
2778 // as some slots for home objects. | 2770 // as some slots for home objects. |
2779 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 2771 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
2780 FeedbackVectorSlotCache* cache) override; | 2772 FeedbackVectorSlotCache* cache); |
2781 | 2773 |
2782 bool NeedsProxySlot() const { | 2774 bool NeedsProxySlot() const { |
2783 return class_variable_proxy() != nullptr && | 2775 return class_variable_proxy() != nullptr && |
2784 class_variable_proxy()->var()->IsUnallocated(); | 2776 class_variable_proxy()->var()->IsUnallocated(); |
2785 } | 2777 } |
2786 | 2778 |
2787 FeedbackVectorSlot PrototypeSlot() const { return prototype_slot_; } | 2779 FeedbackVectorSlot PrototypeSlot() const { return prototype_slot_; } |
2788 FeedbackVectorSlot ProxySlot() const { return proxy_slot_; } | 2780 FeedbackVectorSlot ProxySlot() const { return proxy_slot_; } |
2789 | 2781 |
2790 bool IsAnonymousFunctionDefinition() const final { | 2782 bool IsAnonymousFunctionDefinition() const final { |
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3557 : NULL; \ | 3549 : NULL; \ |
3558 } | 3550 } |
3559 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3551 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
3560 #undef DECLARE_NODE_FUNCTIONS | 3552 #undef DECLARE_NODE_FUNCTIONS |
3561 | 3553 |
3562 | 3554 |
3563 } // namespace internal | 3555 } // namespace internal |
3564 } // namespace v8 | 3556 } // namespace v8 |
3565 | 3557 |
3566 #endif // V8_AST_AST_H_ | 3558 #endif // V8_AST_AST_H_ |
OLD | NEW |