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

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

Issue 2764113002: [type-profile] Handle returns correctly. (Closed)
Patch Set: Private slot. Created 3 years, 9 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') | src/runtime/runtime-object.cc » ('J')
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/ast/ast-types.h" 8 #include "src/ast/ast-types.h"
9 #include "src/ast/ast-value-factory.h" 9 #include "src/ast/ast-value-factory.h"
10 #include "src/ast/modules.h" 10 #include "src/ast/modules.h"
(...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after
897 897
898 class ReturnStatement final : public JumpStatement { 898 class ReturnStatement final : public JumpStatement {
899 public: 899 public:
900 enum Type { kNormal, kAsyncReturn }; 900 enum Type { kNormal, kAsyncReturn };
901 Expression* expression() const { return expression_; } 901 Expression* expression() const { return expression_; }
902 902
903 void set_expression(Expression* e) { expression_ = e; } 903 void set_expression(Expression* e) { expression_ = e; }
904 Type type() const { return TypeField::decode(bit_field_); } 904 Type type() const { return TypeField::decode(bit_field_); }
905 bool is_async_return() const { return type() == kAsyncReturn; } 905 bool is_async_return() const { return type() == kAsyncReturn; }
906 906
907 FeedbackSlot TypeProfileSlot() const {
908 DCHECK(HasTypeProfileSlot());
909 return type_profile_slot_;
910 }
911
912 void SetTypeProfileSlot(FeedbackSlot slot) { type_profile_slot_ = slot; }
913
914 bool HasTypeProfileSlot() const { return !type_profile_slot_.IsInvalid(); }
915
916 private: 907 private:
917 friend class AstNodeFactory; 908 friend class AstNodeFactory;
918 909
919 ReturnStatement(Expression* expression, Type type, int pos) 910 ReturnStatement(Expression* expression, Type type, int pos)
920 : JumpStatement(pos, kReturnStatement), expression_(expression) { 911 : JumpStatement(pos, kReturnStatement), expression_(expression) {
921 bit_field_ |= TypeField::encode(type); 912 bit_field_ |= TypeField::encode(type);
922 } 913 }
923 914
924 FeedbackSlot type_profile_slot_;
925
926 Expression* expression_; 915 Expression* expression_;
927 916
928 class TypeField 917 class TypeField
929 : public BitField<Type, JumpStatement::kNextBitFieldIndex, 1> {}; 918 : public BitField<Type, JumpStatement::kNextBitFieldIndex, 1> {};
930 }; 919 };
931 920
932 921
933 class WithStatement final : public Statement { 922 class WithStatement final : public Statement {
934 public: 923 public:
935 Scope* scope() { return scope_; } 924 Scope* scope() { return scope_; }
(...skipping 1482 matching lines...) Expand 10 before | Expand all | Expand 10 after
2418 bit_field_ = IsUninitializedField::update(bit_field_, b); 2407 bit_field_ = IsUninitializedField::update(bit_field_, b);
2419 } 2408 }
2420 void set_key_type(IcCheckType key_type) { 2409 void set_key_type(IcCheckType key_type) {
2421 bit_field_ = KeyTypeField::update(bit_field_, key_type); 2410 bit_field_ = KeyTypeField::update(bit_field_, key_type);
2422 } 2411 }
2423 void set_store_mode(KeyedAccessStoreMode mode) { 2412 void set_store_mode(KeyedAccessStoreMode mode) {
2424 bit_field_ = StoreModeField::update(bit_field_, mode); 2413 bit_field_ = StoreModeField::update(bit_field_, mode);
2425 } 2414 }
2426 2415
2427 void AssignFeedbackSlots(FeedbackVectorSpec* spec, LanguageMode language_mode, 2416 void AssignFeedbackSlots(FeedbackVectorSpec* spec, LanguageMode language_mode,
2428 FeedbackSlotCache* cache, 2417 FeedbackSlotCache* cache);
2429 bool collect_type_profile = false);
2430 FeedbackSlot AssignmentSlot() const { return slot_; } 2418 FeedbackSlot AssignmentSlot() const { return slot_; }
2431 2419
2432 FeedbackSlot TypeProfileSlot() const {
2433 DCHECK(HasTypeProfileSlot());
2434 return type_profile_slot_;
2435 }
2436
2437 bool HasTypeProfileSlot() const { return !type_profile_slot_.IsInvalid(); }
2438
2439 private: 2420 private:
2440 friend class AstNodeFactory; 2421 friend class AstNodeFactory;
2441 2422
2442 Assignment(Token::Value op, Expression* target, Expression* value, int pos); 2423 Assignment(Token::Value op, Expression* target, Expression* value, int pos);
2443 2424
2444 static int parent_num_ids() { return Expression::num_ids(); } 2425 static int parent_num_ids() { return Expression::num_ids(); }
2445 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2426 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2446 2427
2447 class IsUninitializedField 2428 class IsUninitializedField
2448 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; 2429 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {};
2449 class KeyTypeField 2430 class KeyTypeField
2450 : public BitField<IcCheckType, IsUninitializedField::kNext, 1> {}; 2431 : public BitField<IcCheckType, IsUninitializedField::kNext, 1> {};
2451 class StoreModeField 2432 class StoreModeField
2452 : public BitField<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {}; 2433 : public BitField<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {};
2453 class TokenField : public BitField<Token::Value, StoreModeField::kNext, 7> {}; 2434 class TokenField : public BitField<Token::Value, StoreModeField::kNext, 7> {};
2454 2435
2455 FeedbackSlot slot_; 2436 FeedbackSlot slot_;
2456 Expression* target_; 2437 Expression* target_;
2457 Expression* value_; 2438 Expression* value_;
2458 BinaryOperation* binary_operation_; 2439 BinaryOperation* binary_operation_;
2459 SmallMapList receiver_types_; 2440 SmallMapList receiver_types_;
2460
2461 FeedbackSlot type_profile_slot_;
2462 }; 2441 };
2463 2442
2464 2443
2465 // The RewritableExpression class is a wrapper for AST nodes that wait 2444 // The RewritableExpression class is a wrapper for AST nodes that wait
2466 // for some potential rewriting. However, even if such nodes are indeed 2445 // for some potential rewriting. However, even if such nodes are indeed
2467 // rewritten, the RewritableExpression wrapper nodes will survive in the 2446 // rewritten, the RewritableExpression wrapper nodes will survive in the
2468 // final AST and should be just ignored, i.e., they should be treated as 2447 // final AST and should be just ignored, i.e., they should be treated as
2469 // equivalent to the wrapped nodes. For this reason and to simplify later 2448 // equivalent to the wrapped nodes. For this reason and to simplify later
2470 // phases, RewritableExpressions are considered as exceptions of AST nodes 2449 // phases, RewritableExpressions are considered as exceptions of AST nodes
2471 // in the following sense: 2450 // in the following sense:
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
2599 bool is_anonymous_expression() const { 2578 bool is_anonymous_expression() const {
2600 return function_type() == kAnonymousExpression; 2579 return function_type() == kAnonymousExpression;
2601 } 2580 }
2602 LanguageMode language_mode() const; 2581 LanguageMode language_mode() const;
2603 2582
2604 void AssignFeedbackSlots(FeedbackVectorSpec* spec, LanguageMode language_mode, 2583 void AssignFeedbackSlots(FeedbackVectorSpec* spec, LanguageMode language_mode,
2605 FeedbackSlotCache* cache) { 2584 FeedbackSlotCache* cache) {
2606 literal_feedback_slot_ = spec->AddCreateClosureSlot(); 2585 literal_feedback_slot_ = spec->AddCreateClosureSlot();
2607 } 2586 }
2608 2587
2588 void SetTypeProfileSlot(FeedbackSlot slot) { type_profile_slot_ = slot; }
2589
2609 FeedbackSlot LiteralFeedbackSlot() const { return literal_feedback_slot_; } 2590 FeedbackSlot LiteralFeedbackSlot() const { return literal_feedback_slot_; }
2591 FeedbackSlot TypeProfileSlot() const { return type_profile_slot_; }
2610 2592
2611 static bool NeedsHomeObject(Expression* expr); 2593 static bool NeedsHomeObject(Expression* expr);
2612 2594
2613 int expected_property_count() { return expected_property_count_; } 2595 int expected_property_count() { return expected_property_count_; }
2614 int parameter_count() { return parameter_count_; } 2596 int parameter_count() { return parameter_count_; }
2615 int function_length() { return function_length_; } 2597 int function_length() { return function_length_; }
2616 2598
2617 bool AllowsLazyCompilation(); 2599 bool AllowsLazyCompilation();
2618 2600
2619 Handle<String> debug_name() const { 2601 Handle<String> debug_name() const {
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2762 bool has_braces_; 2744 bool has_braces_;
2763 2745
2764 const AstString* raw_name_; 2746 const AstString* raw_name_;
2765 DeclarationScope* scope_; 2747 DeclarationScope* scope_;
2766 ZoneList<Statement*>* body_; 2748 ZoneList<Statement*>* body_;
2767 const AstString* raw_inferred_name_; 2749 const AstString* raw_inferred_name_;
2768 Handle<String> inferred_name_; 2750 Handle<String> inferred_name_;
2769 AstProperties ast_properties_; 2751 AstProperties ast_properties_;
2770 int function_literal_id_; 2752 int function_literal_id_;
2771 FeedbackSlot literal_feedback_slot_; 2753 FeedbackSlot literal_feedback_slot_;
2754 FeedbackSlot type_profile_slot_;
2772 }; 2755 };
2773 2756
2774 // Property is used for passing information 2757 // Property is used for passing information
2775 // about a class literal's properties from the parser to the code generator. 2758 // about a class literal's properties from the parser to the code generator.
2776 class ClassLiteralProperty final : public LiteralProperty { 2759 class ClassLiteralProperty final : public LiteralProperty {
2777 public: 2760 public:
2778 enum Kind : uint8_t { METHOD, GETTER, SETTER, FIELD }; 2761 enum Kind : uint8_t { METHOD, GETTER, SETTER, FIELD };
2779 2762
2780 Kind kind() const { return kind_; } 2763 Kind kind() const { return kind_; }
2781 2764
(...skipping 876 matching lines...) Expand 10 before | Expand all | Expand 10 after
3658 : NULL; \ 3641 : NULL; \
3659 } 3642 }
3660 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 3643 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
3661 #undef DECLARE_NODE_FUNCTIONS 3644 #undef DECLARE_NODE_FUNCTIONS
3662 3645
3663 3646
3664 } // namespace internal 3647 } // namespace internal
3665 } // namespace v8 3648 } // namespace v8
3666 3649
3667 #endif // V8_AST_AST_H_ 3650 #endif // V8_AST_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast/ast.cc » ('j') | src/runtime/runtime-object.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698