| 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 2104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2115 default: | 2115 default: |
| 2116 break; | 2116 break; |
| 2117 } | 2117 } |
| 2118 } | 2118 } |
| 2119 | 2119 |
| 2120 // The short-circuit logical operations need an AST ID for their | 2120 // The short-circuit logical operations need an AST ID for their |
| 2121 // right-hand subexpression. | 2121 // right-hand subexpression. |
| 2122 static int num_ids() { return parent_num_ids() + 2; } | 2122 static int num_ids() { return parent_num_ids() + 2; } |
| 2123 BailoutId RightId() const { return BailoutId(local_id(0)); } | 2123 BailoutId RightId() const { return BailoutId(local_id(0)); } |
| 2124 | 2124 |
| 2125 // BinaryOperation will have both a slot in the feedback vector and the |
| 2126 // TypeFeedbackId to record the type information. TypeFeedbackId is used |
| 2127 // by full codegen and the feedback vector slot is used by interpreter. |
| 2128 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 2129 FeedbackVectorSlotCache* cache); |
| 2130 |
| 2131 FeedbackVectorSlot BinaryOperationFeedbackSlot() const { |
| 2132 return type_feedback_slot_; |
| 2133 } |
| 2134 |
| 2125 TypeFeedbackId BinaryOperationFeedbackId() const { | 2135 TypeFeedbackId BinaryOperationFeedbackId() const { |
| 2126 return TypeFeedbackId(local_id(1)); | 2136 return TypeFeedbackId(local_id(1)); |
| 2127 } | 2137 } |
| 2128 Maybe<int> fixed_right_arg() const { | 2138 Maybe<int> fixed_right_arg() const { |
| 2129 return has_fixed_right_arg_ ? Just(fixed_right_arg_value_) : Nothing<int>(); | 2139 return has_fixed_right_arg_ ? Just(fixed_right_arg_value_) : Nothing<int>(); |
| 2130 } | 2140 } |
| 2131 void set_fixed_right_arg(Maybe<int> arg) { | 2141 void set_fixed_right_arg(Maybe<int> arg) { |
| 2132 has_fixed_right_arg_ = arg.IsJust(); | 2142 has_fixed_right_arg_ = arg.IsJust(); |
| 2133 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); | 2143 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); |
| 2134 } | 2144 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2152 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2162 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2153 | 2163 |
| 2154 const byte op_; // actually Token::Value | 2164 const byte op_; // actually Token::Value |
| 2155 // TODO(rossberg): the fixed arg should probably be represented as a Constant | 2165 // TODO(rossberg): the fixed arg should probably be represented as a Constant |
| 2156 // type for the RHS. Currenty it's actually a Maybe<int> | 2166 // type for the RHS. Currenty it's actually a Maybe<int> |
| 2157 bool has_fixed_right_arg_; | 2167 bool has_fixed_right_arg_; |
| 2158 int fixed_right_arg_value_; | 2168 int fixed_right_arg_value_; |
| 2159 Expression* left_; | 2169 Expression* left_; |
| 2160 Expression* right_; | 2170 Expression* right_; |
| 2161 Handle<AllocationSite> allocation_site_; | 2171 Handle<AllocationSite> allocation_site_; |
| 2172 FeedbackVectorSlot type_feedback_slot_; |
| 2162 }; | 2173 }; |
| 2163 | 2174 |
| 2164 | 2175 |
| 2165 class CountOperation final : public Expression { | 2176 class CountOperation final : public Expression { |
| 2166 public: | 2177 public: |
| 2167 DECLARE_NODE_TYPE(CountOperation) | 2178 DECLARE_NODE_TYPE(CountOperation) |
| 2168 | 2179 |
| 2169 bool is_prefix() const { return IsPrefixField::decode(bit_field_); } | 2180 bool is_prefix() const { return IsPrefixField::decode(bit_field_); } |
| 2170 bool is_postfix() const { return !is_prefix(); } | 2181 bool is_postfix() const { return !is_prefix(); } |
| 2171 | 2182 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2195 static int num_ids() { return parent_num_ids() + 4; } | 2206 static int num_ids() { return parent_num_ids() + 4; } |
| 2196 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } | 2207 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } |
| 2197 BailoutId ToNumberId() const { return BailoutId(local_id(1)); } | 2208 BailoutId ToNumberId() const { return BailoutId(local_id(1)); } |
| 2198 TypeFeedbackId CountBinOpFeedbackId() const { | 2209 TypeFeedbackId CountBinOpFeedbackId() const { |
| 2199 return TypeFeedbackId(local_id(2)); | 2210 return TypeFeedbackId(local_id(2)); |
| 2200 } | 2211 } |
| 2201 TypeFeedbackId CountStoreFeedbackId() const { | 2212 TypeFeedbackId CountStoreFeedbackId() const { |
| 2202 return TypeFeedbackId(local_id(3)); | 2213 return TypeFeedbackId(local_id(3)); |
| 2203 } | 2214 } |
| 2204 | 2215 |
| 2216 // Feedback slot for binary operation is only used by ignition. |
| 2217 FeedbackVectorSlot CountBinaryOpFeedbackSlot() const { |
| 2218 return binary_operation_slot_; |
| 2219 } |
| 2220 |
| 2205 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 2221 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 2206 FeedbackVectorSlotCache* cache); | 2222 FeedbackVectorSlotCache* cache); |
| 2207 FeedbackVectorSlot CountSlot() const { return slot_; } | 2223 FeedbackVectorSlot CountSlot() const { return slot_; } |
| 2208 | 2224 |
| 2209 protected: | 2225 protected: |
| 2210 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, | 2226 CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, |
| 2211 int pos) | 2227 int pos) |
| 2212 : Expression(zone, pos, kCountOperation), | 2228 : Expression(zone, pos, kCountOperation), |
| 2213 bit_field_( | 2229 bit_field_( |
| 2214 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | | 2230 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | |
| 2215 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), | 2231 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), |
| 2216 type_(NULL), | 2232 type_(NULL), |
| 2217 expression_(expr) {} | 2233 expression_(expr) {} |
| 2218 static int parent_num_ids() { return Expression::num_ids(); } | 2234 static int parent_num_ids() { return Expression::num_ids(); } |
| 2219 | 2235 |
| 2220 private: | 2236 private: |
| 2221 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2237 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2222 | 2238 |
| 2223 class IsPrefixField : public BitField16<bool, 0, 1> {}; | 2239 class IsPrefixField : public BitField16<bool, 0, 1> {}; |
| 2224 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; | 2240 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; |
| 2225 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {}; | 2241 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {}; |
| 2226 class TokenField : public BitField16<Token::Value, 5, 8> {}; | 2242 class TokenField : public BitField16<Token::Value, 5, 8> {}; |
| 2227 | 2243 |
| 2228 // Starts with 16-bit field, which should get packed together with | 2244 // Starts with 16-bit field, which should get packed together with |
| 2229 // Expression's trailing 16-bit field. | 2245 // Expression's trailing 16-bit field. |
| 2230 uint16_t bit_field_; | 2246 uint16_t bit_field_; |
| 2231 FeedbackVectorSlot slot_; | 2247 FeedbackVectorSlot slot_; |
| 2248 FeedbackVectorSlot binary_operation_slot_; |
| 2232 Type* type_; | 2249 Type* type_; |
| 2233 Expression* expression_; | 2250 Expression* expression_; |
| 2234 SmallMapList receiver_types_; | 2251 SmallMapList receiver_types_; |
| 2235 }; | 2252 }; |
| 2236 | 2253 |
| 2237 | 2254 |
| 2238 class CompareOperation final : public Expression { | 2255 class CompareOperation final : public Expression { |
| 2239 public: | 2256 public: |
| 2240 DECLARE_NODE_TYPE(CompareOperation) | 2257 DECLARE_NODE_TYPE(CompareOperation) |
| 2241 | 2258 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2363 void set_value(Expression* e) { value_ = e; } | 2380 void set_value(Expression* e) { value_ = e; } |
| 2364 | 2381 |
| 2365 BinaryOperation* binary_operation() const { return binary_operation_; } | 2382 BinaryOperation* binary_operation() const { return binary_operation_; } |
| 2366 | 2383 |
| 2367 // This check relies on the definition order of token in token.h. | 2384 // This check relies on the definition order of token in token.h. |
| 2368 bool is_compound() const { return op() > Token::ASSIGN; } | 2385 bool is_compound() const { return op() > Token::ASSIGN; } |
| 2369 | 2386 |
| 2370 static int num_ids() { return parent_num_ids() + 2; } | 2387 static int num_ids() { return parent_num_ids() + 2; } |
| 2371 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } | 2388 BailoutId AssignmentId() const { return BailoutId(local_id(0)); } |
| 2372 | 2389 |
| 2390 // Type feedback vector slot. Used only by ignition. |
| 2391 FeedbackVectorSlot BinaryOperationFeedbackSlot() const { |
| 2392 return binary_operation_slot_; |
| 2393 } |
| 2394 |
| 2373 // Type feedback information. | 2395 // Type feedback information. |
| 2374 TypeFeedbackId AssignmentFeedbackId() { return TypeFeedbackId(local_id(1)); } | 2396 TypeFeedbackId AssignmentFeedbackId() { return TypeFeedbackId(local_id(1)); } |
| 2375 bool IsUninitialized() const { | 2397 bool IsUninitialized() const { |
| 2376 return IsUninitializedField::decode(bit_field_); | 2398 return IsUninitializedField::decode(bit_field_); |
| 2377 } | 2399 } |
| 2378 bool HasNoTypeInformation() { | 2400 bool HasNoTypeInformation() { |
| 2379 return IsUninitializedField::decode(bit_field_); | 2401 return IsUninitializedField::decode(bit_field_); |
| 2380 } | 2402 } |
| 2381 bool IsMonomorphic() const { return receiver_types_.length() == 1; } | 2403 bool IsMonomorphic() const { return receiver_types_.length() == 1; } |
| 2382 SmallMapList* GetReceiverTypes() { return &receiver_types_; } | 2404 SmallMapList* GetReceiverTypes() { return &receiver_types_; } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2411 : public BitField16<IcCheckType, IsUninitializedField::kNext, 1> {}; | 2433 : public BitField16<IcCheckType, IsUninitializedField::kNext, 1> {}; |
| 2412 class StoreModeField | 2434 class StoreModeField |
| 2413 : public BitField16<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {}; | 2435 : public BitField16<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {}; |
| 2414 class TokenField : public BitField16<Token::Value, StoreModeField::kNext, 8> { | 2436 class TokenField : public BitField16<Token::Value, StoreModeField::kNext, 8> { |
| 2415 }; | 2437 }; |
| 2416 | 2438 |
| 2417 // Starts with 16-bit field, which should get packed together with | 2439 // Starts with 16-bit field, which should get packed together with |
| 2418 // Expression's trailing 16-bit field. | 2440 // Expression's trailing 16-bit field. |
| 2419 uint16_t bit_field_; | 2441 uint16_t bit_field_; |
| 2420 FeedbackVectorSlot slot_; | 2442 FeedbackVectorSlot slot_; |
| 2443 FeedbackVectorSlot binary_operation_slot_; |
| 2421 Expression* target_; | 2444 Expression* target_; |
| 2422 Expression* value_; | 2445 Expression* value_; |
| 2423 BinaryOperation* binary_operation_; | 2446 BinaryOperation* binary_operation_; |
| 2424 SmallMapList receiver_types_; | 2447 SmallMapList receiver_types_; |
| 2425 }; | 2448 }; |
| 2426 | 2449 |
| 2427 | 2450 |
| 2428 // The RewritableExpression class is a wrapper for AST nodes that wait | 2451 // The RewritableExpression class is a wrapper for AST nodes that wait |
| 2429 // for some potential rewriting. However, even if such nodes are indeed | 2452 // for some potential rewriting. However, even if such nodes are indeed |
| 2430 // rewritten, the RewritableExpression wrapper nodes will survive in the | 2453 // rewritten, the RewritableExpression wrapper nodes will survive in the |
| (...skipping 1088 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3519 : NULL; \ | 3542 : NULL; \ |
| 3520 } | 3543 } |
| 3521 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3544 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 3522 #undef DECLARE_NODE_FUNCTIONS | 3545 #undef DECLARE_NODE_FUNCTIONS |
| 3523 | 3546 |
| 3524 | 3547 |
| 3525 } // namespace internal | 3548 } // namespace internal |
| 3526 } // namespace v8 | 3549 } // namespace v8 |
| 3527 | 3550 |
| 3528 #endif // V8_AST_AST_H_ | 3551 #endif // V8_AST_AST_H_ |
| OLD | NEW |