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

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

Issue 2302283002: Forking the type system between Crankshaft & Turbofan. (Closed)
Patch Set: Nits. Created 4 years, 3 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/asmjs/asm-typer.h ('k') | 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/ast/ast-types.h"
8 #include "src/ast/ast-value-factory.h" 9 #include "src/ast/ast-value-factory.h"
9 #include "src/ast/modules.h" 10 #include "src/ast/modules.h"
10 #include "src/ast/variables.h" 11 #include "src/ast/variables.h"
11 #include "src/bailout-reason.h" 12 #include "src/bailout-reason.h"
12 #include "src/base/flags.h" 13 #include "src/base/flags.h"
13 #include "src/factory.h" 14 #include "src/factory.h"
14 #include "src/globals.h" 15 #include "src/globals.h"
15 #include "src/isolate.h" 16 #include "src/isolate.h"
16 #include "src/list.h" 17 #include "src/list.h"
17 #include "src/parsing/token.h" 18 #include "src/parsing/token.h"
18 #include "src/runtime/runtime.h" 19 #include "src/runtime/runtime.h"
19 #include "src/small-pointer-list.h" 20 #include "src/small-pointer-list.h"
20 #include "src/types.h"
21 #include "src/utils.h" 21 #include "src/utils.h"
22 22
23 namespace v8 { 23 namespace v8 {
24 namespace internal { 24 namespace internal {
25 25
26 // The abstract syntax tree is an intermediate, light-weight 26 // The abstract syntax tree is an intermediate, light-weight
27 // representation of the parsed JavaScript code suitable for 27 // representation of the parsed JavaScript code suitable for
28 // compilation to native code. 28 // compilation to native code.
29 29
30 // Nodes are allocated in a separate zone, which allows faster 30 // Nodes are allocated in a separate zone, which allows faster
(...skipping 901 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 return label_; 932 return label_;
933 } 933 }
934 void set_label(Expression* e) { label_ = e; } 934 void set_label(Expression* e) { label_ = e; }
935 Label* body_target() { return &body_target_; } 935 Label* body_target() { return &body_target_; }
936 ZoneList<Statement*>* statements() const { return statements_; } 936 ZoneList<Statement*>* statements() const { return statements_; }
937 937
938 static int num_ids() { return parent_num_ids() + 2; } 938 static int num_ids() { return parent_num_ids() + 2; }
939 BailoutId EntryId() const { return BailoutId(local_id(0)); } 939 BailoutId EntryId() const { return BailoutId(local_id(0)); }
940 TypeFeedbackId CompareId() { return TypeFeedbackId(local_id(1)); } 940 TypeFeedbackId CompareId() { return TypeFeedbackId(local_id(1)); }
941 941
942 Type* compare_type() { return compare_type_; } 942 AstType* compare_type() { return compare_type_; }
943 void set_compare_type(Type* type) { compare_type_ = type; } 943 void set_compare_type(AstType* type) { compare_type_ = type; }
944 944
945 // CaseClause will have both a slot in the feedback vector and the 945 // CaseClause will have both a slot in the feedback vector and the
946 // TypeFeedbackId to record the type information. TypeFeedbackId is used by 946 // TypeFeedbackId to record the type information. TypeFeedbackId is used by
947 // full codegen and the feedback vector slot is used by interpreter. 947 // full codegen and the feedback vector slot is used by interpreter.
948 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 948 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
949 FeedbackVectorSlotCache* cache); 949 FeedbackVectorSlotCache* cache);
950 950
951 FeedbackVectorSlot CompareOperationFeedbackSlot() { 951 FeedbackVectorSlot CompareOperationFeedbackSlot() {
952 return type_feedback_slot_; 952 return type_feedback_slot_;
953 } 953 }
954 954
955 private: 955 private:
956 friend class AstNodeFactory; 956 friend class AstNodeFactory;
957 957
958 static int parent_num_ids() { return Expression::num_ids(); } 958 static int parent_num_ids() { return Expression::num_ids(); }
959 CaseClause(Expression* label, ZoneList<Statement*>* statements, int pos); 959 CaseClause(Expression* label, ZoneList<Statement*>* statements, int pos);
960 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 960 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
961 961
962 Expression* label_; 962 Expression* label_;
963 Label body_target_; 963 Label body_target_;
964 ZoneList<Statement*>* statements_; 964 ZoneList<Statement*>* statements_;
965 Type* compare_type_; 965 AstType* compare_type_;
966 FeedbackVectorSlot type_feedback_slot_; 966 FeedbackVectorSlot type_feedback_slot_;
967 }; 967 };
968 968
969 969
970 class SwitchStatement final : public BreakableStatement { 970 class SwitchStatement final : public BreakableStatement {
971 public: 971 public:
972 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { 972 void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) {
973 tag_ = tag; 973 tag_ = tag;
974 cases_ = cases; 974 cases_ = cases;
975 } 975 }
(...skipping 1152 matching lines...) Expand 10 before | Expand all | Expand 10 after
2128 2128
2129 Expression* expression() const { return expression_; } 2129 Expression* expression() const { return expression_; }
2130 void set_expression(Expression* e) { expression_ = e; } 2130 void set_expression(Expression* e) { expression_ = e; }
2131 2131
2132 bool IsMonomorphic() const { return receiver_types_.length() == 1; } 2132 bool IsMonomorphic() const { return receiver_types_.length() == 1; }
2133 SmallMapList* GetReceiverTypes() { return &receiver_types_; } 2133 SmallMapList* GetReceiverTypes() { return &receiver_types_; }
2134 IcCheckType GetKeyType() const { return KeyTypeField::decode(bit_field_); } 2134 IcCheckType GetKeyType() const { return KeyTypeField::decode(bit_field_); }
2135 KeyedAccessStoreMode GetStoreMode() const { 2135 KeyedAccessStoreMode GetStoreMode() const {
2136 return StoreModeField::decode(bit_field_); 2136 return StoreModeField::decode(bit_field_);
2137 } 2137 }
2138 Type* type() const { return type_; } 2138 AstType* type() const { return type_; }
2139 void set_key_type(IcCheckType type) { 2139 void set_key_type(IcCheckType type) {
2140 bit_field_ = KeyTypeField::update(bit_field_, type); 2140 bit_field_ = KeyTypeField::update(bit_field_, type);
2141 } 2141 }
2142 void set_store_mode(KeyedAccessStoreMode mode) { 2142 void set_store_mode(KeyedAccessStoreMode mode) {
2143 bit_field_ = StoreModeField::update(bit_field_, mode); 2143 bit_field_ = StoreModeField::update(bit_field_, mode);
2144 } 2144 }
2145 void set_type(Type* type) { type_ = type; } 2145 void set_type(AstType* type) { type_ = type; }
2146 2146
2147 static int num_ids() { return parent_num_ids() + 4; } 2147 static int num_ids() { return parent_num_ids() + 4; }
2148 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } 2148 BailoutId AssignmentId() const { return BailoutId(local_id(0)); }
2149 BailoutId ToNumberId() const { return BailoutId(local_id(1)); } 2149 BailoutId ToNumberId() const { return BailoutId(local_id(1)); }
2150 TypeFeedbackId CountBinOpFeedbackId() const { 2150 TypeFeedbackId CountBinOpFeedbackId() const {
2151 return TypeFeedbackId(local_id(2)); 2151 return TypeFeedbackId(local_id(2));
2152 } 2152 }
2153 TypeFeedbackId CountStoreFeedbackId() const { 2153 TypeFeedbackId CountStoreFeedbackId() const {
2154 return TypeFeedbackId(local_id(3)); 2154 return TypeFeedbackId(local_id(3));
2155 } 2155 }
(...skipping 24 matching lines...) Expand all
2180 class IsPrefixField : public BitField16<bool, 0, 1> {}; 2180 class IsPrefixField : public BitField16<bool, 0, 1> {};
2181 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; 2181 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {};
2182 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {}; 2182 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {};
2183 class TokenField : public BitField16<Token::Value, 5, 8> {}; 2183 class TokenField : public BitField16<Token::Value, 5, 8> {};
2184 2184
2185 // Starts with 16-bit field, which should get packed together with 2185 // Starts with 16-bit field, which should get packed together with
2186 // Expression's trailing 16-bit field. 2186 // Expression's trailing 16-bit field.
2187 uint16_t bit_field_; 2187 uint16_t bit_field_;
2188 FeedbackVectorSlot slot_; 2188 FeedbackVectorSlot slot_;
2189 FeedbackVectorSlot binary_operation_slot_; 2189 FeedbackVectorSlot binary_operation_slot_;
2190 Type* type_; 2190 AstType* type_;
2191 Expression* expression_; 2191 Expression* expression_;
2192 SmallMapList receiver_types_; 2192 SmallMapList receiver_types_;
2193 }; 2193 };
2194 2194
2195 2195
2196 class CompareOperation final : public Expression { 2196 class CompareOperation final : public Expression {
2197 public: 2197 public:
2198 Token::Value op() const { return op_; } 2198 Token::Value op() const { return op_; }
2199 Expression* left() const { return left_; } 2199 Expression* left() const { return left_; }
2200 Expression* right() const { return right_; } 2200 Expression* right() const { return right_; }
2201 2201
2202 void set_left(Expression* e) { left_ = e; } 2202 void set_left(Expression* e) { left_ = e; }
2203 void set_right(Expression* e) { right_ = e; } 2203 void set_right(Expression* e) { right_ = e; }
2204 2204
2205 // Type feedback information. 2205 // Type feedback information.
2206 static int num_ids() { return parent_num_ids() + 1; } 2206 static int num_ids() { return parent_num_ids() + 1; }
2207 TypeFeedbackId CompareOperationFeedbackId() const { 2207 TypeFeedbackId CompareOperationFeedbackId() const {
2208 return TypeFeedbackId(local_id(0)); 2208 return TypeFeedbackId(local_id(0));
2209 } 2209 }
2210 Type* combined_type() const { return combined_type_; } 2210 AstType* combined_type() const { return combined_type_; }
2211 void set_combined_type(Type* type) { combined_type_ = type; } 2211 void set_combined_type(AstType* type) { combined_type_ = type; }
2212 2212
2213 // CompareOperation will have both a slot in the feedback vector and the 2213 // CompareOperation will have both a slot in the feedback vector and the
2214 // TypeFeedbackId to record the type information. TypeFeedbackId is used 2214 // TypeFeedbackId to record the type information. TypeFeedbackId is used
2215 // by full codegen and the feedback vector slot is used by interpreter. 2215 // by full codegen and the feedback vector slot is used by interpreter.
2216 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 2216 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
2217 FeedbackVectorSlotCache* cache); 2217 FeedbackVectorSlotCache* cache);
2218 2218
2219 FeedbackVectorSlot CompareOperationFeedbackSlot() const { 2219 FeedbackVectorSlot CompareOperationFeedbackSlot() const {
2220 return type_feedback_slot_; 2220 return type_feedback_slot_;
2221 } 2221 }
2222 2222
2223 // Match special cases. 2223 // Match special cases.
2224 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); 2224 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check);
2225 bool IsLiteralCompareUndefined(Expression** expr); 2225 bool IsLiteralCompareUndefined(Expression** expr);
2226 bool IsLiteralCompareNull(Expression** expr); 2226 bool IsLiteralCompareNull(Expression** expr);
2227 2227
2228 private: 2228 private:
2229 friend class AstNodeFactory; 2229 friend class AstNodeFactory;
2230 2230
2231 CompareOperation(Token::Value op, Expression* left, Expression* right, 2231 CompareOperation(Token::Value op, Expression* left, Expression* right,
2232 int pos) 2232 int pos)
2233 : Expression(pos, kCompareOperation), 2233 : Expression(pos, kCompareOperation),
2234 op_(op), 2234 op_(op),
2235 left_(left), 2235 left_(left),
2236 right_(right), 2236 right_(right),
2237 combined_type_(Type::None()) { 2237 combined_type_(AstType::None()) {
2238 DCHECK(Token::IsCompareOp(op)); 2238 DCHECK(Token::IsCompareOp(op));
2239 } 2239 }
2240 2240
2241 static int parent_num_ids() { return Expression::num_ids(); } 2241 static int parent_num_ids() { return Expression::num_ids(); }
2242 int local_id(int n) const { return base_id() + parent_num_ids() + n; } 2242 int local_id(int n) const { return base_id() + parent_num_ids() + n; }
2243 2243
2244 Token::Value op_; 2244 Token::Value op_;
2245 Expression* left_; 2245 Expression* left_;
2246 Expression* right_; 2246 Expression* right_;
2247 2247
2248 Type* combined_type_; 2248 AstType* combined_type_;
2249 FeedbackVectorSlot type_feedback_slot_; 2249 FeedbackVectorSlot type_feedback_slot_;
2250 }; 2250 };
2251 2251
2252 2252
2253 class Spread final : public Expression { 2253 class Spread final : public Expression {
2254 public: 2254 public:
2255 Expression* expression() const { return expression_; } 2255 Expression* expression() const { return expression_; }
2256 void set_expression(Expression* e) { expression_ = e; } 2256 void set_expression(Expression* e) { expression_ = e; }
2257 2257
2258 int expression_position() const { return expr_pos_; } 2258 int expression_position() const { return expr_pos_; }
(...skipping 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after
3464 : NULL; \ 3464 : NULL; \
3465 } 3465 }
3466 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 3466 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
3467 #undef DECLARE_NODE_FUNCTIONS 3467 #undef DECLARE_NODE_FUNCTIONS
3468 3468
3469 3469
3470 } // namespace internal 3470 } // namespace internal
3471 } // namespace v8 3471 } // namespace v8
3472 3472
3473 #endif // V8_AST_AST_H_ 3473 #endif // V8_AST_AST_H_
OLDNEW
« no previous file with comments | « src/asmjs/asm-typer.h ('k') | src/ast/ast.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698