| 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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 V(WhileStatement) \ | 57 V(WhileStatement) \ |
| 58 V(ForStatement) \ | 58 V(ForStatement) \ |
| 59 V(ForInStatement) \ | 59 V(ForInStatement) \ |
| 60 V(ForOfStatement) \ | 60 V(ForOfStatement) \ |
| 61 V(TryCatchStatement) \ | 61 V(TryCatchStatement) \ |
| 62 V(TryFinallyStatement) \ | 62 V(TryFinallyStatement) \ |
| 63 V(DebuggerStatement) | 63 V(DebuggerStatement) |
| 64 | 64 |
| 65 #define EXPRESSION_NODE_LIST(V) \ | 65 #define EXPRESSION_NODE_LIST(V) \ |
| 66 V(FunctionLiteral) \ | 66 V(FunctionLiteral) \ |
| 67 V(ClassLiteral) \ | |
| 68 V(NativeFunctionLiteral) \ | 67 V(NativeFunctionLiteral) \ |
| 69 V(Conditional) \ | 68 V(Conditional) \ |
| 70 V(VariableProxy) \ | 69 V(VariableProxy) \ |
| 71 V(Literal) \ | 70 V(Literal) \ |
| 72 V(RegExpLiteral) \ | 71 V(RegExpLiteral) \ |
| 73 V(ObjectLiteral) \ | 72 V(ObjectLiteral) \ |
| 74 V(ArrayLiteral) \ | 73 V(ArrayLiteral) \ |
| 75 V(Assignment) \ | 74 V(Assignment) \ |
| 76 V(Yield) \ | 75 V(Yield) \ |
| 77 V(Throw) \ | 76 V(Throw) \ |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 | 473 |
| 475 | 474 |
| 476 class DoExpression final : public Expression { | 475 class DoExpression final : public Expression { |
| 477 public: | 476 public: |
| 478 DECLARE_NODE_TYPE(DoExpression) | 477 DECLARE_NODE_TYPE(DoExpression) |
| 479 | 478 |
| 480 Block* block() { return block_; } | 479 Block* block() { return block_; } |
| 481 void set_block(Block* b) { block_ = b; } | 480 void set_block(Block* b) { block_ = b; } |
| 482 VariableProxy* result() { return result_; } | 481 VariableProxy* result() { return result_; } |
| 483 void set_result(VariableProxy* v) { result_ = v; } | 482 void set_result(VariableProxy* v) { result_ = v; } |
| 483 FunctionLiteral* represented_function() { return represented_function_; } |
| 484 void set_represented_function(FunctionLiteral* f) { |
| 485 represented_function_ = f; |
| 486 } |
| 487 |
| 488 bool IsAnonymousFunctionDefinition() const final; |
| 484 | 489 |
| 485 protected: | 490 protected: |
| 486 DoExpression(Zone* zone, Block* block, VariableProxy* result, int pos) | 491 DoExpression(Zone* zone, Block* block, VariableProxy* result, int pos) |
| 487 : Expression(zone, pos), block_(block), result_(result) { | 492 : Expression(zone, pos), |
| 493 block_(block), |
| 494 result_(result), |
| 495 represented_function_(nullptr) { |
| 488 DCHECK_NOT_NULL(block_); | 496 DCHECK_NOT_NULL(block_); |
| 489 DCHECK_NOT_NULL(result_); | 497 DCHECK_NOT_NULL(result_); |
| 490 } | 498 } |
| 491 static int parent_num_ids() { return Expression::num_ids(); } | 499 static int parent_num_ids() { return Expression::num_ids(); } |
| 492 | 500 |
| 493 private: | 501 private: |
| 494 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 502 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 495 | 503 |
| 496 Block* block_; | 504 Block* block_; |
| 497 VariableProxy* result_; | 505 VariableProxy* result_; |
| 506 FunctionLiteral* represented_function_; |
| 498 }; | 507 }; |
| 499 | 508 |
| 500 | 509 |
| 501 class Declaration : public AstNode { | 510 class Declaration : public AstNode { |
| 502 public: | 511 public: |
| 503 VariableProxy* proxy() const { return proxy_; } | 512 VariableProxy* proxy() const { return proxy_; } |
| 504 VariableMode mode() const { return mode_; } | 513 VariableMode mode() const { return mode_; } |
| 505 Scope* scope() const { return scope_; } | 514 Scope* scope() const { return scope_; } |
| 506 virtual InitializationFlag initialization() const = 0; | 515 virtual InitializationFlag initialization() const = 0; |
| 507 | 516 |
| (...skipping 2241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2749 BailoutReason dont_optimize_reason_; | 2758 BailoutReason dont_optimize_reason_; |
| 2750 | 2759 |
| 2751 int materialized_literal_count_; | 2760 int materialized_literal_count_; |
| 2752 int expected_property_count_; | 2761 int expected_property_count_; |
| 2753 int parameter_count_; | 2762 int parameter_count_; |
| 2754 int function_token_position_; | 2763 int function_token_position_; |
| 2755 int yield_count_; | 2764 int yield_count_; |
| 2756 }; | 2765 }; |
| 2757 | 2766 |
| 2758 | 2767 |
| 2759 class ClassLiteral final : public Expression { | |
| 2760 public: | |
| 2761 typedef ObjectLiteralProperty Property; | |
| 2762 | |
| 2763 DECLARE_NODE_TYPE(ClassLiteral) | |
| 2764 | |
| 2765 Scope* scope() const { return scope_; } | |
| 2766 VariableProxy* class_variable_proxy() const { return class_variable_proxy_; } | |
| 2767 Expression* extends() const { return extends_; } | |
| 2768 void set_extends(Expression* e) { extends_ = e; } | |
| 2769 FunctionLiteral* constructor() const { return constructor_; } | |
| 2770 void set_constructor(FunctionLiteral* f) { constructor_ = f; } | |
| 2771 ZoneList<Property*>* properties() const { return properties_; } | |
| 2772 int start_position() const { return position(); } | |
| 2773 int end_position() const { return end_position_; } | |
| 2774 | |
| 2775 BailoutId EntryId() const { return BailoutId(local_id(0)); } | |
| 2776 BailoutId DeclsId() const { return BailoutId(local_id(1)); } | |
| 2777 BailoutId ExitId() { return BailoutId(local_id(2)); } | |
| 2778 BailoutId CreateLiteralId() const { return BailoutId(local_id(3)); } | |
| 2779 BailoutId PrototypeId() { return BailoutId(local_id(4)); } | |
| 2780 | |
| 2781 // Return an AST id for a property that is used in simulate instructions. | |
| 2782 BailoutId GetIdForProperty(int i) { return BailoutId(local_id(i + 5)); } | |
| 2783 | |
| 2784 // Unlike other AST nodes, this number of bailout IDs allocated for an | |
| 2785 // ClassLiteral can vary, so num_ids() is not a static method. | |
| 2786 int num_ids() const { return parent_num_ids() + 5 + properties()->length(); } | |
| 2787 | |
| 2788 // Object literals need one feedback slot for each non-trivial value, as well | |
| 2789 // as some slots for home objects. | |
| 2790 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | |
| 2791 FeedbackVectorSlotCache* cache); | |
| 2792 | |
| 2793 bool NeedsProxySlot() const { | |
| 2794 return class_variable_proxy() != nullptr && | |
| 2795 class_variable_proxy()->var()->IsUnallocated(); | |
| 2796 } | |
| 2797 | |
| 2798 FeedbackVectorSlot PrototypeSlot() const { return prototype_slot_; } | |
| 2799 FeedbackVectorSlot ProxySlot() const { return proxy_slot_; } | |
| 2800 | |
| 2801 bool IsAnonymousFunctionDefinition() const final { | |
| 2802 return constructor()->raw_name()->length() == 0; | |
| 2803 } | |
| 2804 | |
| 2805 protected: | |
| 2806 ClassLiteral(Zone* zone, Scope* scope, VariableProxy* class_variable_proxy, | |
| 2807 Expression* extends, FunctionLiteral* constructor, | |
| 2808 ZoneList<Property*>* properties, int start_position, | |
| 2809 int end_position) | |
| 2810 : Expression(zone, start_position), | |
| 2811 scope_(scope), | |
| 2812 class_variable_proxy_(class_variable_proxy), | |
| 2813 extends_(extends), | |
| 2814 constructor_(constructor), | |
| 2815 properties_(properties), | |
| 2816 end_position_(end_position) {} | |
| 2817 | |
| 2818 static int parent_num_ids() { return Expression::num_ids(); } | |
| 2819 | |
| 2820 private: | |
| 2821 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | |
| 2822 | |
| 2823 Scope* scope_; | |
| 2824 VariableProxy* class_variable_proxy_; | |
| 2825 Expression* extends_; | |
| 2826 FunctionLiteral* constructor_; | |
| 2827 ZoneList<Property*>* properties_; | |
| 2828 int end_position_; | |
| 2829 FeedbackVectorSlot prototype_slot_; | |
| 2830 FeedbackVectorSlot proxy_slot_; | |
| 2831 }; | |
| 2832 | |
| 2833 | |
| 2834 class NativeFunctionLiteral final : public Expression { | 2768 class NativeFunctionLiteral final : public Expression { |
| 2835 public: | 2769 public: |
| 2836 DECLARE_NODE_TYPE(NativeFunctionLiteral) | 2770 DECLARE_NODE_TYPE(NativeFunctionLiteral) |
| 2837 | 2771 |
| 2838 Handle<String> name() const { return name_->string(); } | 2772 Handle<String> name() const { return name_->string(); } |
| 2839 v8::Extension* extension() const { return extension_; } | 2773 v8::Extension* extension() const { return extension_; } |
| 2840 | 2774 |
| 2841 protected: | 2775 protected: |
| 2842 NativeFunctionLiteral(Zone* zone, const AstRawString* name, | 2776 NativeFunctionLiteral(Zone* zone, const AstRawString* name, |
| 2843 v8::Extension* extension, int pos) | 2777 v8::Extension* extension, int pos) |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3446 int expected_property_count) { | 3380 int expected_property_count) { |
| 3447 return new (parser_zone_) FunctionLiteral( | 3381 return new (parser_zone_) FunctionLiteral( |
| 3448 parser_zone_, ast_value_factory_->empty_string(), ast_value_factory_, | 3382 parser_zone_, ast_value_factory_->empty_string(), ast_value_factory_, |
| 3449 scope, body, materialized_literal_count, expected_property_count, 0, | 3383 scope, body, materialized_literal_count, expected_property_count, 0, |
| 3450 FunctionLiteral::kAnonymousExpression, | 3384 FunctionLiteral::kAnonymousExpression, |
| 3451 FunctionLiteral::kNoDuplicateParameters, | 3385 FunctionLiteral::kNoDuplicateParameters, |
| 3452 FunctionLiteral::kShouldLazyCompile, FunctionKind::kNormalFunction, 0, | 3386 FunctionLiteral::kShouldLazyCompile, FunctionKind::kNormalFunction, 0, |
| 3453 false); | 3387 false); |
| 3454 } | 3388 } |
| 3455 | 3389 |
| 3456 ClassLiteral* NewClassLiteral(Scope* scope, VariableProxy* proxy, | |
| 3457 Expression* extends, | |
| 3458 FunctionLiteral* constructor, | |
| 3459 ZoneList<ObjectLiteral::Property*>* properties, | |
| 3460 int start_position, int end_position) { | |
| 3461 return new (parser_zone_) | |
| 3462 ClassLiteral(parser_zone_, scope, proxy, extends, constructor, | |
| 3463 properties, start_position, end_position); | |
| 3464 } | |
| 3465 | |
| 3466 NativeFunctionLiteral* NewNativeFunctionLiteral(const AstRawString* name, | 3390 NativeFunctionLiteral* NewNativeFunctionLiteral(const AstRawString* name, |
| 3467 v8::Extension* extension, | 3391 v8::Extension* extension, |
| 3468 int pos) { | 3392 int pos) { |
| 3469 return new (parser_zone_) | 3393 return new (parser_zone_) |
| 3470 NativeFunctionLiteral(parser_zone_, name, extension, pos); | 3394 NativeFunctionLiteral(parser_zone_, name, extension, pos); |
| 3471 } | 3395 } |
| 3472 | 3396 |
| 3473 DoExpression* NewDoExpression(Block* block, Variable* result_var, int pos) { | 3397 DoExpression* NewDoExpression(Block* block, Variable* result_var, int pos) { |
| 3474 VariableProxy* result = NewVariableProxy(result_var, pos); | 3398 VariableProxy* result = NewVariableProxy(result_var, pos); |
| 3475 return new (parser_zone_) DoExpression(parser_zone_, block, result, pos); | 3399 return new (parser_zone_) DoExpression(parser_zone_, block, result, pos); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3567 : NULL; \ | 3491 : NULL; \ |
| 3568 } | 3492 } |
| 3569 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3493 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 3570 #undef DECLARE_NODE_FUNCTIONS | 3494 #undef DECLARE_NODE_FUNCTIONS |
| 3571 | 3495 |
| 3572 | 3496 |
| 3573 } // namespace internal | 3497 } // namespace internal |
| 3574 } // namespace v8 | 3498 } // namespace v8 |
| 3575 | 3499 |
| 3576 #endif // V8_AST_AST_H_ | 3500 #endif // V8_AST_AST_H_ |
| OLD | NEW |