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

Side by Side Diff: src/ast.h

Issue 1370303004: Distinction between FeedbackVectorICSlot and FeedbackVectorSlot eliminated. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixed release builds Created 5 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
« no previous file with comments | « src/arm64/lithium-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/assembler.h" 8 #include "src/assembler.h"
9 #include "src/ast-value-factory.h" 9 #include "src/ast-value-factory.h"
10 #include "src/bailout-reason.h" 10 #include "src/bailout-reason.h"
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 typedef ZoneList<Handle<String>> ZoneStringList; 131 typedef ZoneList<Handle<String>> ZoneStringList;
132 typedef ZoneList<Handle<Object>> ZoneObjectList; 132 typedef ZoneList<Handle<Object>> ZoneObjectList;
133 133
134 134
135 #define DECLARE_NODE_TYPE(type) \ 135 #define DECLARE_NODE_TYPE(type) \
136 void Accept(AstVisitor* v) override; \ 136 void Accept(AstVisitor* v) override; \
137 AstNode::NodeType node_type() const final { return AstNode::k##type; } \ 137 AstNode::NodeType node_type() const final { return AstNode::k##type; } \
138 friend class AstNodeFactory; 138 friend class AstNodeFactory;
139 139
140 140
141 class ICSlotCache { 141 class FeedbackVectorSlotCache {
142 public: 142 public:
143 explicit ICSlotCache(Zone* zone) 143 explicit FeedbackVectorSlotCache(Zone* zone)
144 : zone_(zone), 144 : zone_(zone),
145 hash_map_(HashMap::PointersMatch, ZoneHashMap::kDefaultHashMapCapacity, 145 hash_map_(HashMap::PointersMatch, ZoneHashMap::kDefaultHashMapCapacity,
146 ZoneAllocationPolicy(zone)) {} 146 ZoneAllocationPolicy(zone)) {}
147 147
148 void Put(Variable* variable, FeedbackVectorICSlot slot) { 148 void Put(Variable* variable, FeedbackVectorSlot slot) {
149 ZoneHashMap::Entry* entry = hash_map_.LookupOrInsert( 149 ZoneHashMap::Entry* entry = hash_map_.LookupOrInsert(
150 variable, ComputePointerHash(variable), ZoneAllocationPolicy(zone_)); 150 variable, ComputePointerHash(variable), ZoneAllocationPolicy(zone_));
151 entry->value = reinterpret_cast<void*>(slot.ToInt()); 151 entry->value = reinterpret_cast<void*>(slot.ToInt());
152 } 152 }
153 153
154 ZoneHashMap::Entry* Get(Variable* variable) const { 154 ZoneHashMap::Entry* Get(Variable* variable) const {
155 return hash_map_.Lookup(variable, ComputePointerHash(variable)); 155 return hash_map_.Lookup(variable, ComputePointerHash(variable));
156 } 156 }
157 157
158 private: 158 private:
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 virtual BreakableStatement* AsBreakableStatement() { return NULL; } 223 virtual BreakableStatement* AsBreakableStatement() { return NULL; }
224 virtual IterationStatement* AsIterationStatement() { return NULL; } 224 virtual IterationStatement* AsIterationStatement() { return NULL; }
225 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } 225 virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; }
226 226
227 // The interface for feedback slots, with default no-op implementations for 227 // The interface for feedback slots, with default no-op implementations for
228 // node types which don't actually have this. Note that this is conceptually 228 // node types which don't actually have this. Note that this is conceptually
229 // not really nice, but multiple inheritance would introduce yet another 229 // not really nice, but multiple inheritance would introduce yet another
230 // vtable entry per node, something we don't want for space reasons. 230 // vtable entry per node, something we don't want for space reasons.
231 virtual void AssignFeedbackVectorSlots(Isolate* isolate, 231 virtual void AssignFeedbackVectorSlots(Isolate* isolate,
232 FeedbackVectorSpec* spec, 232 FeedbackVectorSpec* spec,
233 ICSlotCache* cache) {} 233 FeedbackVectorSlotCache* cache) {}
234 234
235 private: 235 private:
236 // Hidden to prevent accidental usage. It would have to load the 236 // Hidden to prevent accidental usage. It would have to load the
237 // current zone from the TLS. 237 // current zone from the TLS.
238 void* operator new(size_t size); 238 void* operator new(size_t size);
239 239
240 friend class CaseClause; // Generates AST IDs. 240 friend class CaseClause; // Generates AST IDs.
241 241
242 int position_; 242 int position_;
243 }; 243 };
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 void Initialize(Expression* each, Expression* subject, Statement* body) { 770 void Initialize(Expression* each, Expression* subject, Statement* body) {
771 IterationStatement::Initialize(body); 771 IterationStatement::Initialize(body);
772 each_ = each; 772 each_ = each;
773 subject_ = subject; 773 subject_ = subject;
774 } 774 }
775 775
776 Expression* each() const { return each_; } 776 Expression* each() const { return each_; }
777 Expression* subject() const { return subject_; } 777 Expression* subject() const { return subject_; }
778 778
779 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 779 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
780 ICSlotCache* cache) override; 780 FeedbackVectorSlotCache* cache) override;
781 FeedbackVectorICSlot EachFeedbackSlot() const { return each_slot_; } 781 FeedbackVectorSlot EachFeedbackSlot() const { return each_slot_; }
782 782
783 protected: 783 protected:
784 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 784 ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
785 : IterationStatement(zone, labels, pos), 785 : IterationStatement(zone, labels, pos), each_(NULL), subject_(NULL) {}
786 each_(NULL),
787 subject_(NULL),
788 each_slot_(FeedbackVectorICSlot::Invalid()) {}
789 786
790 private: 787 private:
791 Expression* each_; 788 Expression* each_;
792 Expression* subject_; 789 Expression* subject_;
793 FeedbackVectorICSlot each_slot_; 790 FeedbackVectorSlot each_slot_;
794 }; 791 };
795 792
796 793
797 class ForInStatement final : public ForEachStatement { 794 class ForInStatement final : public ForEachStatement {
798 public: 795 public:
799 DECLARE_NODE_TYPE(ForInStatement) 796 DECLARE_NODE_TYPE(ForInStatement)
800 797
801 Expression* enumerable() const { 798 Expression* enumerable() const {
802 return subject(); 799 return subject();
803 } 800 }
804 801
805 // Type feedback information. 802 // Type feedback information.
806 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 803 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
807 ICSlotCache* cache) override { 804 FeedbackVectorSlotCache* cache) override {
808 ForEachStatement::AssignFeedbackVectorSlots(isolate, spec, cache); 805 ForEachStatement::AssignFeedbackVectorSlots(isolate, spec, cache);
809 for_in_feedback_slot_ = spec->AddStubSlot(); 806 for_in_feedback_slot_ = spec->AddGeneralSlot();
810 } 807 }
811 808
812 FeedbackVectorSlot ForInFeedbackSlot() { 809 FeedbackVectorSlot ForInFeedbackSlot() {
813 DCHECK(!for_in_feedback_slot_.IsInvalid()); 810 DCHECK(!for_in_feedback_slot_.IsInvalid());
814 return for_in_feedback_slot_; 811 return for_in_feedback_slot_;
815 } 812 }
816 813
817 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; 814 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN };
818 ForInType for_in_type() const { return for_in_type_; } 815 ForInType for_in_type() const { return for_in_type_; }
819 void set_for_in_type(ForInType type) { for_in_type_ = type; } 816 void set_for_in_type(ForInType type) { for_in_type_ = type; }
820 817
821 static int num_ids() { return parent_num_ids() + 6; } 818 static int num_ids() { return parent_num_ids() + 6; }
822 BailoutId BodyId() const { return BailoutId(local_id(0)); } 819 BailoutId BodyId() const { return BailoutId(local_id(0)); }
823 BailoutId PrepareId() const { return BailoutId(local_id(1)); } 820 BailoutId PrepareId() const { return BailoutId(local_id(1)); }
824 BailoutId EnumId() const { return BailoutId(local_id(2)); } 821 BailoutId EnumId() const { return BailoutId(local_id(2)); }
825 BailoutId ToObjectId() const { return BailoutId(local_id(3)); } 822 BailoutId ToObjectId() const { return BailoutId(local_id(3)); }
826 BailoutId FilterId() const { return BailoutId(local_id(4)); } 823 BailoutId FilterId() const { return BailoutId(local_id(4)); }
827 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } 824 BailoutId AssignmentId() const { return BailoutId(local_id(5)); }
828 BailoutId ContinueId() const override { return EntryId(); } 825 BailoutId ContinueId() const override { return EntryId(); }
829 BailoutId StackCheckId() const override { return BodyId(); } 826 BailoutId StackCheckId() const override { return BodyId(); }
830 827
831 protected: 828 protected:
832 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos) 829 ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos)
833 : ForEachStatement(zone, labels, pos), 830 : ForEachStatement(zone, labels, pos), for_in_type_(SLOW_FOR_IN) {}
834 for_in_type_(SLOW_FOR_IN),
835 for_in_feedback_slot_(FeedbackVectorSlot::Invalid()) {}
836 static int parent_num_ids() { return ForEachStatement::num_ids(); } 831 static int parent_num_ids() { return ForEachStatement::num_ids(); }
837 832
838 private: 833 private:
839 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 834 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
840 835
841 ForInType for_in_type_; 836 ForInType for_in_type_;
842 FeedbackVectorSlot for_in_feedback_slot_; 837 FeedbackVectorSlot for_in_feedback_slot_;
843 }; 838 };
844 839
845 840
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after
1376 Handle<Map> GetReceiverType() { return receiver_type_; } 1371 Handle<Map> GetReceiverType() { return receiver_type_; }
1377 1372
1378 bool IsCompileTimeValue(); 1373 bool IsCompileTimeValue();
1379 1374
1380 void set_emit_store(bool emit_store); 1375 void set_emit_store(bool emit_store);
1381 bool emit_store(); 1376 bool emit_store();
1382 1377
1383 bool is_static() const { return is_static_; } 1378 bool is_static() const { return is_static_; }
1384 bool is_computed_name() const { return is_computed_name_; } 1379 bool is_computed_name() const { return is_computed_name_; }
1385 1380
1386 FeedbackVectorICSlot GetSlot(int offset = 0) const { 1381 FeedbackVectorSlot GetSlot(int offset = 0) const {
1387 if (slot_.IsInvalid()) return slot_; 1382 DCHECK_LT(offset, static_cast<int>(arraysize(slots_)));
1388 int slot = slot_.ToInt(); 1383 return slots_[offset];
1389 return FeedbackVectorICSlot(slot + offset);
1390 } 1384 }
1391 FeedbackVectorICSlot slot() const { return slot_; } 1385 void SetSlot(FeedbackVectorSlot slot, int offset = 0) {
1392 void set_slot(FeedbackVectorICSlot slot) { slot_ = slot; } 1386 DCHECK_LT(offset, static_cast<int>(arraysize(slots_)));
1387 slots_[offset] = slot;
1388 }
1393 1389
1394 void set_receiver_type(Handle<Map> map) { receiver_type_ = map; } 1390 void set_receiver_type(Handle<Map> map) { receiver_type_ = map; }
1395 1391
1396 protected: 1392 protected:
1397 friend class AstNodeFactory; 1393 friend class AstNodeFactory;
1398 1394
1399 ObjectLiteralProperty(Expression* key, Expression* value, Kind kind, 1395 ObjectLiteralProperty(Expression* key, Expression* value, Kind kind,
1400 bool is_static, bool is_computed_name); 1396 bool is_static, bool is_computed_name);
1401 ObjectLiteralProperty(AstValueFactory* ast_value_factory, Expression* key, 1397 ObjectLiteralProperty(AstValueFactory* ast_value_factory, Expression* key,
1402 Expression* value, bool is_static, 1398 Expression* value, bool is_static,
1403 bool is_computed_name); 1399 bool is_computed_name);
1404 1400
1405 private: 1401 private:
1406 Expression* key_; 1402 Expression* key_;
1407 Expression* value_; 1403 Expression* value_;
1408 FeedbackVectorICSlot slot_; 1404 FeedbackVectorSlot slots_[2];
1409 Kind kind_; 1405 Kind kind_;
1410 bool emit_store_; 1406 bool emit_store_;
1411 bool is_static_; 1407 bool is_static_;
1412 bool is_computed_name_; 1408 bool is_computed_name_;
1413 Handle<Map> receiver_type_; 1409 Handle<Map> receiver_type_;
1414 }; 1410 };
1415 1411
1416 1412
1417 // An object literal has a boilerplate object that is used 1413 // An object literal has a boilerplate object that is used
1418 // for minimizing the work when constructing it at runtime. 1414 // for minimizing the work when constructing it at runtime.
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1479 // Return an AST id for a property that is used in simulate instructions. 1475 // Return an AST id for a property that is used in simulate instructions.
1480 BailoutId GetIdForProperty(int i) { return BailoutId(local_id(i + 1)); } 1476 BailoutId GetIdForProperty(int i) { return BailoutId(local_id(i + 1)); }
1481 1477
1482 // Unlike other AST nodes, this number of bailout IDs allocated for an 1478 // Unlike other AST nodes, this number of bailout IDs allocated for an
1483 // ObjectLiteral can vary, so num_ids() is not a static method. 1479 // ObjectLiteral can vary, so num_ids() is not a static method.
1484 int num_ids() const { return parent_num_ids() + 1 + properties()->length(); } 1480 int num_ids() const { return parent_num_ids() + 1 + properties()->length(); }
1485 1481
1486 // Object literals need one feedback slot for each non-trivial value, as well 1482 // Object literals need one feedback slot for each non-trivial value, as well
1487 // as some slots for home objects. 1483 // as some slots for home objects.
1488 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1484 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
1489 ICSlotCache* cache) override; 1485 FeedbackVectorSlotCache* cache) override;
1490 1486
1491 protected: 1487 protected:
1492 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, 1488 ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index,
1493 int boilerplate_properties, bool has_function, bool is_strong, 1489 int boilerplate_properties, bool has_function, bool is_strong,
1494 int pos) 1490 int pos)
1495 : MaterializedLiteral(zone, literal_index, is_strong, pos), 1491 : MaterializedLiteral(zone, literal_index, is_strong, pos),
1496 properties_(properties), 1492 properties_(properties),
1497 boilerplate_properties_(boilerplate_properties), 1493 boilerplate_properties_(boilerplate_properties),
1498 fast_elements_(false), 1494 fast_elements_(false),
1499 has_elements_(false), 1495 has_elements_(false),
1500 may_store_doubles_(false), 1496 may_store_doubles_(false),
1501 has_function_(has_function), 1497 has_function_(has_function) {}
1502 slot_(FeedbackVectorICSlot::Invalid()) {
1503 }
1504 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } 1498 static int parent_num_ids() { return MaterializedLiteral::num_ids(); }
1505 1499
1506 private: 1500 private:
1507 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1501 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1508 Handle<FixedArray> constant_properties_; 1502 Handle<FixedArray> constant_properties_;
1509 ZoneList<Property*>* properties_; 1503 ZoneList<Property*>* properties_;
1510 int boilerplate_properties_; 1504 int boilerplate_properties_;
1511 bool fast_elements_; 1505 bool fast_elements_;
1512 bool has_elements_; 1506 bool has_elements_;
1513 bool may_store_doubles_; 1507 bool may_store_doubles_;
1514 bool has_function_; 1508 bool has_function_;
1515 FeedbackVectorICSlot slot_; 1509 FeedbackVectorSlot slot_;
1516 }; 1510 };
1517 1511
1518 1512
1519 // Node for capturing a regexp literal. 1513 // Node for capturing a regexp literal.
1520 class RegExpLiteral final : public MaterializedLiteral { 1514 class RegExpLiteral final : public MaterializedLiteral {
1521 public: 1515 public:
1522 DECLARE_NODE_TYPE(RegExpLiteral) 1516 DECLARE_NODE_TYPE(RegExpLiteral)
1523 1517
1524 Handle<String> pattern() const { return pattern_->string(); } 1518 Handle<String> pattern() const { return pattern_->string(); }
1525 Handle<String> flags() const { return flags_->string(); } 1519 Handle<String> flags() const { return flags_->string(); }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1649 int end_position() const { return end_position_; } 1643 int end_position() const { return end_position_; }
1650 1644
1651 // Bind this proxy to the variable var. 1645 // Bind this proxy to the variable var.
1652 void BindTo(Variable* var); 1646 void BindTo(Variable* var);
1653 1647
1654 bool UsesVariableFeedbackSlot() const { 1648 bool UsesVariableFeedbackSlot() const {
1655 return var()->IsUnallocated() || var()->IsLookupSlot(); 1649 return var()->IsUnallocated() || var()->IsLookupSlot();
1656 } 1650 }
1657 1651
1658 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1652 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
1659 ICSlotCache* cache) override; 1653 FeedbackVectorSlotCache* cache) override;
1660 1654
1661 FeedbackVectorICSlot VariableFeedbackSlot() { 1655 FeedbackVectorSlot VariableFeedbackSlot() { return variable_feedback_slot_; }
1662 return variable_feedback_slot_;
1663 }
1664 1656
1665 static int num_ids() { return parent_num_ids() + 1; } 1657 static int num_ids() { return parent_num_ids() + 1; }
1666 BailoutId BeforeId() const { return BailoutId(local_id(0)); } 1658 BailoutId BeforeId() const { return BailoutId(local_id(0)); }
1667 1659
1668 protected: 1660 protected:
1669 VariableProxy(Zone* zone, Variable* var, int start_position, 1661 VariableProxy(Zone* zone, Variable* var, int start_position,
1670 int end_position); 1662 int end_position);
1671 1663
1672 VariableProxy(Zone* zone, const AstRawString* name, 1664 VariableProxy(Zone* zone, const AstRawString* name,
1673 Variable::Kind variable_kind, int start_position, 1665 Variable::Kind variable_kind, int start_position,
1674 int end_position); 1666 int end_position);
1675 static int parent_num_ids() { return Expression::num_ids(); } 1667 static int parent_num_ids() { return Expression::num_ids(); }
1676 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1668 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1677 1669
1678 class IsThisField : public BitField8<bool, 0, 1> {}; 1670 class IsThisField : public BitField8<bool, 0, 1> {};
1679 class IsAssignedField : public BitField8<bool, 1, 1> {}; 1671 class IsAssignedField : public BitField8<bool, 1, 1> {};
1680 class IsResolvedField : public BitField8<bool, 2, 1> {}; 1672 class IsResolvedField : public BitField8<bool, 2, 1> {};
1681 class IsNewTargetField : public BitField8<bool, 3, 1> {}; 1673 class IsNewTargetField : public BitField8<bool, 3, 1> {};
1682 1674
1683 // Start with 16-bit (or smaller) field, which should get packed together 1675 // Start with 16-bit (or smaller) field, which should get packed together
1684 // with Expression's trailing 16-bit field. 1676 // with Expression's trailing 16-bit field.
1685 uint8_t bit_field_; 1677 uint8_t bit_field_;
1686 FeedbackVectorICSlot variable_feedback_slot_; 1678 FeedbackVectorSlot variable_feedback_slot_;
1687 union { 1679 union {
1688 const AstRawString* raw_name_; // if !is_resolved_ 1680 const AstRawString* raw_name_; // if !is_resolved_
1689 Variable* var_; // if is_resolved_ 1681 Variable* var_; // if is_resolved_
1690 }; 1682 };
1691 // Position is stored in the AstNode superclass, but VariableProxy needs to 1683 // Position is stored in the AstNode superclass, but VariableProxy needs to
1692 // know its end position too (for error messages). It cannot be inferred from 1684 // know its end position too (for error messages). It cannot be inferred from
1693 // the variable name length because it can contain escapes. 1685 // the variable name length because it can contain escapes.
1694 int end_position_; 1686 int end_position_;
1695 }; 1687 };
1696 1688
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1748 bit_field_ = InlineCacheStateField::update(bit_field_, state); 1740 bit_field_ = InlineCacheStateField::update(bit_field_, state);
1749 } 1741 }
1750 void mark_for_call() { 1742 void mark_for_call() {
1751 bit_field_ = IsForCallField::update(bit_field_, true); 1743 bit_field_ = IsForCallField::update(bit_field_, true);
1752 } 1744 }
1753 bool is_for_call() const { return IsForCallField::decode(bit_field_); } 1745 bool is_for_call() const { return IsForCallField::decode(bit_field_); }
1754 1746
1755 bool IsSuperAccess() { return obj()->IsSuperPropertyReference(); } 1747 bool IsSuperAccess() { return obj()->IsSuperPropertyReference(); }
1756 1748
1757 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1749 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
1758 ICSlotCache* cache) override { 1750 FeedbackVectorSlotCache* cache) override {
1759 FeedbackVectorSlotKind kind = key()->IsPropertyName() 1751 FeedbackVectorSlotKind kind = key()->IsPropertyName()
1760 ? FeedbackVectorSlotKind::LOAD_IC 1752 ? FeedbackVectorSlotKind::LOAD_IC
1761 : FeedbackVectorSlotKind::KEYED_LOAD_IC; 1753 : FeedbackVectorSlotKind::KEYED_LOAD_IC;
1762 property_feedback_slot_ = spec->AddSlot(kind); 1754 property_feedback_slot_ = spec->AddSlot(kind);
1763 } 1755 }
1764 1756
1765 FeedbackVectorICSlot PropertyFeedbackSlot() const { 1757 FeedbackVectorSlot PropertyFeedbackSlot() const {
1766 return property_feedback_slot_; 1758 return property_feedback_slot_;
1767 } 1759 }
1768 1760
1769 static LhsKind GetAssignType(Property* property) { 1761 static LhsKind GetAssignType(Property* property) {
1770 if (property == NULL) return VARIABLE; 1762 if (property == NULL) return VARIABLE;
1771 bool super_access = property->IsSuperAccess(); 1763 bool super_access = property->IsSuperAccess();
1772 return (property->key()->IsPropertyName()) 1764 return (property->key()->IsPropertyName())
1773 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) 1765 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY)
1774 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY); 1766 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY);
1775 } 1767 }
1776 1768
1777 protected: 1769 protected:
1778 Property(Zone* zone, Expression* obj, Expression* key, int pos) 1770 Property(Zone* zone, Expression* obj, Expression* key, int pos)
1779 : Expression(zone, pos), 1771 : Expression(zone, pos),
1780 bit_field_(IsForCallField::encode(false) | 1772 bit_field_(IsForCallField::encode(false) |
1781 IsStringAccessField::encode(false) | 1773 IsStringAccessField::encode(false) |
1782 InlineCacheStateField::encode(UNINITIALIZED)), 1774 InlineCacheStateField::encode(UNINITIALIZED)),
1783 property_feedback_slot_(FeedbackVectorICSlot::Invalid()),
1784 obj_(obj), 1775 obj_(obj),
1785 key_(key) {} 1776 key_(key) {}
1786 static int parent_num_ids() { return Expression::num_ids(); } 1777 static int parent_num_ids() { return Expression::num_ids(); }
1787 1778
1788 private: 1779 private:
1789 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1780 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1790 1781
1791 class IsForCallField : public BitField8<bool, 0, 1> {}; 1782 class IsForCallField : public BitField8<bool, 0, 1> {};
1792 class IsStringAccessField : public BitField8<bool, 1, 1> {}; 1783 class IsStringAccessField : public BitField8<bool, 1, 1> {};
1793 class KeyTypeField : public BitField8<IcCheckType, 2, 1> {}; 1784 class KeyTypeField : public BitField8<IcCheckType, 2, 1> {};
1794 class InlineCacheStateField : public BitField8<InlineCacheState, 3, 4> {}; 1785 class InlineCacheStateField : public BitField8<InlineCacheState, 3, 4> {};
1795 uint8_t bit_field_; 1786 uint8_t bit_field_;
1796 FeedbackVectorICSlot property_feedback_slot_; 1787 FeedbackVectorSlot property_feedback_slot_;
1797 Expression* obj_; 1788 Expression* obj_;
1798 Expression* key_; 1789 Expression* key_;
1799 SmallMapList receiver_types_; 1790 SmallMapList receiver_types_;
1800 }; 1791 };
1801 1792
1802 1793
1803 class Call final : public Expression { 1794 class Call final : public Expression {
1804 public: 1795 public:
1805 DECLARE_NODE_TYPE(Call) 1796 DECLARE_NODE_TYPE(Call)
1806 1797
1807 Expression* expression() const { return expression_; } 1798 Expression* expression() const { return expression_; }
1808 ZoneList<Expression*>* arguments() const { return arguments_; } 1799 ZoneList<Expression*>* arguments() const { return arguments_; }
1809 1800
1810 // Type feedback information. 1801 // Type feedback information.
1811 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1802 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
1812 ICSlotCache* cache) override; 1803 FeedbackVectorSlotCache* cache) override;
1813 1804
1814 FeedbackVectorSlot CallFeedbackSlot() const { return slot_; } 1805 FeedbackVectorSlot CallFeedbackSlot() const { return stub_slot_; }
1815 1806
1816 FeedbackVectorICSlot CallFeedbackICSlot() const { return ic_slot_; } 1807 FeedbackVectorSlot CallFeedbackICSlot() const { return ic_slot_; }
1817 1808
1818 SmallMapList* GetReceiverTypes() override { 1809 SmallMapList* GetReceiverTypes() override {
1819 if (expression()->IsProperty()) { 1810 if (expression()->IsProperty()) {
1820 return expression()->AsProperty()->GetReceiverTypes(); 1811 return expression()->AsProperty()->GetReceiverTypes();
1821 } 1812 }
1822 return NULL; 1813 return NULL;
1823 } 1814 }
1824 1815
1825 bool IsMonomorphic() override { 1816 bool IsMonomorphic() override {
1826 if (expression()->IsProperty()) { 1817 if (expression()->IsProperty()) {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1879 1870
1880 #ifdef DEBUG 1871 #ifdef DEBUG
1881 // Used to assert that the FullCodeGenerator records the return site. 1872 // Used to assert that the FullCodeGenerator records the return site.
1882 bool return_is_recorded_; 1873 bool return_is_recorded_;
1883 #endif 1874 #endif
1884 1875
1885 protected: 1876 protected:
1886 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1877 Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
1887 int pos) 1878 int pos)
1888 : Expression(zone, pos), 1879 : Expression(zone, pos),
1889 ic_slot_(FeedbackVectorICSlot::Invalid()),
1890 slot_(FeedbackVectorSlot::Invalid()),
1891 expression_(expression), 1880 expression_(expression),
1892 arguments_(arguments), 1881 arguments_(arguments),
1893 bit_field_(IsUninitializedField::encode(false)) { 1882 bit_field_(IsUninitializedField::encode(false)) {
1894 if (expression->IsProperty()) { 1883 if (expression->IsProperty()) {
1895 expression->AsProperty()->mark_for_call(); 1884 expression->AsProperty()->mark_for_call();
1896 } 1885 }
1897 } 1886 }
1898 static int parent_num_ids() { return Expression::num_ids(); } 1887 static int parent_num_ids() { return Expression::num_ids(); }
1899 1888
1900 private: 1889 private:
1901 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1890 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1902 1891
1903 FeedbackVectorICSlot ic_slot_; 1892 FeedbackVectorSlot ic_slot_;
1904 FeedbackVectorSlot slot_; 1893 FeedbackVectorSlot stub_slot_;
1905 Expression* expression_; 1894 Expression* expression_;
1906 ZoneList<Expression*>* arguments_; 1895 ZoneList<Expression*>* arguments_;
1907 Handle<JSFunction> target_; 1896 Handle<JSFunction> target_;
1908 Handle<AllocationSite> allocation_site_; 1897 Handle<AllocationSite> allocation_site_;
1909 class IsUninitializedField : public BitField8<bool, 0, 1> {}; 1898 class IsUninitializedField : public BitField8<bool, 0, 1> {};
1910 uint8_t bit_field_; 1899 uint8_t bit_field_;
1911 }; 1900 };
1912 1901
1913 1902
1914 class CallNew final : public Expression { 1903 class CallNew final : public Expression {
1915 public: 1904 public:
1916 DECLARE_NODE_TYPE(CallNew) 1905 DECLARE_NODE_TYPE(CallNew)
1917 1906
1918 Expression* expression() const { return expression_; } 1907 Expression* expression() const { return expression_; }
1919 ZoneList<Expression*>* arguments() const { return arguments_; } 1908 ZoneList<Expression*>* arguments() const { return arguments_; }
1920 1909
1921 // Type feedback information. 1910 // Type feedback information.
1922 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1911 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
1923 ICSlotCache* cache) override { 1912 FeedbackVectorSlotCache* cache) override {
1924 callnew_feedback_slot_ = spec->AddStubSlot(); 1913 callnew_feedback_slot_ = spec->AddGeneralSlot();
1925 } 1914 }
1926 1915
1927 FeedbackVectorSlot CallNewFeedbackSlot() { 1916 FeedbackVectorSlot CallNewFeedbackSlot() {
1928 DCHECK(!callnew_feedback_slot_.IsInvalid()); 1917 DCHECK(!callnew_feedback_slot_.IsInvalid());
1929 return callnew_feedback_slot_; 1918 return callnew_feedback_slot_;
1930 } 1919 }
1931 1920
1932 bool IsMonomorphic() override { return is_monomorphic_; } 1921 bool IsMonomorphic() override { return is_monomorphic_; }
1933 Handle<JSFunction> target() const { return target_; } 1922 Handle<JSFunction> target() const { return target_; }
1934 Handle<AllocationSite> allocation_site() const { 1923 Handle<AllocationSite> allocation_site() const {
(...skipping 13 matching lines...) Expand all
1948 target_ = target; 1937 target_ = target;
1949 is_monomorphic_ = true; 1938 is_monomorphic_ = true;
1950 } 1939 }
1951 1940
1952 protected: 1941 protected:
1953 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1942 CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments,
1954 int pos) 1943 int pos)
1955 : Expression(zone, pos), 1944 : Expression(zone, pos),
1956 expression_(expression), 1945 expression_(expression),
1957 arguments_(arguments), 1946 arguments_(arguments),
1958 is_monomorphic_(false), 1947 is_monomorphic_(false) {}
1959 callnew_feedback_slot_(FeedbackVectorSlot::Invalid()) {}
1960 1948
1961 static int parent_num_ids() { return Expression::num_ids(); } 1949 static int parent_num_ids() { return Expression::num_ids(); }
1962 1950
1963 private: 1951 private:
1964 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 1952 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
1965 1953
1966 Expression* expression_; 1954 Expression* expression_;
1967 ZoneList<Expression*>* arguments_; 1955 ZoneList<Expression*>* arguments_;
1968 bool is_monomorphic_; 1956 bool is_monomorphic_;
1969 Handle<JSFunction> target_; 1957 Handle<JSFunction> target_;
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
2144 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } 2132 BailoutId AssignmentId() const { return BailoutId(local_id(0)); }
2145 BailoutId ToNumberId() const { return BailoutId(local_id(1)); } 2133 BailoutId ToNumberId() const { return BailoutId(local_id(1)); }
2146 TypeFeedbackId CountBinOpFeedbackId() const { 2134 TypeFeedbackId CountBinOpFeedbackId() const {
2147 return TypeFeedbackId(local_id(2)); 2135 return TypeFeedbackId(local_id(2));
2148 } 2136 }
2149 TypeFeedbackId CountStoreFeedbackId() const { 2137 TypeFeedbackId CountStoreFeedbackId() const {
2150 return TypeFeedbackId(local_id(3)); 2138 return TypeFeedbackId(local_id(3));
2151 } 2139 }
2152 2140
2153 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2141 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
2154 ICSlotCache* cache) override; 2142 FeedbackVectorSlotCache* cache) override;
2155 FeedbackVectorICSlot CountSlot() const { return slot_; } 2143 FeedbackVectorSlot CountSlot() const { return slot_; }
2156 2144
2157 protected: 2145 protected:
2158 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, 2146 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr,
2159 int pos) 2147 int pos)
2160 : Expression(zone, pos), 2148 : Expression(zone, pos),
2161 bit_field_( 2149 bit_field_(
2162 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | 2150 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) |
2163 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), 2151 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)),
2164 type_(NULL), 2152 type_(NULL),
2165 expression_(expr), 2153 expression_(expr) {}
2166 slot_(FeedbackVectorICSlot::Invalid()) {}
2167 static int parent_num_ids() { return Expression::num_ids(); } 2154 static int parent_num_ids() { return Expression::num_ids(); }
2168 2155
2169 private: 2156 private:
2170 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2157 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2171 2158
2172 class IsPrefixField : public BitField16<bool, 0, 1> {}; 2159 class IsPrefixField : public BitField16<bool, 0, 1> {};
2173 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; 2160 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {};
2174 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {}; 2161 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {};
2175 class TokenField : public BitField16<Token::Value, 5, 8> {}; 2162 class TokenField : public BitField16<Token::Value, 5, 8> {};
2176 2163
2177 // Starts with 16-bit field, which should get packed together with 2164 // Starts with 16-bit field, which should get packed together with
2178 // Expression's trailing 16-bit field. 2165 // Expression's trailing 16-bit field.
2179 uint16_t bit_field_; 2166 uint16_t bit_field_;
2180 Type* type_; 2167 Type* type_;
2181 Expression* expression_; 2168 Expression* expression_;
2182 SmallMapList receiver_types_; 2169 SmallMapList receiver_types_;
2183 FeedbackVectorICSlot slot_; 2170 FeedbackVectorSlot slot_;
2184 }; 2171 };
2185 2172
2186 2173
2187 class CompareOperation final : public Expression { 2174 class CompareOperation final : public Expression {
2188 public: 2175 public:
2189 DECLARE_NODE_TYPE(CompareOperation) 2176 DECLARE_NODE_TYPE(CompareOperation)
2190 2177
2191 Token::Value op() const { return op_; } 2178 Token::Value op() const { return op_; }
2192 Expression* left() const { return left_; } 2179 Expression* left() const { return left_; }
2193 Expression* right() const { return right_; } 2180 Expression* right() const { return right_; }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
2317 bit_field_ = IsUninitializedField::update(bit_field_, b); 2304 bit_field_ = IsUninitializedField::update(bit_field_, b);
2318 } 2305 }
2319 void set_key_type(IcCheckType key_type) { 2306 void set_key_type(IcCheckType key_type) {
2320 bit_field_ = KeyTypeField::update(bit_field_, key_type); 2307 bit_field_ = KeyTypeField::update(bit_field_, key_type);
2321 } 2308 }
2322 void set_store_mode(KeyedAccessStoreMode mode) { 2309 void set_store_mode(KeyedAccessStoreMode mode) {
2323 bit_field_ = StoreModeField::update(bit_field_, mode); 2310 bit_field_ = StoreModeField::update(bit_field_, mode);
2324 } 2311 }
2325 2312
2326 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2313 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
2327 ICSlotCache* cache) override; 2314 FeedbackVectorSlotCache* cache) override;
2328 FeedbackVectorICSlot AssignmentSlot() const { return slot_; } 2315 FeedbackVectorSlot AssignmentSlot() const { return slot_; }
2329 2316
2330 protected: 2317 protected:
2331 Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value, 2318 Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value,
2332 int pos); 2319 int pos);
2333 static int parent_num_ids() { return Expression::num_ids(); } 2320 static int parent_num_ids() { return Expression::num_ids(); }
2334 2321
2335 private: 2322 private:
2336 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2323 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2337 2324
2338 class IsUninitializedField : public BitField16<bool, 0, 1> {}; 2325 class IsUninitializedField : public BitField16<bool, 0, 1> {};
2339 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; 2326 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {};
2340 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {}; 2327 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {};
2341 class TokenField : public BitField16<Token::Value, 5, 8> {}; 2328 class TokenField : public BitField16<Token::Value, 5, 8> {};
2342 2329
2343 // Starts with 16-bit field, which should get packed together with 2330 // Starts with 16-bit field, which should get packed together with
2344 // Expression's trailing 16-bit field. 2331 // Expression's trailing 16-bit field.
2345 uint16_t bit_field_; 2332 uint16_t bit_field_;
2346 Expression* target_; 2333 Expression* target_;
2347 Expression* value_; 2334 Expression* value_;
2348 BinaryOperation* binary_operation_; 2335 BinaryOperation* binary_operation_;
2349 SmallMapList receiver_types_; 2336 SmallMapList receiver_types_;
2350 FeedbackVectorICSlot slot_; 2337 FeedbackVectorSlot slot_;
2351 }; 2338 };
2352 2339
2353 2340
2354 class Yield final : public Expression { 2341 class Yield final : public Expression {
2355 public: 2342 public:
2356 DECLARE_NODE_TYPE(Yield) 2343 DECLARE_NODE_TYPE(Yield)
2357 2344
2358 enum Kind { 2345 enum Kind {
2359 kInitial, // The initial yield that returns the unboxed generator object. 2346 kInitial, // The initial yield that returns the unboxed generator object.
2360 kSuspend, // A normal yield: { value: EXPRESSION, done: false } 2347 kSuspend, // A normal yield: { value: EXPRESSION, done: false }
2361 kDelegating, // A yield*. 2348 kDelegating, // A yield*.
2362 kFinal // A return: { value: EXPRESSION, done: true } 2349 kFinal // A return: { value: EXPRESSION, done: true }
2363 }; 2350 };
2364 2351
2365 Expression* generator_object() const { return generator_object_; } 2352 Expression* generator_object() const { return generator_object_; }
2366 Expression* expression() const { return expression_; } 2353 Expression* expression() const { return expression_; }
2367 Kind yield_kind() const { return yield_kind_; } 2354 Kind yield_kind() const { return yield_kind_; }
2368 2355
2369 // Type feedback information. 2356 // Type feedback information.
2370 bool HasFeedbackSlots() const { return yield_kind() == kDelegating; } 2357 bool HasFeedbackSlots() const { return yield_kind() == kDelegating; }
2371 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2358 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
2372 ICSlotCache* cache) override { 2359 FeedbackVectorSlotCache* cache) override {
2373 if (HasFeedbackSlots()) { 2360 if (HasFeedbackSlots()) {
2374 yield_first_feedback_slot_ = spec->AddKeyedLoadICSlot(); 2361 yield_first_feedback_slot_ = spec->AddKeyedLoadICSlot();
2375 spec->AddLoadICSlots(2); 2362 keyed_load_feedback_slot_ = spec->AddLoadICSlot();
2363 done_feedback_slot_ = spec->AddLoadICSlot();
2376 } 2364 }
2377 } 2365 }
2378 2366
2379 FeedbackVectorICSlot KeyedLoadFeedbackSlot() { 2367 FeedbackVectorSlot KeyedLoadFeedbackSlot() {
2380 DCHECK(!HasFeedbackSlots() || !yield_first_feedback_slot_.IsInvalid()); 2368 DCHECK(!HasFeedbackSlots() || !yield_first_feedback_slot_.IsInvalid());
2381 return yield_first_feedback_slot_; 2369 return yield_first_feedback_slot_;
2382 } 2370 }
2383 2371
2384 FeedbackVectorICSlot DoneFeedbackSlot() { 2372 FeedbackVectorSlot DoneFeedbackSlot() { return keyed_load_feedback_slot_; }
2385 return KeyedLoadFeedbackSlot().next();
2386 }
2387 2373
2388 FeedbackVectorICSlot ValueFeedbackSlot() { return DoneFeedbackSlot().next(); } 2374 FeedbackVectorSlot ValueFeedbackSlot() { return done_feedback_slot_; }
2389 2375
2390 protected: 2376 protected:
2391 Yield(Zone* zone, Expression* generator_object, Expression* expression, 2377 Yield(Zone* zone, Expression* generator_object, Expression* expression,
2392 Kind yield_kind, int pos) 2378 Kind yield_kind, int pos)
2393 : Expression(zone, pos), 2379 : Expression(zone, pos),
2394 generator_object_(generator_object), 2380 generator_object_(generator_object),
2395 expression_(expression), 2381 expression_(expression),
2396 yield_kind_(yield_kind), 2382 yield_kind_(yield_kind) {}
2397 yield_first_feedback_slot_(FeedbackVectorICSlot::Invalid()) {}
2398 2383
2399 private: 2384 private:
2400 Expression* generator_object_; 2385 Expression* generator_object_;
2401 Expression* expression_; 2386 Expression* expression_;
2402 Kind yield_kind_; 2387 Kind yield_kind_;
2403 FeedbackVectorICSlot yield_first_feedback_slot_; 2388 FeedbackVectorSlot yield_first_feedback_slot_;
2389 FeedbackVectorSlot keyed_load_feedback_slot_;
2390 FeedbackVectorSlot done_feedback_slot_;
2404 }; 2391 };
2405 2392
2406 2393
2407 class Throw final : public Expression { 2394 class Throw final : public Expression {
2408 public: 2395 public:
2409 DECLARE_NODE_TYPE(Throw) 2396 DECLARE_NODE_TYPE(Throw)
2410 2397
2411 Expression* exception() const { return exception_; } 2398 Expression* exception() const { return exception_; }
2412 2399
2413 protected: 2400 protected:
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
2635 // Return an AST id for a property that is used in simulate instructions. 2622 // Return an AST id for a property that is used in simulate instructions.
2636 BailoutId GetIdForProperty(int i) { return BailoutId(local_id(i + 4)); } 2623 BailoutId GetIdForProperty(int i) { return BailoutId(local_id(i + 4)); }
2637 2624
2638 // Unlike other AST nodes, this number of bailout IDs allocated for an 2625 // Unlike other AST nodes, this number of bailout IDs allocated for an
2639 // ClassLiteral can vary, so num_ids() is not a static method. 2626 // ClassLiteral can vary, so num_ids() is not a static method.
2640 int num_ids() const { return parent_num_ids() + 4 + properties()->length(); } 2627 int num_ids() const { return parent_num_ids() + 4 + properties()->length(); }
2641 2628
2642 // Object literals need one feedback slot for each non-trivial value, as well 2629 // Object literals need one feedback slot for each non-trivial value, as well
2643 // as some slots for home objects. 2630 // as some slots for home objects.
2644 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2631 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
2645 ICSlotCache* cache) override; 2632 FeedbackVectorSlotCache* cache) override;
2646 2633
2647 bool NeedsProxySlot() const { 2634 bool NeedsProxySlot() const {
2648 return FLAG_vector_stores && scope() != NULL && 2635 return FLAG_vector_stores && scope() != NULL &&
2649 class_variable_proxy()->var()->IsUnallocated(); 2636 class_variable_proxy()->var()->IsUnallocated();
2650 } 2637 }
2651 2638
2652 FeedbackVectorICSlot ProxySlot() const { return slot_; } 2639 FeedbackVectorSlot ProxySlot() const { return slot_; }
2653 2640
2654 protected: 2641 protected:
2655 ClassLiteral(Zone* zone, const AstRawString* name, Scope* scope, 2642 ClassLiteral(Zone* zone, const AstRawString* name, Scope* scope,
2656 VariableProxy* class_variable_proxy, Expression* extends, 2643 VariableProxy* class_variable_proxy, Expression* extends,
2657 FunctionLiteral* constructor, ZoneList<Property*>* properties, 2644 FunctionLiteral* constructor, ZoneList<Property*>* properties,
2658 int start_position, int end_position) 2645 int start_position, int end_position)
2659 : Expression(zone, start_position), 2646 : Expression(zone, start_position),
2660 raw_name_(name), 2647 raw_name_(name),
2661 scope_(scope), 2648 scope_(scope),
2662 class_variable_proxy_(class_variable_proxy), 2649 class_variable_proxy_(class_variable_proxy),
2663 extends_(extends), 2650 extends_(extends),
2664 constructor_(constructor), 2651 constructor_(constructor),
2665 properties_(properties), 2652 properties_(properties),
2666 end_position_(end_position), 2653 end_position_(end_position) {}
2667 slot_(FeedbackVectorICSlot::Invalid()) {
2668 }
2669 2654
2670 static int parent_num_ids() { return Expression::num_ids(); } 2655 static int parent_num_ids() { return Expression::num_ids(); }
2671 2656
2672 private: 2657 private:
2673 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2658 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2674 2659
2675 const AstRawString* raw_name_; 2660 const AstRawString* raw_name_;
2676 Scope* scope_; 2661 Scope* scope_;
2677 VariableProxy* class_variable_proxy_; 2662 VariableProxy* class_variable_proxy_;
2678 Expression* extends_; 2663 Expression* extends_;
2679 FunctionLiteral* constructor_; 2664 FunctionLiteral* constructor_;
2680 ZoneList<Property*>* properties_; 2665 ZoneList<Property*>* properties_;
2681 int end_position_; 2666 int end_position_;
2682 FeedbackVectorICSlot slot_; 2667 FeedbackVectorSlot slot_;
2683 }; 2668 };
2684 2669
2685 2670
2686 class NativeFunctionLiteral final : public Expression { 2671 class NativeFunctionLiteral final : public Expression {
2687 public: 2672 public:
2688 DECLARE_NODE_TYPE(NativeFunctionLiteral) 2673 DECLARE_NODE_TYPE(NativeFunctionLiteral)
2689 2674
2690 Handle<String> name() const { return name_->string(); } 2675 Handle<String> name() const { return name_->string(); }
2691 v8::Extension* extension() const { return extension_; } 2676 v8::Extension* extension() const { return extension_; }
2692 2677
(...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after
3619 // the parser-level zone. 3604 // the parser-level zone.
3620 Zone* parser_zone_; 3605 Zone* parser_zone_;
3621 AstValueFactory* ast_value_factory_; 3606 AstValueFactory* ast_value_factory_;
3622 }; 3607 };
3623 3608
3624 3609
3625 } // namespace internal 3610 } // namespace internal
3626 } // namespace v8 3611 } // namespace v8
3627 3612
3628 #endif // V8_AST_H_ 3613 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « src/arm64/lithium-codegen-arm64.cc ('k') | src/ast.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698