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

Side by Side Diff: src/ast.h

Issue 1161623002: VectorICs: allocating slots for store ics in ast nodes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Code comments. Created 5 years, 6 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
« no previous file with comments | « src/arm64/full-codegen-arm64.cc ('k') | src/ast.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_AST_H_ 5 #ifndef V8_AST_H_
6 #define V8_AST_H_ 6 #define V8_AST_H_
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/assembler.h" 10 #include "src/assembler.h"
(...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 789
790 void Initialize(Expression* each, Expression* subject, Statement* body) { 790 void Initialize(Expression* each, Expression* subject, Statement* body) {
791 IterationStatement::Initialize(body); 791 IterationStatement::Initialize(body);
792 each_ = each; 792 each_ = each;
793 subject_ = subject; 793 subject_ = subject;
794 } 794 }
795 795
796 Expression* each() const { return each_; } 796 Expression* each() const { return each_; }
797 Expression* subject() const { return subject_; } 797 Expression* subject() const { return subject_; }
798 798
799 FeedbackVectorRequirements ComputeFeedbackRequirements(
800 Isolate* isolate, const ICSlotCache* cache) override;
801 void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot,
802 ICSlotCache* cache) override {
803 each_slot_ = slot;
804 }
805 Code::Kind FeedbackICSlotKind(int index) override;
806 FeedbackVectorICSlot EachFeedbackSlot() const { return each_slot_; }
807
799 protected: 808 protected:
800 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 809 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
801 : IterationStatement(zone, labels, pos), each_(NULL), subject_(NULL) {} 810 : IterationStatement(zone, labels, pos),
811 each_(NULL),
812 subject_(NULL),
813 each_slot_(FeedbackVectorICSlot::Invalid()) {}
802 814
803 private: 815 private:
804 Expression* each_; 816 Expression* each_;
805 Expression* subject_; 817 Expression* subject_;
818 FeedbackVectorICSlot each_slot_;
806 }; 819 };
807 820
808 821
809 class ForInStatement final : public ForEachStatement { 822 class ForInStatement final : public ForEachStatement {
810 public: 823 public:
811 DECLARE_NODE_TYPE(ForInStatement) 824 DECLARE_NODE_TYPE(ForInStatement)
812 825
813 Expression* enumerable() const { 826 Expression* enumerable() const {
814 return subject(); 827 return subject();
815 } 828 }
816 829
817 // Type feedback information. 830 // Type feedback information.
818 virtual FeedbackVectorRequirements ComputeFeedbackRequirements( 831 FeedbackVectorRequirements ComputeFeedbackRequirements(
819 Isolate* isolate, const ICSlotCache* cache) override { 832 Isolate* isolate, const ICSlotCache* cache) override {
820 return FeedbackVectorRequirements(1, 0); 833 FeedbackVectorRequirements base =
834 ForEachStatement::ComputeFeedbackRequirements(isolate, cache);
835 DCHECK(base.slots() == 0 && base.ic_slots() <= 1);
836 return FeedbackVectorRequirements(1, base.ic_slots());
821 } 837 }
822 void SetFirstFeedbackSlot(FeedbackVectorSlot slot) override { 838 void SetFirstFeedbackSlot(FeedbackVectorSlot slot) override {
823 for_in_feedback_slot_ = slot; 839 for_in_feedback_slot_ = slot;
824 } 840 }
825 841
826 FeedbackVectorSlot ForInFeedbackSlot() { 842 FeedbackVectorSlot ForInFeedbackSlot() {
827 DCHECK(!for_in_feedback_slot_.IsInvalid()); 843 DCHECK(!for_in_feedback_slot_.IsInvalid());
828 return for_in_feedback_slot_; 844 return for_in_feedback_slot_;
829 } 845 }
830 846
(...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after
1450 1466
1451 BailoutId CreateLiteralId() const { return BailoutId(local_id(0)); } 1467 BailoutId CreateLiteralId() const { return BailoutId(local_id(0)); }
1452 1468
1453 // Return an AST id for a property that is used in simulate instructions. 1469 // Return an AST id for a property that is used in simulate instructions.
1454 BailoutId GetIdForProperty(int i) { return BailoutId(local_id(i + 1)); } 1470 BailoutId GetIdForProperty(int i) { return BailoutId(local_id(i + 1)); }
1455 1471
1456 // Unlike other AST nodes, this number of bailout IDs allocated for an 1472 // Unlike other AST nodes, this number of bailout IDs allocated for an
1457 // ObjectLiteral can vary, so num_ids() is not a static method. 1473 // ObjectLiteral can vary, so num_ids() is not a static method.
1458 int num_ids() const { return parent_num_ids() + 1 + properties()->length(); } 1474 int num_ids() const { return parent_num_ids() + 1 + properties()->length(); }
1459 1475
1476 // Object literals need one feedback slot for each non-trivial value, as well
1477 // as some slots for home objects.
1478 FeedbackVectorRequirements ComputeFeedbackRequirements(
1479 Isolate* isolate, const ICSlotCache* cache) override;
1480 void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot,
1481 ICSlotCache* cache) override {
1482 slot_ = slot;
1483 }
1484 Code::Kind FeedbackICSlotKind(int index) override { return Code::STORE_IC; }
1485 FeedbackVectorICSlot GetNthSlot(int n) const {
1486 return FeedbackVectorICSlot(slot_.ToInt() + n);
1487 }
1488
1489 // If value needs a home object, returns a valid feedback vector ic slot
1490 // given by slot_index, and increments slot_index.
1491 FeedbackVectorICSlot SlotForHomeObject(Expression* value,
1492 int* slot_index) const;
1493
1494 #ifdef DEBUG
1495 int slot_count() const { return slot_count_; }
1496 #endif
1497
1460 protected: 1498 protected:
1461 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, 1499 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index,
1462 int boilerplate_properties, bool has_function, 1500 int boilerplate_properties, bool has_function, bool is_strong,
1463 bool is_strong, int pos) 1501 int pos)
1464 : MaterializedLiteral(zone, literal_index, is_strong, pos), 1502 : MaterializedLiteral(zone, literal_index, is_strong, pos),
1465 properties_(properties), 1503 properties_(properties),
1466 boilerplate_properties_(boilerplate_properties), 1504 boilerplate_properties_(boilerplate_properties),
1467 fast_elements_(false), 1505 fast_elements_(false),
1468 has_elements_(false), 1506 has_elements_(false),
1469 may_store_doubles_(false), 1507 may_store_doubles_(false),
1470 has_function_(has_function) {} 1508 has_function_(has_function),
1509 #ifdef DEBUG
1510 slot_count_(0),
1511 #endif
1512 slot_(FeedbackVectorICSlot::Invalid()) {
1513 }
1471 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } 1514 static int parent_num_ids() { return MaterializedLiteral::num_ids(); }
1472 1515
1473 private: 1516 private:
1474 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1517 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1475 Handle<FixedArray> constant_properties_; 1518 Handle<FixedArray> constant_properties_;
1476 ZoneList<Property*>* properties_; 1519 ZoneList<Property*>* properties_;
1477 int boilerplate_properties_; 1520 int boilerplate_properties_;
1478 bool fast_elements_; 1521 bool fast_elements_;
1479 bool has_elements_; 1522 bool has_elements_;
1480 bool may_store_doubles_; 1523 bool may_store_doubles_;
1481 bool has_function_; 1524 bool has_function_;
1525 #ifdef DEBUG
1526 // slot_count_ helps validate that the logic to allocate ic slots and the
1527 // logic to use them are in sync.
1528 int slot_count_;
1529 #endif
1530 FeedbackVectorICSlot slot_;
1482 }; 1531 };
1483 1532
1484 1533
1485 // Node for capturing a regexp literal. 1534 // Node for capturing a regexp literal.
1486 class RegExpLiteral final : public MaterializedLiteral { 1535 class RegExpLiteral final : public MaterializedLiteral {
1487 public: 1536 public:
1488 DECLARE_NODE_TYPE(RegExpLiteral) 1537 DECLARE_NODE_TYPE(RegExpLiteral)
1489 1538
1490 Handle<String> pattern() const { return pattern_->string(); } 1539 Handle<String> pattern() const { return pattern_->string(); }
1491 Handle<String> flags() const { return flags_->string(); } 1540 Handle<String> flags() const { return flags_->string(); }
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1647 const AstRawString* raw_name_; // if !is_resolved_ 1696 const AstRawString* raw_name_; // if !is_resolved_
1648 Variable* var_; // if is_resolved_ 1697 Variable* var_; // if is_resolved_
1649 }; 1698 };
1650 // Position is stored in the AstNode superclass, but VariableProxy needs to 1699 // Position is stored in the AstNode superclass, but VariableProxy needs to
1651 // know its end position too (for error messages). It cannot be inferred from 1700 // know its end position too (for error messages). It cannot be inferred from
1652 // the variable name length because it can contain escapes. 1701 // the variable name length because it can contain escapes.
1653 int end_position_; 1702 int end_position_;
1654 }; 1703 };
1655 1704
1656 1705
1706 // Left-hand side can only be a property, a global or a (parameter or local)
1707 // slot.
1708 enum LhsKind {
1709 VARIABLE,
1710 NAMED_PROPERTY,
1711 KEYED_PROPERTY,
1712 NAMED_SUPER_PROPERTY,
1713 KEYED_SUPER_PROPERTY
1714 };
1715
1716
1657 class Property final : public Expression { 1717 class Property final : public Expression {
1658 public: 1718 public:
1659 DECLARE_NODE_TYPE(Property) 1719 DECLARE_NODE_TYPE(Property)
1660 1720
1661 bool IsValidReferenceExpression() const override { return true; } 1721 bool IsValidReferenceExpression() const override { return true; }
1662 1722
1663 Expression* obj() const { return obj_; } 1723 Expression* obj() const { return obj_; }
1664 Expression* key() const { return key_; } 1724 Expression* key() const { return key_; }
1665 1725
1666 static int num_ids() { return parent_num_ids() + 1; } 1726 static int num_ids() { return parent_num_ids() + 1; }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1714 } 1774 }
1715 Code::Kind FeedbackICSlotKind(int index) override { 1775 Code::Kind FeedbackICSlotKind(int index) override {
1716 return key()->IsPropertyName() ? Code::LOAD_IC : Code::KEYED_LOAD_IC; 1776 return key()->IsPropertyName() ? Code::LOAD_IC : Code::KEYED_LOAD_IC;
1717 } 1777 }
1718 1778
1719 FeedbackVectorICSlot PropertyFeedbackSlot() const { 1779 FeedbackVectorICSlot PropertyFeedbackSlot() const {
1720 DCHECK(!property_feedback_slot_.IsInvalid()); 1780 DCHECK(!property_feedback_slot_.IsInvalid());
1721 return property_feedback_slot_; 1781 return property_feedback_slot_;
1722 } 1782 }
1723 1783
1784 static LhsKind GetAssignType(Property* property) {
1785 if (property == NULL) return VARIABLE;
1786 bool super_access = property->IsSuperAccess();
1787 return (property->key()->IsPropertyName())
1788 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY)
1789 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY);
1790 }
1791
1724 protected: 1792 protected:
1725 Property(Zone* zone, Expression* obj, Expression* key, int pos) 1793 Property(Zone* zone, Expression* obj, Expression* key, int pos)
1726 : Expression(zone, pos), 1794 : Expression(zone, pos),
1727 bit_field_(IsForCallField::encode(false) | 1795 bit_field_(IsForCallField::encode(false) |
1728 IsStringAccessField::encode(false) | 1796 IsStringAccessField::encode(false) |
1729 InlineCacheStateField::encode(UNINITIALIZED)), 1797 InlineCacheStateField::encode(UNINITIALIZED)),
1730 property_feedback_slot_(FeedbackVectorICSlot::Invalid()), 1798 property_feedback_slot_(FeedbackVectorICSlot::Invalid()),
1731 obj_(obj), 1799 obj_(obj),
1732 key_(key) {} 1800 key_(key) {}
1733 static int parent_num_ids() { return Expression::num_ids(); } 1801 static int parent_num_ids() { return Expression::num_ids(); }
(...skipping 18 matching lines...) Expand all
1752 DECLARE_NODE_TYPE(Call) 1820 DECLARE_NODE_TYPE(Call)
1753 1821
1754 Expression* expression() const { return expression_; } 1822 Expression* expression() const { return expression_; }
1755 ZoneList<Expression*>* arguments() const { return arguments_; } 1823 ZoneList<Expression*>* arguments() const { return arguments_; }
1756 1824
1757 // Type feedback information. 1825 // Type feedback information.
1758 virtual FeedbackVectorRequirements ComputeFeedbackRequirements( 1826 virtual FeedbackVectorRequirements ComputeFeedbackRequirements(
1759 Isolate* isolate, const ICSlotCache* cache) override; 1827 Isolate* isolate, const ICSlotCache* cache) override;
1760 void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot, 1828 void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot,
1761 ICSlotCache* cache) override { 1829 ICSlotCache* cache) override {
1762 ic_slot_or_slot_ = slot.ToInt(); 1830 ic_slot_ = slot;
1763 } 1831 }
1764 void SetFirstFeedbackSlot(FeedbackVectorSlot slot) override { 1832 void SetFirstFeedbackSlot(FeedbackVectorSlot slot) override { slot_ = slot; }
1765 ic_slot_or_slot_ = slot.ToInt();
1766 }
1767 Code::Kind FeedbackICSlotKind(int index) override { return Code::CALL_IC; } 1833 Code::Kind FeedbackICSlotKind(int index) override { return Code::CALL_IC; }
1768 1834
1769 FeedbackVectorSlot CallFeedbackSlot() const { 1835 FeedbackVectorSlot CallFeedbackSlot() const { return slot_; }
1770 DCHECK(ic_slot_or_slot_ != FeedbackVectorSlot::Invalid().ToInt());
1771 return FeedbackVectorSlot(ic_slot_or_slot_);
1772 }
1773 1836
1774 FeedbackVectorICSlot CallFeedbackICSlot() const { 1837 FeedbackVectorICSlot CallFeedbackICSlot() const { return ic_slot_; }
1775 DCHECK(ic_slot_or_slot_ != FeedbackVectorICSlot::Invalid().ToInt());
1776 return FeedbackVectorICSlot(ic_slot_or_slot_);
1777 }
1778 1838
1779 SmallMapList* GetReceiverTypes() override { 1839 SmallMapList* GetReceiverTypes() override {
1780 if (expression()->IsProperty()) { 1840 if (expression()->IsProperty()) {
1781 return expression()->AsProperty()->GetReceiverTypes(); 1841 return expression()->AsProperty()->GetReceiverTypes();
1782 } 1842 }
1783 return NULL; 1843 return NULL;
1784 } 1844 }
1785 1845
1786 bool IsMonomorphic() override { 1846 bool IsMonomorphic() override {
1787 if (expression()->IsProperty()) { 1847 if (expression()->IsProperty()) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1839 1899
1840 #ifdef DEBUG 1900 #ifdef DEBUG
1841 // Used to assert that the FullCodeGenerator records the return site. 1901 // Used to assert that the FullCodeGenerator records the return site.
1842 bool return_is_recorded_; 1902 bool return_is_recorded_;
1843 #endif 1903 #endif
1844 1904
1845 protected: 1905 protected:
1846 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1906 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
1847 int pos) 1907 int pos)
1848 : Expression(zone, pos), 1908 : Expression(zone, pos),
1849 ic_slot_or_slot_(FeedbackVectorICSlot::Invalid().ToInt()), 1909 ic_slot_(FeedbackVectorICSlot::Invalid()),
1910 slot_(FeedbackVectorSlot::Invalid()),
1850 expression_(expression), 1911 expression_(expression),
1851 arguments_(arguments), 1912 arguments_(arguments),
1852 bit_field_(IsUninitializedField::encode(false)) { 1913 bit_field_(IsUninitializedField::encode(false)) {
1853 if (expression->IsProperty()) { 1914 if (expression->IsProperty()) {
1854 expression->AsProperty()->mark_for_call(); 1915 expression->AsProperty()->mark_for_call();
1855 } 1916 }
1856 } 1917 }
1857 static int parent_num_ids() { return Expression::num_ids(); } 1918 static int parent_num_ids() { return Expression::num_ids(); }
1858 1919
1859 private: 1920 private:
1860 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1921 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1861 1922
1862 // We store this as an integer because we don't know if we have a slot or 1923 FeedbackVectorICSlot ic_slot_;
1863 // an ic slot until scoping time. 1924 FeedbackVectorSlot slot_;
1864 int ic_slot_or_slot_;
1865 Expression* expression_; 1925 Expression* expression_;
1866 ZoneList<Expression*>* arguments_; 1926 ZoneList<Expression*>* arguments_;
1867 Handle<JSFunction> target_; 1927 Handle<JSFunction> target_;
1868 Handle<AllocationSite> allocation_site_; 1928 Handle<AllocationSite> allocation_site_;
1869 class IsUninitializedField : public BitField8<bool, 0, 1> {}; 1929 class IsUninitializedField : public BitField8<bool, 0, 1> {};
1870 uint8_t bit_field_; 1930 uint8_t bit_field_;
1871 }; 1931 };
1872 1932
1873 1933
1874 class CallNew final : public Expression { 1934 class CallNew final : public Expression {
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
2113 static int num_ids() { return parent_num_ids() + 4; } 2173 static int num_ids() { return parent_num_ids() + 4; }
2114 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } 2174 BailoutId AssignmentId() const { return BailoutId(local_id(0)); }
2115 BailoutId ToNumberId() const { return BailoutId(local_id(1)); } 2175 BailoutId ToNumberId() const { return BailoutId(local_id(1)); }
2116 TypeFeedbackId CountBinOpFeedbackId() const { 2176 TypeFeedbackId CountBinOpFeedbackId() const {
2117 return TypeFeedbackId(local_id(2)); 2177 return TypeFeedbackId(local_id(2));
2118 } 2178 }
2119 TypeFeedbackId CountStoreFeedbackId() const { 2179 TypeFeedbackId CountStoreFeedbackId() const {
2120 return TypeFeedbackId(local_id(3)); 2180 return TypeFeedbackId(local_id(3));
2121 } 2181 }
2122 2182
2183 FeedbackVectorRequirements ComputeFeedbackRequirements(
2184 Isolate* isolate, const ICSlotCache* cache) override;
2185 void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot,
2186 ICSlotCache* cache) override {
2187 slot_ = slot;
2188 }
2189 Code::Kind FeedbackICSlotKind(int index) override;
2190 FeedbackVectorICSlot CountSlot() const { return slot_; }
2191
2123 protected: 2192 protected:
2124 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, 2193 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr,
2125 int pos) 2194 int pos)
2126 : Expression(zone, pos), 2195 : Expression(zone, pos),
2127 bit_field_(IsPrefixField::encode(is_prefix) | 2196 bit_field_(
2128 KeyTypeField::encode(ELEMENT) | 2197 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) |
2129 StoreModeField::encode(STANDARD_STORE) | 2198 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)),
2130 TokenField::encode(op)),
2131 type_(NULL), 2199 type_(NULL),
2132 expression_(expr) {} 2200 expression_(expr),
2201 slot_(FeedbackVectorICSlot::Invalid()) {}
2133 static int parent_num_ids() { return Expression::num_ids(); } 2202 static int parent_num_ids() { return Expression::num_ids(); }
2134 2203
2135 private: 2204 private:
2136 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2205 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2137 2206
2138 class IsPrefixField : public BitField16<bool, 0, 1> {}; 2207 class IsPrefixField : public BitField16<bool, 0, 1> {};
2139 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; 2208 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {};
2140 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 4> {}; 2209 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 4> {};
2141 class TokenField : public BitField16<Token::Value, 6, 8> {}; 2210 class TokenField : public BitField16<Token::Value, 6, 8> {};
2142 2211
2143 // Starts with 16-bit field, which should get packed together with 2212 // Starts with 16-bit field, which should get packed together with
2144 // Expression's trailing 16-bit field. 2213 // Expression's trailing 16-bit field.
2145 uint16_t bit_field_; 2214 uint16_t bit_field_;
2146 Type* type_; 2215 Type* type_;
2147 Expression* expression_; 2216 Expression* expression_;
2148 SmallMapList receiver_types_; 2217 SmallMapList receiver_types_;
2218 FeedbackVectorICSlot slot_;
2149 }; 2219 };
2150 2220
2151 2221
2152 class CompareOperation final : public Expression { 2222 class CompareOperation final : public Expression {
2153 public: 2223 public:
2154 DECLARE_NODE_TYPE(CompareOperation) 2224 DECLARE_NODE_TYPE(CompareOperation)
2155 2225
2156 Token::Value op() const { return op_; } 2226 Token::Value op() const { return op_; }
2157 Expression* left() const { return left_; } 2227 Expression* left() const { return left_; }
2158 Expression* right() const { return right_; } 2228 Expression* right() const { return right_; }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
2281 void set_is_uninitialized(bool b) { 2351 void set_is_uninitialized(bool b) {
2282 bit_field_ = IsUninitializedField::update(bit_field_, b); 2352 bit_field_ = IsUninitializedField::update(bit_field_, b);
2283 } 2353 }
2284 void set_key_type(IcCheckType key_type) { 2354 void set_key_type(IcCheckType key_type) {
2285 bit_field_ = KeyTypeField::update(bit_field_, key_type); 2355 bit_field_ = KeyTypeField::update(bit_field_, key_type);
2286 } 2356 }
2287 void set_store_mode(KeyedAccessStoreMode mode) { 2357 void set_store_mode(KeyedAccessStoreMode mode) {
2288 bit_field_ = StoreModeField::update(bit_field_, mode); 2358 bit_field_ = StoreModeField::update(bit_field_, mode);
2289 } 2359 }
2290 2360
2361 FeedbackVectorRequirements ComputeFeedbackRequirements(
2362 Isolate* isolate, const ICSlotCache* cache) override;
2363 void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot,
2364 ICSlotCache* cache) override {
2365 slot_ = slot;
2366 }
2367 Code::Kind FeedbackICSlotKind(int index) override;
2368 FeedbackVectorICSlot AssignmentSlot() const { return slot_; }
2369
2291 protected: 2370 protected:
2292 Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value, 2371 Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value,
2293 int pos); 2372 int pos);
2294 static int parent_num_ids() { return Expression::num_ids(); } 2373 static int parent_num_ids() { return Expression::num_ids(); }
2295 2374
2296 private: 2375 private:
2297 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2376 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2298 2377
2299 class IsUninitializedField : public BitField16<bool, 0, 1> {}; 2378 class IsUninitializedField : public BitField16<bool, 0, 1> {};
2300 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; 2379 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {};
2301 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 4> {}; 2380 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 4> {};
2302 class TokenField : public BitField16<Token::Value, 6, 8> {}; 2381 class TokenField : public BitField16<Token::Value, 6, 8> {};
2303 2382
2304 // Starts with 16-bit field, which should get packed together with 2383 // Starts with 16-bit field, which should get packed together with
2305 // Expression's trailing 16-bit field. 2384 // Expression's trailing 16-bit field.
2306 uint16_t bit_field_; 2385 uint16_t bit_field_;
2307 Expression* target_; 2386 Expression* target_;
2308 Expression* value_; 2387 Expression* value_;
2309 BinaryOperation* binary_operation_; 2388 BinaryOperation* binary_operation_;
2310 SmallMapList receiver_types_; 2389 SmallMapList receiver_types_;
2390 FeedbackVectorICSlot slot_;
2311 }; 2391 };
2312 2392
2313 2393
2314 class Yield final : public Expression { 2394 class Yield final : public Expression {
2315 public: 2395 public:
2316 DECLARE_NODE_TYPE(Yield) 2396 DECLARE_NODE_TYPE(Yield)
2317 2397
2318 enum Kind { 2398 enum Kind {
2319 kInitial, // The initial yield that returns the unboxed generator object. 2399 kInitial, // The initial yield that returns the unboxed generator object.
2320 kSuspend, // A normal yield: { value: EXPRESSION, done: false } 2400 kSuspend, // A normal yield: { value: EXPRESSION, done: false }
(...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after
3497 3577
3498 private: 3578 private:
3499 Zone* zone_; 3579 Zone* zone_;
3500 AstValueFactory* ast_value_factory_; 3580 AstValueFactory* ast_value_factory_;
3501 }; 3581 };
3502 3582
3503 3583
3504 } } // namespace v8::internal 3584 } } // namespace v8::internal
3505 3585
3506 #endif // V8_AST_H_ 3586 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « src/arm64/full-codegen-arm64.cc ('k') | src/ast.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698