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

Side by Side Diff: src/ast/ast.h

Issue 2625873009: [ast] Remove heap accesses from AST numbering (Closed)
Patch Set: Address nits Created 3 years, 11 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 | « no previous file | src/ast/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_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/assembler.h" 8 #include "src/assembler.h"
9 #include "src/ast/ast-types.h" 9 #include "src/ast/ast-types.h"
10 #include "src/ast/ast-value-factory.h" 10 #include "src/ast/ast-value-factory.h"
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 // names because [] for string objects is handled only by keyed ICs. 313 // names because [] for string objects is handled only by keyed ICs.
314 bool IsPropertyName() const; 314 bool IsPropertyName() const;
315 315
316 // True iff the expression is a class or function expression without 316 // True iff the expression is a class or function expression without
317 // a syntactic name. 317 // a syntactic name.
318 bool IsAnonymousFunctionDefinition() const; 318 bool IsAnonymousFunctionDefinition() const;
319 319
320 // True iff the expression is a literal represented as a smi. 320 // True iff the expression is a literal represented as a smi.
321 bool IsSmiLiteral() const; 321 bool IsSmiLiteral() const;
322 322
323 // True iff the expression is a literal represented as a number.
324 bool IsNumberLiteral() const;
325
323 // True iff the expression is a string literal. 326 // True iff the expression is a string literal.
324 bool IsStringLiteral() const; 327 bool IsStringLiteral() const;
325 328
326 // True iff the expression is the null literal. 329 // True iff the expression is the null literal.
327 bool IsNullLiteral() const; 330 bool IsNullLiteral() const;
328 331
329 // True if we can prove that the expression is the undefined literal. Note 332 // True if we can prove that the expression is the undefined literal. Note
330 // that this also checks for loads of the global "undefined" variable. 333 // that this also checks for loads of the global "undefined" variable.
331 bool IsUndefinedLiteral() const; 334 bool IsUndefinedLiteral() const;
332 335
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 return subject(); 725 return subject();
723 } 726 }
724 727
725 Expression* each() const { return each_; } 728 Expression* each() const { return each_; }
726 Expression* subject() const { return subject_; } 729 Expression* subject() const { return subject_; }
727 730
728 void set_each(Expression* e) { each_ = e; } 731 void set_each(Expression* e) { each_ = e; }
729 void set_subject(Expression* e) { subject_ = e; } 732 void set_subject(Expression* e) { subject_ = e; }
730 733
731 // Type feedback information. 734 // Type feedback information.
732 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 735 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
733 FeedbackVectorSlotCache* cache); 736 FeedbackVectorSlotCache* cache);
734 FeedbackVectorSlot EachFeedbackSlot() const { return each_slot_; } 737 FeedbackVectorSlot EachFeedbackSlot() const { return each_slot_; }
735 FeedbackVectorSlot ForInFeedbackSlot() { 738 FeedbackVectorSlot ForInFeedbackSlot() {
736 DCHECK(!for_in_feedback_slot_.IsInvalid()); 739 DCHECK(!for_in_feedback_slot_.IsInvalid());
737 return for_in_feedback_slot_; 740 return for_in_feedback_slot_;
738 } 741 }
739 742
740 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; 743 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN };
741 ForInType for_in_type() const { return ForInTypeField::decode(bit_field_); } 744 ForInType for_in_type() const { return ForInTypeField::decode(bit_field_); }
742 void set_for_in_type(ForInType type) { 745 void set_for_in_type(ForInType type) {
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
944 static int num_ids() { return parent_num_ids() + 2; } 947 static int num_ids() { return parent_num_ids() + 2; }
945 BailoutId EntryId() const { return BailoutId(local_id(0)); } 948 BailoutId EntryId() const { return BailoutId(local_id(0)); }
946 TypeFeedbackId CompareId() { return TypeFeedbackId(local_id(1)); } 949 TypeFeedbackId CompareId() { return TypeFeedbackId(local_id(1)); }
947 950
948 AstType* compare_type() { return compare_type_; } 951 AstType* compare_type() { return compare_type_; }
949 void set_compare_type(AstType* type) { compare_type_ = type; } 952 void set_compare_type(AstType* type) { compare_type_ = type; }
950 953
951 // CaseClause will have both a slot in the feedback vector and the 954 // CaseClause will have both a slot in the feedback vector and the
952 // TypeFeedbackId to record the type information. TypeFeedbackId is used by 955 // TypeFeedbackId to record the type information. TypeFeedbackId is used by
953 // full codegen and the feedback vector slot is used by interpreter. 956 // full codegen and the feedback vector slot is used by interpreter.
954 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 957 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
955 FeedbackVectorSlotCache* cache); 958 FeedbackVectorSlotCache* cache);
956 959
957 FeedbackVectorSlot CompareOperationFeedbackSlot() { 960 FeedbackVectorSlot CompareOperationFeedbackSlot() {
958 return type_feedback_slot_; 961 return type_feedback_slot_;
959 } 962 }
960 963
961 private: 964 private:
962 friend class AstNodeFactory; 965 friend class AstNodeFactory;
963 966
964 static int parent_num_ids() { return Expression::num_ids(); } 967 static int parent_num_ids() { return Expression::num_ids(); }
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 void set_is_simple(bool is_simple) { 1283 void set_is_simple(bool is_simple) {
1281 bit_field_ = IsSimpleField::update(bit_field_, is_simple); 1284 bit_field_ = IsSimpleField::update(bit_field_, is_simple);
1282 } 1285 }
1283 friend class CompileTimeValue; 1286 friend class CompileTimeValue;
1284 1287
1285 void set_depth(int depth) { 1288 void set_depth(int depth) {
1286 DCHECK_LE(1, depth); 1289 DCHECK_LE(1, depth);
1287 depth_ = depth; 1290 depth_ = depth;
1288 } 1291 }
1289 1292
1293 // Populate the depth field and any flags the literal has.
1294 void InitDepthAndFlags();
1295
1290 // Populate the constant properties/elements fixed array. 1296 // Populate the constant properties/elements fixed array.
1291 void BuildConstants(Isolate* isolate); 1297 void BuildConstants(Isolate* isolate);
1292 friend class ArrayLiteral; 1298 friend class ArrayLiteral;
1293 friend class ObjectLiteral; 1299 friend class ObjectLiteral;
1294 1300
1295 // If the expression is a literal, return the literal value; 1301 // If the expression is a literal, return the literal value;
1296 // if the expression is a materialized literal and is simple return a 1302 // if the expression is a materialized literal and is simple return a
1297 // compile time value as encoded by CompileTimeValue::GetValue(). 1303 // compile time value as encoded by CompileTimeValue::GetValue().
1298 // Otherwise, return undefined literal as the placeholder 1304 // Otherwise, return undefined literal as the placeholder
1299 // in the object literal boilerplate. 1305 // in the object literal boilerplate.
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1380 }; 1386 };
1381 1387
1382 1388
1383 // An object literal has a boilerplate object that is used 1389 // An object literal has a boilerplate object that is used
1384 // for minimizing the work when constructing it at runtime. 1390 // for minimizing the work when constructing it at runtime.
1385 class ObjectLiteral final : public MaterializedLiteral { 1391 class ObjectLiteral final : public MaterializedLiteral {
1386 public: 1392 public:
1387 typedef ObjectLiteralProperty Property; 1393 typedef ObjectLiteralProperty Property;
1388 1394
1389 Handle<FixedArray> constant_properties() const { 1395 Handle<FixedArray> constant_properties() const {
1396 DCHECK(!constant_properties_.is_null());
1390 return constant_properties_; 1397 return constant_properties_;
1391 } 1398 }
1392 int properties_count() const { return boilerplate_properties_; } 1399 int properties_count() const { return boilerplate_properties_; }
1393 ZoneList<Property*>* properties() const { return properties_; } 1400 ZoneList<Property*>* properties() const { return properties_; }
1394 bool fast_elements() const { return FastElementsField::decode(bit_field_); } 1401 bool fast_elements() const { return FastElementsField::decode(bit_field_); }
1395 bool may_store_doubles() const { 1402 bool may_store_doubles() const {
1396 return MayStoreDoublesField::decode(bit_field_); 1403 return MayStoreDoublesField::decode(bit_field_);
1397 } 1404 }
1398 bool has_elements() const { return HasElementsField::decode(bit_field_); } 1405 bool has_elements() const { return HasElementsField::decode(bit_field_); }
1399 bool has_shallow_properties() const { 1406 bool has_shallow_properties() const {
1400 return depth() == 1 && !has_elements() && !may_store_doubles(); 1407 return depth() == 1 && !has_elements() && !may_store_doubles();
1401 } 1408 }
1402 1409
1403 // Decide if a property should be in the object boilerplate. 1410 // Decide if a property should be in the object boilerplate.
1404 static bool IsBoilerplateProperty(Property* property); 1411 static bool IsBoilerplateProperty(Property* property);
1405 1412
1413 // Populate the depth field and flags.
1414 void InitDepthAndFlags();
1415
1416 // Get the constant properties fixed array, populating it if necessary.
1417 Handle<FixedArray> GetOrBuildConstantProperties(Isolate* isolate) {
1418 if (constant_properties_.is_null()) {
1419 BuildConstantProperties(isolate);
1420 }
1421 return constant_properties();
1422 }
1423
1406 // Populate the constant properties fixed array. 1424 // Populate the constant properties fixed array.
1407 void BuildConstantProperties(Isolate* isolate); 1425 void BuildConstantProperties(Isolate* isolate);
1408 1426
1409 // Mark all computed expressions that are bound to a key that 1427 // Mark all computed expressions that are bound to a key that
1410 // is shadowed by a later occurrence of the same key. For the 1428 // is shadowed by a later occurrence of the same key. For the
1411 // marked expressions, no store code is emitted. 1429 // marked expressions, no store code is emitted.
1412 void CalculateEmitStore(Zone* zone); 1430 void CalculateEmitStore(Zone* zone);
1413 1431
1414 // Determines whether the {FastCloneShallowObject} builtin can be used. 1432 // Determines whether the {FastCloneShallowObject} builtin can be used.
1415 bool IsFastCloningSupported() const; 1433 bool IsFastCloningSupported() const;
(...skipping 28 matching lines...) Expand all
1444 1462
1445 // Return an AST id for a property that is used in simulate instructions. 1463 // Return an AST id for a property that is used in simulate instructions.
1446 BailoutId GetIdForPropertySet(int i) { return BailoutId(local_id(i + 1)); } 1464 BailoutId GetIdForPropertySet(int i) { return BailoutId(local_id(i + 1)); }
1447 1465
1448 // Unlike other AST nodes, this number of bailout IDs allocated for an 1466 // Unlike other AST nodes, this number of bailout IDs allocated for an
1449 // ObjectLiteral can vary, so num_ids() is not a static method. 1467 // ObjectLiteral can vary, so num_ids() is not a static method.
1450 int num_ids() const { return parent_num_ids() + 1 + properties()->length(); } 1468 int num_ids() const { return parent_num_ids() + 1 + properties()->length(); }
1451 1469
1452 // Object literals need one feedback slot for each non-trivial value, as well 1470 // Object literals need one feedback slot for each non-trivial value, as well
1453 // as some slots for home objects. 1471 // as some slots for home objects.
1454 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1472 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
1455 FeedbackVectorSlotCache* cache); 1473 FeedbackVectorSlotCache* cache);
1456 1474
1457 private: 1475 private:
1458 friend class AstNodeFactory; 1476 friend class AstNodeFactory;
1459 1477
1460 ObjectLiteral(ZoneList<Property*>* properties, int literal_index, 1478 ObjectLiteral(ZoneList<Property*>* properties, int literal_index,
1461 uint32_t boilerplate_properties, int pos) 1479 uint32_t boilerplate_properties, int pos)
1462 : MaterializedLiteral(literal_index, pos, kObjectLiteral), 1480 : MaterializedLiteral(literal_index, pos, kObjectLiteral),
1463 boilerplate_properties_(boilerplate_properties), 1481 boilerplate_properties_(boilerplate_properties),
1464 properties_(properties) { 1482 properties_(properties) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1543 1561
1544 BailoutId CreateLiteralId() const { return BailoutId(local_id(0)); } 1562 BailoutId CreateLiteralId() const { return BailoutId(local_id(0)); }
1545 1563
1546 // Return an AST id for an element that is used in simulate instructions. 1564 // Return an AST id for an element that is used in simulate instructions.
1547 BailoutId GetIdForElement(int i) { return BailoutId(local_id(i + 1)); } 1565 BailoutId GetIdForElement(int i) { return BailoutId(local_id(i + 1)); }
1548 1566
1549 // Unlike other AST nodes, this number of bailout IDs allocated for an 1567 // Unlike other AST nodes, this number of bailout IDs allocated for an
1550 // ArrayLiteral can vary, so num_ids() is not a static method. 1568 // ArrayLiteral can vary, so num_ids() is not a static method.
1551 int num_ids() const { return parent_num_ids() + 1 + values()->length(); } 1569 int num_ids() const { return parent_num_ids() + 1 + values()->length(); }
1552 1570
1571 // Populate the depth field and flags.
1572 void InitDepthAndFlags();
1573
1574 // Get the constant elements fixed array, populating it if necessary.
1575 Handle<ConstantElementsPair> GetOrBuildConstantElements(Isolate* isolate) {
1576 if (constant_elements_.is_null()) {
1577 BuildConstantElements(isolate);
1578 }
1579 return constant_elements();
1580 }
1581
1553 // Populate the constant elements fixed array. 1582 // Populate the constant elements fixed array.
1554 void BuildConstantElements(Isolate* isolate); 1583 void BuildConstantElements(Isolate* isolate);
1555 1584
1556 // Determines whether the {FastCloneShallowArray} builtin can be used. 1585 // Determines whether the {FastCloneShallowArray} builtin can be used.
1557 bool IsFastCloningSupported() const; 1586 bool IsFastCloningSupported() const;
1558 1587
1559 // Assemble bitfield of flags for the CreateArrayLiteral helper. 1588 // Assemble bitfield of flags for the CreateArrayLiteral helper.
1560 int ComputeFlags(bool disable_mementos = false) const { 1589 int ComputeFlags(bool disable_mementos = false) const {
1561 int flags = depth() == 1 ? kShallowElements : kNoFlags; 1590 int flags = depth() == 1 ? kShallowElements : kNoFlags;
1562 if (disable_mementos) { 1591 if (disable_mementos) {
(...skipping 14 matching lines...) Expand all
1577 values_->Rewind(first_spread_index_); 1606 values_->Rewind(first_spread_index_);
1578 first_spread_index_ = -1; 1607 first_spread_index_ = -1;
1579 } 1608 }
1580 1609
1581 enum Flags { 1610 enum Flags {
1582 kNoFlags = 0, 1611 kNoFlags = 0,
1583 kShallowElements = 1, 1612 kShallowElements = 1,
1584 kDisableMementos = 1 << 1 1613 kDisableMementos = 1 << 1
1585 }; 1614 };
1586 1615
1587 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1616 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
1588 FeedbackVectorSlotCache* cache); 1617 FeedbackVectorSlotCache* cache);
1589 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; } 1618 FeedbackVectorSlot LiteralFeedbackSlot() const { return literal_slot_; }
1590 1619
1591 private: 1620 private:
1592 friend class AstNodeFactory; 1621 friend class AstNodeFactory;
1593 1622
1594 ArrayLiteral(ZoneList<Expression*>* values, int first_spread_index, 1623 ArrayLiteral(ZoneList<Expression*>* values, int first_spread_index,
1595 int literal_index, int pos) 1624 int literal_index, int pos)
1596 : MaterializedLiteral(literal_index, pos, kArrayLiteral), 1625 : MaterializedLiteral(literal_index, pos, kArrayLiteral),
1597 first_spread_index_(first_spread_index), 1626 first_spread_index_(first_spread_index),
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1656 HoleCheckModeField::update(bit_field_, HoleCheckMode::kRequired); 1685 HoleCheckModeField::update(bit_field_, HoleCheckMode::kRequired);
1657 } 1686 }
1658 1687
1659 // Bind this proxy to the variable var. 1688 // Bind this proxy to the variable var.
1660 void BindTo(Variable* var); 1689 void BindTo(Variable* var);
1661 1690
1662 bool UsesVariableFeedbackSlot() const { 1691 bool UsesVariableFeedbackSlot() const {
1663 return var()->IsUnallocated() || var()->IsLookupSlot(); 1692 return var()->IsUnallocated() || var()->IsLookupSlot();
1664 } 1693 }
1665 1694
1666 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1695 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
1667 FeedbackVectorSlotCache* cache); 1696 FeedbackVectorSlotCache* cache);
1668 1697
1669 FeedbackVectorSlot VariableFeedbackSlot() { return variable_feedback_slot_; } 1698 FeedbackVectorSlot VariableFeedbackSlot() { return variable_feedback_slot_; }
1670 1699
1671 static int num_ids() { return parent_num_ids() + 1; } 1700 static int num_ids() { return parent_num_ids() + 1; }
1672 BailoutId BeforeId() const { return BailoutId(local_id(0)); } 1701 BailoutId BeforeId() const { return BailoutId(local_id(0)); }
1673 void set_next_unresolved(VariableProxy* next) { next_unresolved_ = next; } 1702 void set_next_unresolved(VariableProxy* next) { next_unresolved_ = next; }
1674 VariableProxy* next_unresolved() { return next_unresolved_; } 1703 VariableProxy* next_unresolved() { return next_unresolved_; }
1675 1704
1676 private: 1705 private:
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1752 void set_inline_cache_state(InlineCacheState state) { 1781 void set_inline_cache_state(InlineCacheState state) {
1753 bit_field_ = InlineCacheStateField::update(bit_field_, state); 1782 bit_field_ = InlineCacheStateField::update(bit_field_, state);
1754 } 1783 }
1755 void mark_for_call() { 1784 void mark_for_call() {
1756 bit_field_ = IsForCallField::update(bit_field_, true); 1785 bit_field_ = IsForCallField::update(bit_field_, true);
1757 } 1786 }
1758 bool is_for_call() const { return IsForCallField::decode(bit_field_); } 1787 bool is_for_call() const { return IsForCallField::decode(bit_field_); }
1759 1788
1760 bool IsSuperAccess() { return obj()->IsSuperPropertyReference(); } 1789 bool IsSuperAccess() { return obj()->IsSuperPropertyReference(); }
1761 1790
1762 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1791 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
1763 FeedbackVectorSlotCache* cache) { 1792 FeedbackVectorSlotCache* cache) {
1764 FeedbackVectorSlotKind kind = key()->IsPropertyName() 1793 FeedbackVectorSlotKind kind = key()->IsPropertyName()
1765 ? FeedbackVectorSlotKind::LOAD_IC 1794 ? FeedbackVectorSlotKind::LOAD_IC
1766 : FeedbackVectorSlotKind::KEYED_LOAD_IC; 1795 : FeedbackVectorSlotKind::KEYED_LOAD_IC;
1767 property_feedback_slot_ = spec->AddSlot(kind); 1796 property_feedback_slot_ = spec->AddSlot(kind);
1768 } 1797 }
1769 1798
1770 FeedbackVectorSlot PropertyFeedbackSlot() const { 1799 FeedbackVectorSlot PropertyFeedbackSlot() const {
1771 return property_feedback_slot_; 1800 return property_feedback_slot_;
1772 } 1801 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1810 1839
1811 1840
1812 class Call final : public Expression { 1841 class Call final : public Expression {
1813 public: 1842 public:
1814 Expression* expression() const { return expression_; } 1843 Expression* expression() const { return expression_; }
1815 ZoneList<Expression*>* arguments() const { return arguments_; } 1844 ZoneList<Expression*>* arguments() const { return arguments_; }
1816 1845
1817 void set_expression(Expression* e) { expression_ = e; } 1846 void set_expression(Expression* e) { expression_ = e; }
1818 1847
1819 // Type feedback information. 1848 // Type feedback information.
1820 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1849 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
1821 FeedbackVectorSlotCache* cache); 1850 FeedbackVectorSlotCache* cache);
1822 1851
1823 FeedbackVectorSlot CallFeedbackICSlot() const { return ic_slot_; } 1852 FeedbackVectorSlot CallFeedbackICSlot() const { return ic_slot_; }
1824 1853
1825 SmallMapList* GetReceiverTypes() { 1854 SmallMapList* GetReceiverTypes() {
1826 if (expression()->IsProperty()) { 1855 if (expression()->IsProperty()) {
1827 return expression()->AsProperty()->GetReceiverTypes(); 1856 return expression()->AsProperty()->GetReceiverTypes();
1828 } 1857 }
1829 return nullptr; 1858 return nullptr;
1830 } 1859 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1928 1957
1929 1958
1930 class CallNew final : public Expression { 1959 class CallNew final : public Expression {
1931 public: 1960 public:
1932 Expression* expression() const { return expression_; } 1961 Expression* expression() const { return expression_; }
1933 ZoneList<Expression*>* arguments() const { return arguments_; } 1962 ZoneList<Expression*>* arguments() const { return arguments_; }
1934 1963
1935 void set_expression(Expression* e) { expression_ = e; } 1964 void set_expression(Expression* e) { expression_ = e; }
1936 1965
1937 // Type feedback information. 1966 // Type feedback information.
1938 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 1967 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
1939 FeedbackVectorSlotCache* cache) { 1968 FeedbackVectorSlotCache* cache) {
1940 // CallNew stores feedback in the exact same way as Call. We can 1969 // CallNew stores feedback in the exact same way as Call. We can
1941 // piggyback on the type feedback infrastructure for calls. 1970 // piggyback on the type feedback infrastructure for calls.
1942 callnew_feedback_slot_ = spec->AddCallICSlot(); 1971 callnew_feedback_slot_ = spec->AddCallICSlot();
1943 } 1972 }
1944 1973
1945 FeedbackVectorSlot CallNewFeedbackSlot() { 1974 FeedbackVectorSlot CallNewFeedbackSlot() {
1946 DCHECK(!callnew_feedback_slot_.IsInvalid()); 1975 DCHECK(!callnew_feedback_slot_.IsInvalid());
1947 return callnew_feedback_slot_; 1976 return callnew_feedback_slot_;
1948 } 1977 }
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
2102 } 2131 }
2103 2132
2104 // The short-circuit logical operations need an AST ID for their 2133 // The short-circuit logical operations need an AST ID for their
2105 // right-hand subexpression. 2134 // right-hand subexpression.
2106 static int num_ids() { return parent_num_ids() + 2; } 2135 static int num_ids() { return parent_num_ids() + 2; }
2107 BailoutId RightId() const { return BailoutId(local_id(0)); } 2136 BailoutId RightId() const { return BailoutId(local_id(0)); }
2108 2137
2109 // BinaryOperation will have both a slot in the feedback vector and the 2138 // BinaryOperation will have both a slot in the feedback vector and the
2110 // TypeFeedbackId to record the type information. TypeFeedbackId is used 2139 // TypeFeedbackId to record the type information. TypeFeedbackId is used
2111 // by full codegen and the feedback vector slot is used by interpreter. 2140 // by full codegen and the feedback vector slot is used by interpreter.
2112 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2141 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
2113 FeedbackVectorSlotCache* cache); 2142 FeedbackVectorSlotCache* cache);
2114 2143
2115 FeedbackVectorSlot BinaryOperationFeedbackSlot() const { 2144 FeedbackVectorSlot BinaryOperationFeedbackSlot() const {
2116 return type_feedback_slot_; 2145 return type_feedback_slot_;
2117 } 2146 }
2118 2147
2119 TypeFeedbackId BinaryOperationFeedbackId() const { 2148 TypeFeedbackId BinaryOperationFeedbackId() const {
2120 return TypeFeedbackId(local_id(1)); 2149 return TypeFeedbackId(local_id(1));
2121 } 2150 }
2122 Maybe<int> fixed_right_arg() const { 2151 Maybe<int> fixed_right_arg() const {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2195 } 2224 }
2196 TypeFeedbackId CountStoreFeedbackId() const { 2225 TypeFeedbackId CountStoreFeedbackId() const {
2197 return TypeFeedbackId(local_id(3)); 2226 return TypeFeedbackId(local_id(3));
2198 } 2227 }
2199 2228
2200 // Feedback slot for binary operation is only used by ignition. 2229 // Feedback slot for binary operation is only used by ignition.
2201 FeedbackVectorSlot CountBinaryOpFeedbackSlot() const { 2230 FeedbackVectorSlot CountBinaryOpFeedbackSlot() const {
2202 return binary_operation_slot_; 2231 return binary_operation_slot_;
2203 } 2232 }
2204 2233
2205 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2234 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
2206 FeedbackVectorSlotCache* cache); 2235 FeedbackVectorSlotCache* cache);
2207 FeedbackVectorSlot CountSlot() const { return slot_; } 2236 FeedbackVectorSlot CountSlot() const { return slot_; }
2208 2237
2209 private: 2238 private:
2210 friend class AstNodeFactory; 2239 friend class AstNodeFactory;
2211 2240
2212 CountOperation(Token::Value op, bool is_prefix, Expression* expr, int pos) 2241 CountOperation(Token::Value op, bool is_prefix, Expression* expr, int pos)
2213 : Expression(pos, kCountOperation), type_(NULL), expression_(expr) { 2242 : Expression(pos, kCountOperation), type_(NULL), expression_(expr) {
2214 bit_field_ |= 2243 bit_field_ |=
2215 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | 2244 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2247 static int num_ids() { return parent_num_ids() + 1; } 2276 static int num_ids() { return parent_num_ids() + 1; }
2248 TypeFeedbackId CompareOperationFeedbackId() const { 2277 TypeFeedbackId CompareOperationFeedbackId() const {
2249 return TypeFeedbackId(local_id(0)); 2278 return TypeFeedbackId(local_id(0));
2250 } 2279 }
2251 AstType* combined_type() const { return combined_type_; } 2280 AstType* combined_type() const { return combined_type_; }
2252 void set_combined_type(AstType* type) { combined_type_ = type; } 2281 void set_combined_type(AstType* type) { combined_type_ = type; }
2253 2282
2254 // CompareOperation will have both a slot in the feedback vector and the 2283 // CompareOperation will have both a slot in the feedback vector and the
2255 // TypeFeedbackId to record the type information. TypeFeedbackId is used 2284 // TypeFeedbackId to record the type information. TypeFeedbackId is used
2256 // by full codegen and the feedback vector slot is used by interpreter. 2285 // by full codegen and the feedback vector slot is used by interpreter.
2257 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2286 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
2258 FeedbackVectorSlotCache* cache); 2287 FeedbackVectorSlotCache* cache);
2259 2288
2260 FeedbackVectorSlot CompareOperationFeedbackSlot() const { 2289 FeedbackVectorSlot CompareOperationFeedbackSlot() const {
2261 return type_feedback_slot_; 2290 return type_feedback_slot_;
2262 } 2291 }
2263 2292
2264 // Match special cases. 2293 // Match special cases.
2265 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); 2294 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check);
2266 bool IsLiteralCompareUndefined(Expression** expr); 2295 bool IsLiteralCompareUndefined(Expression** expr);
2267 bool IsLiteralCompareNull(Expression** expr); 2296 bool IsLiteralCompareNull(Expression** expr);
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
2393 void set_is_uninitialized(bool b) { 2422 void set_is_uninitialized(bool b) {
2394 bit_field_ = IsUninitializedField::update(bit_field_, b); 2423 bit_field_ = IsUninitializedField::update(bit_field_, b);
2395 } 2424 }
2396 void set_key_type(IcCheckType key_type) { 2425 void set_key_type(IcCheckType key_type) {
2397 bit_field_ = KeyTypeField::update(bit_field_, key_type); 2426 bit_field_ = KeyTypeField::update(bit_field_, key_type);
2398 } 2427 }
2399 void set_store_mode(KeyedAccessStoreMode mode) { 2428 void set_store_mode(KeyedAccessStoreMode mode) {
2400 bit_field_ = StoreModeField::update(bit_field_, mode); 2429 bit_field_ = StoreModeField::update(bit_field_, mode);
2401 } 2430 }
2402 2431
2403 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2432 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
2404 FeedbackVectorSlotCache* cache); 2433 FeedbackVectorSlotCache* cache);
2405 FeedbackVectorSlot AssignmentSlot() const { return slot_; } 2434 FeedbackVectorSlot AssignmentSlot() const { return slot_; }
2406 2435
2407 private: 2436 private:
2408 friend class AstNodeFactory; 2437 friend class AstNodeFactory;
2409 2438
2410 Assignment(Token::Value op, Expression* target, Expression* value, int pos); 2439 Assignment(Token::Value op, Expression* target, Expression* value, int pos);
2411 2440
2412 static int parent_num_ids() { return Expression::num_ids(); } 2441 static int parent_num_ids() { return Expression::num_ids(); }
2413 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2442 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
2560 int SourceSize() const { return end_position() - start_position(); } 2589 int SourceSize() const { return end_position() - start_position(); }
2561 bool is_declaration() const { return function_type() == kDeclaration; } 2590 bool is_declaration() const { return function_type() == kDeclaration; }
2562 bool is_named_expression() const { 2591 bool is_named_expression() const {
2563 return function_type() == kNamedExpression; 2592 return function_type() == kNamedExpression;
2564 } 2593 }
2565 bool is_anonymous_expression() const { 2594 bool is_anonymous_expression() const {
2566 return function_type() == kAnonymousExpression; 2595 return function_type() == kAnonymousExpression;
2567 } 2596 }
2568 LanguageMode language_mode() const; 2597 LanguageMode language_mode() const;
2569 2598
2570 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2599 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
2571 FeedbackVectorSlotCache* cache) { 2600 FeedbackVectorSlotCache* cache) {
2572 // The + 1 is because we need an array with room for the literals 2601 // The + 1 is because we need an array with room for the literals
2573 // as well as the feedback vector. 2602 // as well as the feedback vector.
2574 literal_feedback_slot_ = 2603 literal_feedback_slot_ =
2575 spec->AddCreateClosureSlot(materialized_literal_count_ + 1); 2604 spec->AddCreateClosureSlot(materialized_literal_count_ + 1);
2576 } 2605 }
2577 2606
2578 FeedbackVectorSlot LiteralFeedbackSlot() const { 2607 FeedbackVectorSlot LiteralFeedbackSlot() const {
2579 return literal_feedback_slot_; 2608 return literal_feedback_slot_;
2580 } 2609 }
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
2779 int end_position() const { return end_position_; } 2808 int end_position() const { return end_position_; }
2780 bool has_name_static_property() const { 2809 bool has_name_static_property() const {
2781 return HasNameStaticProperty::decode(bit_field_); 2810 return HasNameStaticProperty::decode(bit_field_);
2782 } 2811 }
2783 bool has_static_computed_names() const { 2812 bool has_static_computed_names() const {
2784 return HasStaticComputedNames::decode(bit_field_); 2813 return HasStaticComputedNames::decode(bit_field_);
2785 } 2814 }
2786 2815
2787 // Object literals need one feedback slot for each non-trivial value, as well 2816 // Object literals need one feedback slot for each non-trivial value, as well
2788 // as some slots for home objects. 2817 // as some slots for home objects.
2789 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2818 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
2790 FeedbackVectorSlotCache* cache); 2819 FeedbackVectorSlotCache* cache);
2791 2820
2792 bool NeedsProxySlot() const { 2821 bool NeedsProxySlot() const {
2793 return class_variable_proxy() != nullptr && 2822 return class_variable_proxy() != nullptr &&
2794 class_variable_proxy()->var()->IsUnallocated(); 2823 class_variable_proxy()->var()->IsUnallocated();
2795 } 2824 }
2796 2825
2797 FeedbackVectorSlot HomeObjectSlot() const { return home_object_slot_; } 2826 FeedbackVectorSlot HomeObjectSlot() const { return home_object_slot_; }
2798 FeedbackVectorSlot ProxySlot() const { return proxy_slot_; } 2827 FeedbackVectorSlot ProxySlot() const { return proxy_slot_; }
2799 2828
(...skipping 30 matching lines...) Expand all
2830 2859
2831 2860
2832 class NativeFunctionLiteral final : public Expression { 2861 class NativeFunctionLiteral final : public Expression {
2833 public: 2862 public:
2834 Handle<String> name() const { return name_->string(); } 2863 Handle<String> name() const { return name_->string(); }
2835 v8::Extension* extension() const { return extension_; } 2864 v8::Extension* extension() const { return extension_; }
2836 FeedbackVectorSlot LiteralFeedbackSlot() const { 2865 FeedbackVectorSlot LiteralFeedbackSlot() const {
2837 return literal_feedback_slot_; 2866 return literal_feedback_slot_;
2838 } 2867 }
2839 2868
2840 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2869 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
2841 FeedbackVectorSlotCache* cache) { 2870 FeedbackVectorSlotCache* cache) {
2842 // 0 is a magic number here. It means we are holding the literals 2871 // 0 is a magic number here. It means we are holding the literals
2843 // array for a native function literal, which needs to be 2872 // array for a native function literal, which needs to be
2844 // the empty literals array. 2873 // the empty literals array.
2845 // TODO(mvstanton): The FeedbackVectorSlotCache can be adapted 2874 // TODO(mvstanton): The FeedbackVectorSlotCache can be adapted
2846 // to always return the same slot for this case. 2875 // to always return the same slot for this case.
2847 literal_feedback_slot_ = spec->AddCreateClosureSlot(0); 2876 literal_feedback_slot_ = spec->AddCreateClosureSlot(0);
2848 } 2877 }
2849 2878
2850 private: 2879 private:
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
2935 // (defined at https://tc39.github.io/ecma262/#sec-getiterator). Ignition 2964 // (defined at https://tc39.github.io/ecma262/#sec-getiterator). Ignition
2936 // desugars this into a LoadIC / JSLoadNamed, CallIC, and a type-check to 2965 // desugars this into a LoadIC / JSLoadNamed, CallIC, and a type-check to
2937 // validate return value of the Symbol.iterator() call. 2966 // validate return value of the Symbol.iterator() call.
2938 class GetIterator final : public Expression { 2967 class GetIterator final : public Expression {
2939 public: 2968 public:
2940 Expression* iterable() const { return iterable_; } 2969 Expression* iterable() const { return iterable_; }
2941 void set_iterable(Expression* iterable) { iterable_ = iterable; } 2970 void set_iterable(Expression* iterable) { iterable_ = iterable; }
2942 2971
2943 static int num_ids() { return parent_num_ids(); } 2972 static int num_ids() { return parent_num_ids(); }
2944 2973
2945 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2974 void AssignFeedbackVectorSlots(FeedbackVectorSpec* spec,
2946 FeedbackVectorSlotCache* cache) { 2975 FeedbackVectorSlotCache* cache) {
2947 iterator_property_feedback_slot_ = 2976 iterator_property_feedback_slot_ =
2948 spec->AddSlot(FeedbackVectorSlotKind::LOAD_IC); 2977 spec->AddSlot(FeedbackVectorSlotKind::LOAD_IC);
2949 iterator_call_feedback_slot_ = 2978 iterator_call_feedback_slot_ =
2950 spec->AddSlot(FeedbackVectorSlotKind::CALL_IC); 2979 spec->AddSlot(FeedbackVectorSlotKind::CALL_IC);
2951 } 2980 }
2952 2981
2953 FeedbackVectorSlot IteratorPropertyFeedbackSlot() const { 2982 FeedbackVectorSlot IteratorPropertyFeedbackSlot() const {
2954 return iterator_property_feedback_slot_; 2983 return iterator_property_feedback_slot_;
2955 } 2984 }
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after
3617 : NULL; \ 3646 : NULL; \
3618 } 3647 }
3619 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 3648 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
3620 #undef DECLARE_NODE_FUNCTIONS 3649 #undef DECLARE_NODE_FUNCTIONS
3621 3650
3622 3651
3623 } // namespace internal 3652 } // namespace internal
3624 } // namespace v8 3653 } // namespace v8
3625 3654
3626 #endif // V8_AST_AST_H_ 3655 #endif // V8_AST_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast/ast.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698