OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_AST_AST_H_ | 5 #ifndef V8_AST_AST_H_ |
6 #define V8_AST_AST_H_ | 6 #define V8_AST_AST_H_ |
7 | 7 |
8 #include "src/ast/ast-value-factory.h" | 8 #include "src/ast/ast-value-factory.h" |
9 #include "src/ast/modules.h" | 9 #include "src/ast/modules.h" |
10 #include "src/ast/variables.h" | 10 #include "src/ast/variables.h" |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 | 213 |
214 protected: | 214 protected: |
215 AstNode(int position, NodeType type) | 215 AstNode(int position, NodeType type) |
216 : position_(position), node_type_(type) {} | 216 : position_(position), node_type_(type) {} |
217 | 217 |
218 private: | 218 private: |
219 // Hidden to prevent accidental usage. It would have to load the | 219 // Hidden to prevent accidental usage. It would have to load the |
220 // current zone from the TLS. | 220 // current zone from the TLS. |
221 void* operator new(size_t size); | 221 void* operator new(size_t size); |
222 | 222 |
223 friend class CaseClause; // Generates AST IDs. | |
224 | |
225 int position_; | 223 int position_; |
226 NodeType node_type_; | 224 NodeType node_type_; |
227 // Ends with NodeType which is uint8_t sized. Deriving classes in turn begin | 225 // Ends with NodeType which is uint8_t sized. Deriving classes in turn begin |
228 // sub-int32_t-sized fields for optimum packing efficiency. | 226 // sub-int32_t-sized fields for optimum packing efficiency. |
229 }; | 227 }; |
230 | 228 |
231 | 229 |
232 class Statement : public AstNode { | 230 class Statement : public AstNode { |
233 public: | 231 public: |
234 bool IsEmpty() { return AsEmptyStatement() != NULL; } | 232 bool IsEmpty() { return AsEmptyStatement() != NULL; } |
(...skipping 1338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1573 ZoneList<Expression*>* values_; | 1571 ZoneList<Expression*>* values_; |
1574 }; | 1572 }; |
1575 | 1573 |
1576 | 1574 |
1577 class VariableProxy final : public Expression { | 1575 class VariableProxy final : public Expression { |
1578 public: | 1576 public: |
1579 bool IsValidReferenceExpression() const { | 1577 bool IsValidReferenceExpression() const { |
1580 return !is_this() && !is_new_target(); | 1578 return !is_this() && !is_new_target(); |
1581 } | 1579 } |
1582 | 1580 |
1583 bool IsArguments() const { return is_resolved() && var()->is_arguments(); } | |
1584 | |
1585 Handle<String> name() const { return raw_name()->string(); } | 1581 Handle<String> name() const { return raw_name()->string(); } |
1586 const AstRawString* raw_name() const { | 1582 const AstRawString* raw_name() const { |
1587 return is_resolved() ? var_->raw_name() : raw_name_; | 1583 return is_resolved() ? var_->raw_name() : raw_name_; |
1588 } | 1584 } |
1589 | 1585 |
1590 Variable* var() const { | 1586 Variable* var() const { |
1591 DCHECK(is_resolved()); | 1587 DCHECK(is_resolved()); |
1592 return var_; | 1588 return var_; |
1593 } | 1589 } |
1594 void set_var(Variable* v) { | 1590 void set_var(Variable* v) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1644 VariableProxy(Zone* zone, const VariableProxy* copy_from); | 1640 VariableProxy(Zone* zone, const VariableProxy* copy_from); |
1645 | 1641 |
1646 static int parent_num_ids() { return Expression::num_ids(); } | 1642 static int parent_num_ids() { return Expression::num_ids(); } |
1647 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1643 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
1648 | 1644 |
1649 class IsThisField : public BitField8<bool, 0, 1> {}; | 1645 class IsThisField : public BitField8<bool, 0, 1> {}; |
1650 class IsAssignedField : public BitField8<bool, 1, 1> {}; | 1646 class IsAssignedField : public BitField8<bool, 1, 1> {}; |
1651 class IsResolvedField : public BitField8<bool, 2, 1> {}; | 1647 class IsResolvedField : public BitField8<bool, 2, 1> {}; |
1652 class IsNewTargetField : public BitField8<bool, 3, 1> {}; | 1648 class IsNewTargetField : public BitField8<bool, 3, 1> {}; |
1653 | 1649 |
1654 // Start with 16-bit (or smaller) field, which should get packed together | |
1655 // with Expression's trailing 16-bit field. | |
1656 uint8_t bit_field_; | 1650 uint8_t bit_field_; |
1657 // Position is stored in the AstNode superclass, but VariableProxy needs to | 1651 // Position is stored in the AstNode superclass, but VariableProxy needs to |
1658 // know its end position too (for error messages). It cannot be inferred from | 1652 // know its end position too (for error messages). It cannot be inferred from |
1659 // the variable name length because it can contain escapes. | 1653 // the variable name length because it can contain escapes. |
1660 int end_position_; | 1654 int end_position_; |
1661 FeedbackVectorSlot variable_feedback_slot_; | 1655 FeedbackVectorSlot variable_feedback_slot_; |
1662 union { | 1656 union { |
1663 const AstRawString* raw_name_; // if !is_resolved_ | 1657 const AstRawString* raw_name_; // if !is_resolved_ |
1664 Variable* var_; // if is_resolved_ | 1658 Variable* var_; // if is_resolved_ |
1665 }; | 1659 }; |
(...skipping 1812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3478 : NULL; \ | 3472 : NULL; \ |
3479 } | 3473 } |
3480 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3474 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
3481 #undef DECLARE_NODE_FUNCTIONS | 3475 #undef DECLARE_NODE_FUNCTIONS |
3482 | 3476 |
3483 | 3477 |
3484 } // namespace internal | 3478 } // namespace internal |
3485 } // namespace v8 | 3479 } // namespace v8 |
3486 | 3480 |
3487 #endif // V8_AST_AST_H_ | 3481 #endif // V8_AST_AST_H_ |
OLD | NEW |