| 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-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 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 | 185 |
| 186 | 186 |
| 187 class AstNode: public ZoneObject { | 187 class AstNode: public ZoneObject { |
| 188 public: | 188 public: |
| 189 #define DECLARE_TYPE_ENUM(type) k##type, | 189 #define DECLARE_TYPE_ENUM(type) k##type, |
| 190 enum NodeType : uint8_t { AST_NODE_LIST(DECLARE_TYPE_ENUM) }; | 190 enum NodeType : uint8_t { AST_NODE_LIST(DECLARE_TYPE_ENUM) }; |
| 191 #undef DECLARE_TYPE_ENUM | 191 #undef DECLARE_TYPE_ENUM |
| 192 | 192 |
| 193 void* operator new(size_t size, Zone* zone) { return zone->New(size); } | 193 void* operator new(size_t size, Zone* zone) { return zone->New(size); } |
| 194 | 194 |
| 195 NodeType node_type() const { return node_type_; } | 195 NodeType node_type() const { return NodeTypeField::decode(bit_field_); } |
| 196 int position() const { return position_; } | 196 int position() const { return position_; } |
| 197 | 197 |
| 198 #ifdef DEBUG | 198 #ifdef DEBUG |
| 199 void Print(Isolate* isolate); | 199 void Print(Isolate* isolate); |
| 200 #endif // DEBUG | 200 #endif // DEBUG |
| 201 | 201 |
| 202 // Type testing & conversion functions overridden by concrete subclasses. | 202 // Type testing & conversion functions overridden by concrete subclasses. |
| 203 #define DECLARE_NODE_FUNCTIONS(type) \ | 203 #define DECLARE_NODE_FUNCTIONS(type) \ |
| 204 V8_INLINE bool Is##type() const; \ | 204 V8_INLINE bool Is##type() const; \ |
| 205 V8_INLINE type* As##type(); \ | 205 V8_INLINE type* As##type(); \ |
| 206 V8_INLINE const type* As##type() const; | 206 V8_INLINE const type* As##type() const; |
| 207 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 207 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 208 #undef DECLARE_NODE_FUNCTIONS | 208 #undef DECLARE_NODE_FUNCTIONS |
| 209 | 209 |
| 210 BreakableStatement* AsBreakableStatement(); | 210 BreakableStatement* AsBreakableStatement(); |
| 211 IterationStatement* AsIterationStatement(); | 211 IterationStatement* AsIterationStatement(); |
| 212 MaterializedLiteral* AsMaterializedLiteral(); | 212 MaterializedLiteral* AsMaterializedLiteral(); |
| 213 | 213 |
| 214 protected: | |
| 215 AstNode(int position, NodeType type) | |
| 216 : position_(position), node_type_(type) {} | |
| 217 | |
| 218 private: | 214 private: |
| 219 // Hidden to prevent accidental usage. It would have to load the | 215 // Hidden to prevent accidental usage. It would have to load the |
| 220 // current zone from the TLS. | 216 // current zone from the TLS. |
| 221 void* operator new(size_t size); | 217 void* operator new(size_t size); |
| 222 | 218 |
| 223 int position_; | 219 int position_; |
| 224 NodeType node_type_; | 220 class NodeTypeField : public BitField<NodeType, 0, 6> {}; |
| 225 // Ends with NodeType which is uint8_t sized. Deriving classes in turn begin | 221 |
| 226 // sub-int32_t-sized fields for optimum packing efficiency. | 222 protected: |
| 223 uint32_t bit_field_; |
| 224 static const uint8_t kNextBitFieldIndex = NodeTypeField::kNext; |
| 225 |
| 226 AstNode(int position, NodeType type) |
| 227 : position_(position), bit_field_(NodeTypeField::encode(type)) {} |
| 227 }; | 228 }; |
| 228 | 229 |
| 229 | 230 |
| 230 class Statement : public AstNode { | 231 class Statement : public AstNode { |
| 231 public: | 232 public: |
| 232 bool IsEmpty() { return AsEmptyStatement() != NULL; } | 233 bool IsEmpty() { return AsEmptyStatement() != NULL; } |
| 233 bool IsJump() const; | 234 bool IsJump() const; |
| 234 | 235 |
| 235 protected: | 236 protected: |
| 236 Statement(int position, NodeType type) : AstNode(position, type) {} | 237 Statement(int position, NodeType type) : AstNode(position, type) {} |
| 238 |
| 239 static const uint8_t kNextBitFieldIndex = AstNode::kNextBitFieldIndex; |
| 237 }; | 240 }; |
| 238 | 241 |
| 239 | 242 |
| 240 class SmallMapList final { | 243 class SmallMapList final { |
| 241 public: | 244 public: |
| 242 SmallMapList() {} | 245 SmallMapList() {} |
| 243 SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {} | 246 SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {} |
| 244 | 247 |
| 245 void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); } | 248 void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); } |
| 246 void Clear() { list_.Clear(); } | 249 void Clear() { list_.Clear(); } |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 SmallMapList* GetReceiverTypes(); | 345 SmallMapList* GetReceiverTypes(); |
| 343 KeyedAccessStoreMode GetStoreMode() const; | 346 KeyedAccessStoreMode GetStoreMode() const; |
| 344 IcCheckType GetKeyType() const; | 347 IcCheckType GetKeyType() const; |
| 345 bool IsMonomorphic() const; | 348 bool IsMonomorphic() const; |
| 346 | 349 |
| 347 void set_base_id(int id) { base_id_ = id; } | 350 void set_base_id(int id) { base_id_ = id; } |
| 348 static int num_ids() { return parent_num_ids() + 2; } | 351 static int num_ids() { return parent_num_ids() + 2; } |
| 349 BailoutId id() const { return BailoutId(local_id(0)); } | 352 BailoutId id() const { return BailoutId(local_id(0)); } |
| 350 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } | 353 TypeFeedbackId test_id() const { return TypeFeedbackId(local_id(1)); } |
| 351 | 354 |
| 355 private: |
| 356 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 357 |
| 358 int base_id_; |
| 359 class ToBooleanTypesField |
| 360 : public BitField<uint16_t, AstNode::kNextBitFieldIndex, 9> {}; |
| 361 |
| 352 protected: | 362 protected: |
| 353 Expression(int pos, NodeType type) | 363 Expression(int pos, NodeType type) |
| 354 : AstNode(pos, type), | 364 : AstNode(pos, type), base_id_(BailoutId::None().ToInt()) { |
| 355 bit_field_(0), | 365 bit_field_ = ToBooleanTypesField::update(bit_field_, 0); |
| 356 base_id_(BailoutId::None().ToInt()) {} | 366 } |
| 357 | 367 |
| 358 static int parent_num_ids() { return 0; } | 368 static int parent_num_ids() { return 0; } |
| 359 void set_to_boolean_types(uint16_t types) { | 369 void set_to_boolean_types(uint16_t types) { |
| 360 bit_field_ = ToBooleanTypesField::update(bit_field_, types); | 370 bit_field_ = ToBooleanTypesField::update(bit_field_, types); |
| 361 } | 371 } |
| 362 int base_id() const { | 372 int base_id() const { |
| 363 DCHECK(!BailoutId(base_id_).IsNone()); | 373 DCHECK(!BailoutId(base_id_).IsNone()); |
| 364 return base_id_; | 374 return base_id_; |
| 365 } | 375 } |
| 366 | 376 |
| 367 private: | 377 static const uint8_t kNextBitFieldIndex = ToBooleanTypesField::kNext; |
| 368 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | |
| 369 | |
| 370 uint16_t bit_field_; | |
| 371 int base_id_; | |
| 372 class ToBooleanTypesField : public BitField16<uint16_t, 0, 9> {}; | |
| 373 }; | 378 }; |
| 374 | 379 |
| 375 | 380 |
| 376 class BreakableStatement : public Statement { | 381 class BreakableStatement : public Statement { |
| 377 public: | 382 public: |
| 378 enum BreakableType { | 383 enum BreakableType { |
| 379 TARGET_FOR_ANONYMOUS, | 384 TARGET_FOR_ANONYMOUS, |
| 380 TARGET_FOR_NAMED_ONLY | 385 TARGET_FOR_NAMED_ONLY |
| 381 }; | 386 }; |
| 382 | 387 |
| 383 // The labels associated with this statement. May be NULL; | 388 // The labels associated with this statement. May be NULL; |
| 384 // if it is != NULL, guaranteed to contain at least one entry. | 389 // if it is != NULL, guaranteed to contain at least one entry. |
| 385 ZoneList<const AstRawString*>* labels() const { return labels_; } | 390 ZoneList<const AstRawString*>* labels() const { return labels_; } |
| 386 | 391 |
| 387 // Code generation | 392 // Code generation |
| 388 Label* break_target() { return &break_target_; } | 393 Label* break_target() { return &break_target_; } |
| 389 | 394 |
| 390 // Testers. | 395 // Testers. |
| 391 bool is_target_for_anonymous() const { | 396 bool is_target_for_anonymous() const { |
| 392 return breakable_type_ == TARGET_FOR_ANONYMOUS; | 397 return BreakableTypeField::decode(bit_field_) == TARGET_FOR_ANONYMOUS; |
| 393 } | 398 } |
| 394 | 399 |
| 395 void set_base_id(int id) { base_id_ = id; } | 400 void set_base_id(int id) { base_id_ = id; } |
| 396 static int num_ids() { return parent_num_ids() + 2; } | 401 static int num_ids() { return parent_num_ids() + 2; } |
| 397 BailoutId EntryId() const { return BailoutId(local_id(0)); } | 402 BailoutId EntryId() const { return BailoutId(local_id(0)); } |
| 398 BailoutId ExitId() const { return BailoutId(local_id(1)); } | 403 BailoutId ExitId() const { return BailoutId(local_id(1)); } |
| 399 | 404 |
| 405 private: |
| 406 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 407 |
| 408 BreakableType breakableType() const { |
| 409 return BreakableTypeField::decode(bit_field_); |
| 410 } |
| 411 |
| 412 int base_id_; |
| 413 Label break_target_; |
| 414 ZoneList<const AstRawString*>* labels_; |
| 415 |
| 416 class BreakableTypeField |
| 417 : public BitField<BreakableType, Statement::kNextBitFieldIndex, 1> {}; |
| 418 |
| 400 protected: | 419 protected: |
| 401 BreakableStatement(ZoneList<const AstRawString*>* labels, | 420 BreakableStatement(ZoneList<const AstRawString*>* labels, |
| 402 BreakableType breakable_type, int position, NodeType type) | 421 BreakableType breakable_type, int position, NodeType type) |
| 403 : Statement(position, type), | 422 : Statement(position, type), |
| 404 breakable_type_(breakable_type), | |
| 405 base_id_(BailoutId::None().ToInt()), | 423 base_id_(BailoutId::None().ToInt()), |
| 406 labels_(labels) { | 424 labels_(labels) { |
| 407 DCHECK(labels == NULL || labels->length() > 0); | 425 DCHECK(labels == NULL || labels->length() > 0); |
| 426 bit_field_ |= BreakableTypeField::encode(breakable_type); |
| 408 } | 427 } |
| 409 static int parent_num_ids() { return 0; } | 428 static int parent_num_ids() { return 0; } |
| 410 | 429 |
| 411 int base_id() const { | 430 int base_id() const { |
| 412 DCHECK(!BailoutId(base_id_).IsNone()); | 431 DCHECK(!BailoutId(base_id_).IsNone()); |
| 413 return base_id_; | 432 return base_id_; |
| 414 } | 433 } |
| 415 | 434 |
| 416 private: | 435 static const uint8_t kNextBitFieldIndex = BreakableTypeField::kNext; |
| 417 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | |
| 418 | |
| 419 BreakableType breakable_type_; | |
| 420 int base_id_; | |
| 421 Label break_target_; | |
| 422 ZoneList<const AstRawString*>* labels_; | |
| 423 }; | 436 }; |
| 424 | 437 |
| 425 | 438 |
| 426 class Block final : public BreakableStatement { | 439 class Block final : public BreakableStatement { |
| 427 public: | 440 public: |
| 428 ZoneList<Statement*>* statements() { return &statements_; } | 441 ZoneList<Statement*>* statements() { return &statements_; } |
| 429 bool ignore_completion_value() const { return ignore_completion_value_; } | 442 bool ignore_completion_value() const { |
| 443 return IgnoreCompletionField::decode(bit_field_); |
| 444 } |
| 430 | 445 |
| 431 static int num_ids() { return parent_num_ids() + 1; } | 446 static int num_ids() { return parent_num_ids() + 1; } |
| 432 BailoutId DeclsId() const { return BailoutId(local_id(0)); } | 447 BailoutId DeclsId() const { return BailoutId(local_id(0)); } |
| 433 | 448 |
| 434 bool IsJump() const { | 449 bool IsJump() const { |
| 435 return !statements_.is_empty() && statements_.last()->IsJump() | 450 return !statements_.is_empty() && statements_.last()->IsJump() |
| 436 && labels() == NULL; // Good enough as an approximation... | 451 && labels() == NULL; // Good enough as an approximation... |
| 437 } | 452 } |
| 438 | 453 |
| 439 Scope* scope() const { return scope_; } | 454 Scope* scope() const { return scope_; } |
| 440 void set_scope(Scope* scope) { scope_ = scope; } | 455 void set_scope(Scope* scope) { scope_ = scope; } |
| 441 | 456 |
| 442 private: | 457 private: |
| 443 friend class AstNodeFactory; | 458 friend class AstNodeFactory; |
| 444 | 459 |
| 445 Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, | 460 Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, |
| 446 bool ignore_completion_value, int pos) | 461 bool ignore_completion_value, int pos) |
| 447 : BreakableStatement(labels, TARGET_FOR_NAMED_ONLY, pos, kBlock), | 462 : BreakableStatement(labels, TARGET_FOR_NAMED_ONLY, pos, kBlock), |
| 448 statements_(capacity, zone), | 463 statements_(capacity, zone), |
| 449 ignore_completion_value_(ignore_completion_value), | 464 scope_(NULL) { |
| 450 scope_(NULL) {} | 465 bit_field_ |= IgnoreCompletionField::encode(ignore_completion_value); |
| 466 } |
| 451 static int parent_num_ids() { return BreakableStatement::num_ids(); } | 467 static int parent_num_ids() { return BreakableStatement::num_ids(); } |
| 452 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 468 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 453 | 469 |
| 454 ZoneList<Statement*> statements_; | 470 ZoneList<Statement*> statements_; |
| 455 bool ignore_completion_value_; | |
| 456 Scope* scope_; | 471 Scope* scope_; |
| 472 |
| 473 class IgnoreCompletionField |
| 474 : public BitField<bool, BreakableStatement::kNextBitFieldIndex, 1> {}; |
| 475 |
| 476 protected: |
| 477 static const uint8_t kNextBitFieldIndex = IgnoreCompletionField::kNext; |
| 457 }; | 478 }; |
| 458 | 479 |
| 459 | 480 |
| 460 class DoExpression final : public Expression { | 481 class DoExpression final : public Expression { |
| 461 public: | 482 public: |
| 462 Block* block() { return block_; } | 483 Block* block() { return block_; } |
| 463 void set_block(Block* b) { block_ = b; } | 484 void set_block(Block* b) { block_ = b; } |
| 464 VariableProxy* result() { return result_; } | 485 VariableProxy* result() { return result_; } |
| 465 void set_result(VariableProxy* v) { result_ = v; } | 486 void set_result(VariableProxy* v) { result_ = v; } |
| 466 FunctionLiteral* represented_function() { return represented_function_; } | 487 FunctionLiteral* represented_function() { return represented_function_; } |
| 467 void set_represented_function(FunctionLiteral* f) { | 488 void set_represented_function(FunctionLiteral* f) { |
| 468 represented_function_ = f; | 489 represented_function_ = f; |
| 469 } | 490 } |
| 470 bool IsAnonymousFunctionDefinition() const; | 491 bool IsAnonymousFunctionDefinition() const; |
| 471 | 492 |
| 493 protected: |
| 494 static const uint8_t kNextBitFieldIndex = Expression::kNextBitFieldIndex; |
| 495 |
| 472 private: | 496 private: |
| 473 friend class AstNodeFactory; | 497 friend class AstNodeFactory; |
| 474 | 498 |
| 475 DoExpression(Block* block, VariableProxy* result, int pos) | 499 DoExpression(Block* block, VariableProxy* result, int pos) |
| 476 : Expression(pos, kDoExpression), | 500 : Expression(pos, kDoExpression), |
| 477 block_(block), | 501 block_(block), |
| 478 result_(result), | 502 result_(result), |
| 479 represented_function_(nullptr) { | 503 represented_function_(nullptr) { |
| 480 DCHECK_NOT_NULL(block_); | 504 DCHECK_NOT_NULL(block_); |
| 481 DCHECK_NOT_NULL(result_); | 505 DCHECK_NOT_NULL(result_); |
| 482 } | 506 } |
| 483 static int parent_num_ids() { return Expression::num_ids(); } | 507 static int parent_num_ids() { return Expression::num_ids(); } |
| 484 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 508 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 485 | 509 |
| 486 Block* block_; | 510 Block* block_; |
| 487 VariableProxy* result_; | 511 VariableProxy* result_; |
| 488 FunctionLiteral* represented_function_; | 512 FunctionLiteral* represented_function_; |
| 489 }; | 513 }; |
| 490 | 514 |
| 491 | 515 |
| 492 class Declaration : public AstNode { | 516 class Declaration : public AstNode { |
| 493 public: | 517 public: |
| 494 VariableProxy* proxy() const { return proxy_; } | 518 VariableProxy* proxy() const { return proxy_; } |
| 495 Scope* scope() const { return scope_; } | 519 Scope* scope() const { return scope_; } |
| 496 | 520 |
| 497 protected: | 521 protected: |
| 498 Declaration(VariableProxy* proxy, Scope* scope, int pos, NodeType type) | 522 Declaration(VariableProxy* proxy, Scope* scope, int pos, NodeType type) |
| 499 : AstNode(pos, type), proxy_(proxy), scope_(scope) {} | 523 : AstNode(pos, type), proxy_(proxy), scope_(scope) {} |
| 500 | 524 |
| 525 static const uint8_t kNextBitFieldIndex = AstNode::kNextBitFieldIndex; |
| 526 |
| 501 private: | 527 private: |
| 502 VariableProxy* proxy_; | 528 VariableProxy* proxy_; |
| 503 | 529 |
| 504 // Nested scope from which the declaration originated. | 530 // Nested scope from which the declaration originated. |
| 505 Scope* scope_; | 531 Scope* scope_; |
| 506 }; | 532 }; |
| 507 | 533 |
| 508 | 534 |
| 509 class VariableDeclaration final : public Declaration { | 535 class VariableDeclaration final : public Declaration { |
| 510 private: | 536 private: |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 protected: | 580 protected: |
| 555 IterationStatement(ZoneList<const AstRawString*>* labels, int pos, | 581 IterationStatement(ZoneList<const AstRawString*>* labels, int pos, |
| 556 NodeType type) | 582 NodeType type) |
| 557 : BreakableStatement(labels, TARGET_FOR_ANONYMOUS, pos, type), | 583 : BreakableStatement(labels, TARGET_FOR_ANONYMOUS, pos, type), |
| 558 body_(NULL), | 584 body_(NULL), |
| 559 yield_count_(0), | 585 yield_count_(0), |
| 560 first_yield_id_(0) {} | 586 first_yield_id_(0) {} |
| 561 static int parent_num_ids() { return BreakableStatement::num_ids(); } | 587 static int parent_num_ids() { return BreakableStatement::num_ids(); } |
| 562 void Initialize(Statement* body) { body_ = body; } | 588 void Initialize(Statement* body) { body_ = body; } |
| 563 | 589 |
| 590 static const uint8_t kNextBitFieldIndex = |
| 591 BreakableStatement::kNextBitFieldIndex; |
| 592 |
| 564 private: | 593 private: |
| 565 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 594 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 566 | 595 |
| 567 Statement* body_; | 596 Statement* body_; |
| 568 Label continue_target_; | 597 Label continue_target_; |
| 569 int yield_count_; | 598 int yield_count_; |
| 570 int first_yield_id_; | 599 int first_yield_id_; |
| 571 }; | 600 }; |
| 572 | 601 |
| 573 | 602 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 // Type feedback information. | 737 // Type feedback information. |
| 709 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 738 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 710 FeedbackVectorSlotCache* cache); | 739 FeedbackVectorSlotCache* cache); |
| 711 FeedbackVectorSlot EachFeedbackSlot() const { return each_slot_; } | 740 FeedbackVectorSlot EachFeedbackSlot() const { return each_slot_; } |
| 712 FeedbackVectorSlot ForInFeedbackSlot() { | 741 FeedbackVectorSlot ForInFeedbackSlot() { |
| 713 DCHECK(!for_in_feedback_slot_.IsInvalid()); | 742 DCHECK(!for_in_feedback_slot_.IsInvalid()); |
| 714 return for_in_feedback_slot_; | 743 return for_in_feedback_slot_; |
| 715 } | 744 } |
| 716 | 745 |
| 717 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; | 746 enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; |
| 718 ForInType for_in_type() const { return for_in_type_; } | 747 ForInType for_in_type() const { return ForInTypeField::decode(bit_field_); } |
| 719 void set_for_in_type(ForInType type) { for_in_type_ = type; } | 748 void set_for_in_type(ForInType type) { |
| 749 bit_field_ = ForInTypeField::update(bit_field_, type); |
| 750 } |
| 720 | 751 |
| 721 static int num_ids() { return parent_num_ids() + 7; } | 752 static int num_ids() { return parent_num_ids() + 7; } |
| 722 BailoutId BodyId() const { return BailoutId(local_id(0)); } | 753 BailoutId BodyId() const { return BailoutId(local_id(0)); } |
| 723 BailoutId EnumId() const { return BailoutId(local_id(1)); } | 754 BailoutId EnumId() const { return BailoutId(local_id(1)); } |
| 724 BailoutId ToObjectId() const { return BailoutId(local_id(2)); } | 755 BailoutId ToObjectId() const { return BailoutId(local_id(2)); } |
| 725 BailoutId PrepareId() const { return BailoutId(local_id(3)); } | 756 BailoutId PrepareId() const { return BailoutId(local_id(3)); } |
| 726 BailoutId FilterId() const { return BailoutId(local_id(4)); } | 757 BailoutId FilterId() const { return BailoutId(local_id(4)); } |
| 727 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } | 758 BailoutId AssignmentId() const { return BailoutId(local_id(5)); } |
| 728 BailoutId IncrementId() const { return BailoutId(local_id(6)); } | 759 BailoutId IncrementId() const { return BailoutId(local_id(6)); } |
| 729 BailoutId ContinueId() const { return EntryId(); } | 760 BailoutId ContinueId() const { return EntryId(); } |
| 730 BailoutId StackCheckId() const { return BodyId(); } | 761 BailoutId StackCheckId() const { return BodyId(); } |
| 731 | 762 |
| 732 private: | 763 private: |
| 733 friend class AstNodeFactory; | 764 friend class AstNodeFactory; |
| 734 | 765 |
| 735 ForInStatement(ZoneList<const AstRawString*>* labels, int pos) | 766 ForInStatement(ZoneList<const AstRawString*>* labels, int pos) |
| 736 : ForEachStatement(labels, pos, kForInStatement), | 767 : ForEachStatement(labels, pos, kForInStatement), |
| 737 each_(nullptr), | 768 each_(nullptr), |
| 738 subject_(nullptr), | 769 subject_(nullptr) { |
| 739 for_in_type_(SLOW_FOR_IN) {} | 770 bit_field_ = ForInTypeField::update(bit_field_, SLOW_FOR_IN); |
| 771 } |
| 772 |
| 740 static int parent_num_ids() { return ForEachStatement::num_ids(); } | 773 static int parent_num_ids() { return ForEachStatement::num_ids(); } |
| 741 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 774 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 742 | 775 |
| 743 Expression* each_; | 776 Expression* each_; |
| 744 Expression* subject_; | 777 Expression* subject_; |
| 745 ForInType for_in_type_; | |
| 746 FeedbackVectorSlot each_slot_; | 778 FeedbackVectorSlot each_slot_; |
| 747 FeedbackVectorSlot for_in_feedback_slot_; | 779 FeedbackVectorSlot for_in_feedback_slot_; |
| 780 |
| 781 class ForInTypeField |
| 782 : public BitField<ForInType, ForEachStatement::kNextBitFieldIndex, 1> {}; |
| 783 |
| 784 protected: |
| 785 static const uint8_t kNextBitFieldIndex = ForInTypeField::kNext; |
| 748 }; | 786 }; |
| 749 | 787 |
| 750 | 788 |
| 751 class ForOfStatement final : public ForEachStatement { | 789 class ForOfStatement final : public ForEachStatement { |
| 752 public: | 790 public: |
| 753 void Initialize(Statement* body, Variable* iterator, | 791 void Initialize(Statement* body, Variable* iterator, |
| 754 Expression* assign_iterator, Expression* next_result, | 792 Expression* assign_iterator, Expression* next_result, |
| 755 Expression* result_done, Expression* assign_each) { | 793 Expression* result_done, Expression* assign_each) { |
| 756 ForEachStatement::Initialize(body); | 794 ForEachStatement::Initialize(body); |
| 757 iterator_ = iterator; | 795 iterator_ = iterator; |
| (...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1246 class MaterializedLiteral : public Expression { | 1284 class MaterializedLiteral : public Expression { |
| 1247 public: | 1285 public: |
| 1248 int literal_index() { return literal_index_; } | 1286 int literal_index() { return literal_index_; } |
| 1249 | 1287 |
| 1250 int depth() const { | 1288 int depth() const { |
| 1251 // only callable after initialization. | 1289 // only callable after initialization. |
| 1252 DCHECK(depth_ >= 1); | 1290 DCHECK(depth_ >= 1); |
| 1253 return depth_; | 1291 return depth_; |
| 1254 } | 1292 } |
| 1255 | 1293 |
| 1294 private: |
| 1295 int depth_ : 31; |
| 1296 int literal_index_; |
| 1297 |
| 1298 friend class AstLiteralReindexer; |
| 1299 |
| 1300 class IsSimpleField |
| 1301 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; |
| 1302 |
| 1256 protected: | 1303 protected: |
| 1257 MaterializedLiteral(int literal_index, int pos, NodeType type) | 1304 MaterializedLiteral(int literal_index, int pos, NodeType type) |
| 1258 : Expression(pos, type), | 1305 : Expression(pos, type), depth_(0), literal_index_(literal_index) { |
| 1259 is_simple_(false), | 1306 bit_field_ |= IsSimpleField::encode(false); |
| 1260 depth_(0), | 1307 } |
| 1261 literal_index_(literal_index) {} | |
| 1262 | 1308 |
| 1263 // A materialized literal is simple if the values consist of only | 1309 // A materialized literal is simple if the values consist of only |
| 1264 // constants and simple object and array literals. | 1310 // constants and simple object and array literals. |
| 1265 bool is_simple() const { return is_simple_; } | 1311 bool is_simple() const { return IsSimpleField::decode(bit_field_); } |
| 1266 void set_is_simple(bool is_simple) { is_simple_ = is_simple; } | 1312 void set_is_simple(bool is_simple) { |
| 1313 bit_field_ = IsSimpleField::update(bit_field_, is_simple); |
| 1314 } |
| 1267 friend class CompileTimeValue; | 1315 friend class CompileTimeValue; |
| 1268 | 1316 |
| 1269 void set_depth(int depth) { | 1317 void set_depth(int depth) { |
| 1270 DCHECK_LE(1, depth); | 1318 DCHECK_LE(1, depth); |
| 1271 depth_ = depth; | 1319 depth_ = depth; |
| 1272 } | 1320 } |
| 1273 | 1321 |
| 1274 // Populate the constant properties/elements fixed array. | 1322 // Populate the constant properties/elements fixed array. |
| 1275 void BuildConstants(Isolate* isolate); | 1323 void BuildConstants(Isolate* isolate); |
| 1276 friend class ArrayLiteral; | 1324 friend class ArrayLiteral; |
| 1277 friend class ObjectLiteral; | 1325 friend class ObjectLiteral; |
| 1278 | 1326 |
| 1279 // If the expression is a literal, return the literal value; | 1327 // If the expression is a literal, return the literal value; |
| 1280 // if the expression is a materialized literal and is simple return a | 1328 // if the expression is a materialized literal and is simple return a |
| 1281 // compile time value as encoded by CompileTimeValue::GetValue(). | 1329 // compile time value as encoded by CompileTimeValue::GetValue(). |
| 1282 // Otherwise, return undefined literal as the placeholder | 1330 // Otherwise, return undefined literal as the placeholder |
| 1283 // in the object literal boilerplate. | 1331 // in the object literal boilerplate. |
| 1284 Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate); | 1332 Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate); |
| 1285 | 1333 |
| 1286 private: | 1334 static const uint8_t kNextBitFieldIndex = IsSimpleField::kNext; |
| 1287 bool is_simple_ : 1; | |
| 1288 int depth_ : 31; | |
| 1289 int literal_index_; | |
| 1290 | |
| 1291 friend class AstLiteralReindexer; | |
| 1292 }; | 1335 }; |
| 1293 | 1336 |
| 1294 // Common supertype for ObjectLiteralProperty and ClassLiteralProperty | 1337 // Common supertype for ObjectLiteralProperty and ClassLiteralProperty |
| 1295 class LiteralProperty : public ZoneObject { | 1338 class LiteralProperty : public ZoneObject { |
| 1296 public: | 1339 public: |
| 1297 Expression* key() const { return key_; } | 1340 Expression* key() const { return key_; } |
| 1298 Expression* value() const { return value_; } | 1341 Expression* value() const { return value_; } |
| 1299 void set_key(Expression* e) { key_ = e; } | 1342 void set_key(Expression* e) { key_ = e; } |
| 1300 void set_value(Expression* e) { value_ = e; } | 1343 void set_value(Expression* e) { value_ = e; } |
| 1301 | 1344 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1368 // for minimizing the work when constructing it at runtime. | 1411 // for minimizing the work when constructing it at runtime. |
| 1369 class ObjectLiteral final : public MaterializedLiteral { | 1412 class ObjectLiteral final : public MaterializedLiteral { |
| 1370 public: | 1413 public: |
| 1371 typedef ObjectLiteralProperty Property; | 1414 typedef ObjectLiteralProperty Property; |
| 1372 | 1415 |
| 1373 Handle<FixedArray> constant_properties() const { | 1416 Handle<FixedArray> constant_properties() const { |
| 1374 return constant_properties_; | 1417 return constant_properties_; |
| 1375 } | 1418 } |
| 1376 int properties_count() const { return boilerplate_properties_; } | 1419 int properties_count() const { return boilerplate_properties_; } |
| 1377 ZoneList<Property*>* properties() const { return properties_; } | 1420 ZoneList<Property*>* properties() const { return properties_; } |
| 1378 bool fast_elements() const { return fast_elements_; } | 1421 bool fast_elements() const { return FastElementsField::decode(bit_field_); } |
| 1379 bool may_store_doubles() const { return may_store_doubles_; } | 1422 bool may_store_doubles() const { |
| 1380 bool has_elements() const { return has_elements_; } | 1423 return MayStoreDoublesField::decode(bit_field_); |
| 1424 } |
| 1425 bool has_elements() const { return HasElementsField::decode(bit_field_); } |
| 1381 bool has_shallow_properties() const { | 1426 bool has_shallow_properties() const { |
| 1382 return depth() == 1 && !has_elements() && !may_store_doubles(); | 1427 return depth() == 1 && !has_elements() && !may_store_doubles(); |
| 1383 } | 1428 } |
| 1384 | 1429 |
| 1385 // Decide if a property should be in the object boilerplate. | 1430 // Decide if a property should be in the object boilerplate. |
| 1386 static bool IsBoilerplateProperty(Property* property); | 1431 static bool IsBoilerplateProperty(Property* property); |
| 1387 | 1432 |
| 1388 // Populate the constant properties fixed array. | 1433 // Populate the constant properties fixed array. |
| 1389 void BuildConstantProperties(Isolate* isolate); | 1434 void BuildConstantProperties(Isolate* isolate); |
| 1390 | 1435 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1440 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1485 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 1441 FeedbackVectorSlotCache* cache); | 1486 FeedbackVectorSlotCache* cache); |
| 1442 | 1487 |
| 1443 private: | 1488 private: |
| 1444 friend class AstNodeFactory; | 1489 friend class AstNodeFactory; |
| 1445 | 1490 |
| 1446 ObjectLiteral(ZoneList<Property*>* properties, int literal_index, | 1491 ObjectLiteral(ZoneList<Property*>* properties, int literal_index, |
| 1447 uint32_t boilerplate_properties, int pos) | 1492 uint32_t boilerplate_properties, int pos) |
| 1448 : MaterializedLiteral(literal_index, pos, kObjectLiteral), | 1493 : MaterializedLiteral(literal_index, pos, kObjectLiteral), |
| 1449 boilerplate_properties_(boilerplate_properties), | 1494 boilerplate_properties_(boilerplate_properties), |
| 1450 fast_elements_(false), | 1495 properties_(properties) { |
| 1451 has_elements_(false), | 1496 bit_field_ |= FastElementsField::encode(false) | |
| 1452 may_store_doubles_(false), | 1497 HasElementsField::encode(false) | |
| 1453 properties_(properties) {} | 1498 MayStoreDoublesField::encode(false); |
| 1499 } |
| 1454 | 1500 |
| 1455 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } | 1501 static int parent_num_ids() { return MaterializedLiteral::num_ids(); } |
| 1456 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1502 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1457 | 1503 |
| 1458 uint32_t boilerplate_properties_ : 29; | 1504 uint32_t boilerplate_properties_; |
| 1459 bool fast_elements_ : 1; | |
| 1460 bool has_elements_ : 1; | |
| 1461 bool may_store_doubles_ : 1; | |
| 1462 FeedbackVectorSlot slot_; | 1505 FeedbackVectorSlot slot_; |
| 1463 Handle<FixedArray> constant_properties_; | 1506 Handle<FixedArray> constant_properties_; |
| 1464 ZoneList<Property*>* properties_; | 1507 ZoneList<Property*>* properties_; |
| 1508 |
| 1509 class FastElementsField |
| 1510 : public BitField<bool, MaterializedLiteral::kNextBitFieldIndex, 1> {}; |
| 1511 class HasElementsField : public BitField<bool, FastElementsField::kNext, 1> { |
| 1512 }; |
| 1513 class MayStoreDoublesField |
| 1514 : public BitField<bool, HasElementsField::kNext, 1> {}; |
| 1515 |
| 1516 protected: |
| 1517 static const uint8_t kNextBitFieldIndex = MayStoreDoublesField::kNext; |
| 1465 }; | 1518 }; |
| 1466 | 1519 |
| 1467 | 1520 |
| 1468 // A map from property names to getter/setter pairs allocated in the zone. | 1521 // A map from property names to getter/setter pairs allocated in the zone. |
| 1469 class AccessorTable | 1522 class AccessorTable |
| 1470 : public base::TemplateHashMap<Literal, ObjectLiteral::Accessors, | 1523 : public base::TemplateHashMap<Literal, ObjectLiteral::Accessors, |
| 1471 ZoneAllocationPolicy> { | 1524 ZoneAllocationPolicy> { |
| 1472 public: | 1525 public: |
| 1473 explicit AccessorTable(Zone* zone) | 1526 explicit AccessorTable(Zone* zone) |
| 1474 : base::TemplateHashMap<Literal, ObjectLiteral::Accessors, | 1527 : base::TemplateHashMap<Literal, ObjectLiteral::Accessors, |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1646 friend class AstNodeFactory; | 1699 friend class AstNodeFactory; |
| 1647 | 1700 |
| 1648 VariableProxy(Variable* var, int start_position, int end_position); | 1701 VariableProxy(Variable* var, int start_position, int end_position); |
| 1649 VariableProxy(const AstRawString* name, VariableKind variable_kind, | 1702 VariableProxy(const AstRawString* name, VariableKind variable_kind, |
| 1650 int start_position, int end_position); | 1703 int start_position, int end_position); |
| 1651 explicit VariableProxy(const VariableProxy* copy_from); | 1704 explicit VariableProxy(const VariableProxy* copy_from); |
| 1652 | 1705 |
| 1653 static int parent_num_ids() { return Expression::num_ids(); } | 1706 static int parent_num_ids() { return Expression::num_ids(); } |
| 1654 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1707 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1655 | 1708 |
| 1656 class IsThisField : public BitField8<bool, 0, 1> {}; | 1709 class IsThisField : public BitField<bool, Expression::kNextBitFieldIndex, 1> { |
| 1657 class IsAssignedField : public BitField8<bool, 1, 1> {}; | 1710 }; |
| 1658 class IsResolvedField : public BitField8<bool, 2, 1> {}; | 1711 class IsAssignedField : public BitField<bool, IsThisField::kNext, 1> {}; |
| 1659 class IsNewTargetField : public BitField8<bool, 3, 1> {}; | 1712 class IsResolvedField : public BitField<bool, IsAssignedField::kNext, 1> {}; |
| 1713 class IsNewTargetField : public BitField<bool, IsResolvedField::kNext, 1> {}; |
| 1660 | 1714 |
| 1661 uint8_t bit_field_; | |
| 1662 // Position is stored in the AstNode superclass, but VariableProxy needs to | 1715 // Position is stored in the AstNode superclass, but VariableProxy needs to |
| 1663 // know its end position too (for error messages). It cannot be inferred from | 1716 // know its end position too (for error messages). It cannot be inferred from |
| 1664 // the variable name length because it can contain escapes. | 1717 // the variable name length because it can contain escapes. |
| 1665 int end_position_; | 1718 int end_position_; |
| 1666 FeedbackVectorSlot variable_feedback_slot_; | 1719 FeedbackVectorSlot variable_feedback_slot_; |
| 1667 union { | 1720 union { |
| 1668 const AstRawString* raw_name_; // if !is_resolved_ | 1721 const AstRawString* raw_name_; // if !is_resolved_ |
| 1669 Variable* var_; // if is_resolved_ | 1722 Variable* var_; // if is_resolved_ |
| 1670 }; | 1723 }; |
| 1671 VariableProxy* next_unresolved_; | 1724 VariableProxy* next_unresolved_; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1748 bool super_access = property->IsSuperAccess(); | 1801 bool super_access = property->IsSuperAccess(); |
| 1749 return (property->key()->IsPropertyName()) | 1802 return (property->key()->IsPropertyName()) |
| 1750 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) | 1803 ? (super_access ? NAMED_SUPER_PROPERTY : NAMED_PROPERTY) |
| 1751 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY); | 1804 : (super_access ? KEYED_SUPER_PROPERTY : KEYED_PROPERTY); |
| 1752 } | 1805 } |
| 1753 | 1806 |
| 1754 private: | 1807 private: |
| 1755 friend class AstNodeFactory; | 1808 friend class AstNodeFactory; |
| 1756 | 1809 |
| 1757 Property(Expression* obj, Expression* key, int pos) | 1810 Property(Expression* obj, Expression* key, int pos) |
| 1758 : Expression(pos, kProperty), | 1811 : Expression(pos, kProperty), obj_(obj), key_(key) { |
| 1759 bit_field_(IsForCallField::encode(false) | | 1812 bit_field_ |= IsForCallField::encode(false) | |
| 1760 IsStringAccessField::encode(false) | | 1813 IsStringAccessField::encode(false) | |
| 1761 InlineCacheStateField::encode(UNINITIALIZED)), | 1814 InlineCacheStateField::encode(UNINITIALIZED); |
| 1762 obj_(obj), | 1815 } |
| 1763 key_(key) {} | |
| 1764 | 1816 |
| 1765 static int parent_num_ids() { return Expression::num_ids(); } | 1817 static int parent_num_ids() { return Expression::num_ids(); } |
| 1766 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1818 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1767 | 1819 |
| 1768 class IsForCallField : public BitField8<bool, 0, 1> {}; | 1820 class IsForCallField |
| 1769 class IsStringAccessField : public BitField8<bool, 1, 1> {}; | 1821 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; |
| 1770 class KeyTypeField : public BitField8<IcCheckType, 2, 1> {}; | 1822 class IsStringAccessField : public BitField<bool, IsForCallField::kNext, 1> { |
| 1771 class InlineCacheStateField : public BitField8<InlineCacheState, 3, 4> {}; | 1823 }; |
| 1824 class KeyTypeField |
| 1825 : public BitField<IcCheckType, IsStringAccessField::kNext, 1> {}; |
| 1826 class InlineCacheStateField |
| 1827 : public BitField<InlineCacheState, KeyTypeField::kNext, 4> {}; |
| 1772 | 1828 |
| 1773 uint8_t bit_field_; | |
| 1774 FeedbackVectorSlot property_feedback_slot_; | 1829 FeedbackVectorSlot property_feedback_slot_; |
| 1775 Expression* obj_; | 1830 Expression* obj_; |
| 1776 Expression* key_; | 1831 Expression* key_; |
| 1777 SmallMapList receiver_types_; | 1832 SmallMapList receiver_types_; |
| 1778 }; | 1833 }; |
| 1779 | 1834 |
| 1780 | 1835 |
| 1781 class Call final : public Expression { | 1836 class Call final : public Expression { |
| 1782 public: | 1837 public: |
| 1783 Expression* expression() const { return expression_; } | 1838 Expression* expression() const { return expression_; } |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1869 // Used to assert that the FullCodeGenerator records the return site. | 1924 // Used to assert that the FullCodeGenerator records the return site. |
| 1870 bool return_is_recorded_; | 1925 bool return_is_recorded_; |
| 1871 #endif | 1926 #endif |
| 1872 | 1927 |
| 1873 private: | 1928 private: |
| 1874 friend class AstNodeFactory; | 1929 friend class AstNodeFactory; |
| 1875 | 1930 |
| 1876 Call(Expression* expression, ZoneList<Expression*>* arguments, int pos, | 1931 Call(Expression* expression, ZoneList<Expression*>* arguments, int pos, |
| 1877 PossiblyEval possibly_eval) | 1932 PossiblyEval possibly_eval) |
| 1878 : Expression(pos, kCall), | 1933 : Expression(pos, kCall), |
| 1879 bit_field_( | |
| 1880 IsUninitializedField::encode(false) | | |
| 1881 IsPossiblyEvalField::encode(possibly_eval == IS_POSSIBLY_EVAL)), | |
| 1882 expression_(expression), | 1934 expression_(expression), |
| 1883 arguments_(arguments) { | 1935 arguments_(arguments) { |
| 1936 bit_field_ |= |
| 1937 IsUninitializedField::encode(false) | |
| 1938 IsPossiblyEvalField::encode(possibly_eval == IS_POSSIBLY_EVAL); |
| 1939 |
| 1884 if (expression->IsProperty()) { | 1940 if (expression->IsProperty()) { |
| 1885 expression->AsProperty()->mark_for_call(); | 1941 expression->AsProperty()->mark_for_call(); |
| 1886 } | 1942 } |
| 1887 } | 1943 } |
| 1888 | 1944 |
| 1889 static int parent_num_ids() { return Expression::num_ids(); } | 1945 static int parent_num_ids() { return Expression::num_ids(); } |
| 1890 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 1946 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1891 | 1947 |
| 1892 class IsUninitializedField : public BitField8<bool, 0, 1> {}; | 1948 class IsUninitializedField |
| 1893 class IsTailField : public BitField8<bool, 1, 1> {}; | 1949 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; |
| 1894 class IsPossiblyEvalField : public BitField8<bool, 2, 1> {}; | 1950 class IsTailField : public BitField<bool, IsUninitializedField::kNext, 1> {}; |
| 1951 class IsPossiblyEvalField : public BitField<bool, IsTailField::kNext, 1> {}; |
| 1895 | 1952 |
| 1896 uint8_t bit_field_; | |
| 1897 FeedbackVectorSlot ic_slot_; | 1953 FeedbackVectorSlot ic_slot_; |
| 1898 FeedbackVectorSlot stub_slot_; | 1954 FeedbackVectorSlot stub_slot_; |
| 1899 Expression* expression_; | 1955 Expression* expression_; |
| 1900 ZoneList<Expression*>* arguments_; | 1956 ZoneList<Expression*>* arguments_; |
| 1901 Handle<JSFunction> target_; | 1957 Handle<JSFunction> target_; |
| 1902 Handle<AllocationSite> allocation_site_; | 1958 Handle<AllocationSite> allocation_site_; |
| 1903 }; | 1959 }; |
| 1904 | 1960 |
| 1905 | 1961 |
| 1906 class CallNew final : public Expression { | 1962 class CallNew final : public Expression { |
| 1907 public: | 1963 public: |
| 1908 Expression* expression() const { return expression_; } | 1964 Expression* expression() const { return expression_; } |
| 1909 ZoneList<Expression*>* arguments() const { return arguments_; } | 1965 ZoneList<Expression*>* arguments() const { return arguments_; } |
| 1910 | 1966 |
| 1911 void set_expression(Expression* e) { expression_ = e; } | 1967 void set_expression(Expression* e) { expression_ = e; } |
| 1912 | 1968 |
| 1913 // Type feedback information. | 1969 // Type feedback information. |
| 1914 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 1970 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 1915 FeedbackVectorSlotCache* cache) { | 1971 FeedbackVectorSlotCache* cache) { |
| 1916 // CallNew stores feedback in the exact same way as Call. We can | 1972 // CallNew stores feedback in the exact same way as Call. We can |
| 1917 // piggyback on the type feedback infrastructure for calls. | 1973 // piggyback on the type feedback infrastructure for calls. |
| 1918 callnew_feedback_slot_ = spec->AddCallICSlot(); | 1974 callnew_feedback_slot_ = spec->AddCallICSlot(); |
| 1919 } | 1975 } |
| 1920 | 1976 |
| 1921 FeedbackVectorSlot CallNewFeedbackSlot() { | 1977 FeedbackVectorSlot CallNewFeedbackSlot() { |
| 1922 DCHECK(!callnew_feedback_slot_.IsInvalid()); | 1978 DCHECK(!callnew_feedback_slot_.IsInvalid()); |
| 1923 return callnew_feedback_slot_; | 1979 return callnew_feedback_slot_; |
| 1924 } | 1980 } |
| 1925 | 1981 |
| 1926 bool IsMonomorphic() const { return is_monomorphic_; } | 1982 bool IsMonomorphic() const { return IsMonomorphicField::decode(bit_field_); } |
| 1927 Handle<JSFunction> target() const { return target_; } | 1983 Handle<JSFunction> target() const { return target_; } |
| 1928 Handle<AllocationSite> allocation_site() const { | 1984 Handle<AllocationSite> allocation_site() const { |
| 1929 return allocation_site_; | 1985 return allocation_site_; |
| 1930 } | 1986 } |
| 1931 | 1987 |
| 1932 static int num_ids() { return parent_num_ids() + 1; } | 1988 static int num_ids() { return parent_num_ids() + 1; } |
| 1933 static int feedback_slots() { return 1; } | 1989 static int feedback_slots() { return 1; } |
| 1934 BailoutId ReturnId() const { return BailoutId(local_id(0)); } | 1990 BailoutId ReturnId() const { return BailoutId(local_id(0)); } |
| 1935 | 1991 |
| 1936 void set_allocation_site(Handle<AllocationSite> site) { | 1992 void set_allocation_site(Handle<AllocationSite> site) { |
| 1937 allocation_site_ = site; | 1993 allocation_site_ = site; |
| 1938 } | 1994 } |
| 1939 void set_is_monomorphic(bool monomorphic) { is_monomorphic_ = monomorphic; } | 1995 void set_is_monomorphic(bool monomorphic) { |
| 1996 bit_field_ = IsMonomorphicField::update(bit_field_, monomorphic); |
| 1997 } |
| 1940 void set_target(Handle<JSFunction> target) { target_ = target; } | 1998 void set_target(Handle<JSFunction> target) { target_ = target; } |
| 1941 void SetKnownGlobalTarget(Handle<JSFunction> target) { | 1999 void SetKnownGlobalTarget(Handle<JSFunction> target) { |
| 1942 target_ = target; | 2000 target_ = target; |
| 1943 is_monomorphic_ = true; | 2001 set_is_monomorphic(true); |
| 1944 } | 2002 } |
| 1945 | 2003 |
| 1946 private: | 2004 private: |
| 1947 friend class AstNodeFactory; | 2005 friend class AstNodeFactory; |
| 1948 | 2006 |
| 1949 CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos) | 2007 CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos) |
| 1950 : Expression(pos, kCallNew), | 2008 : Expression(pos, kCallNew), |
| 1951 is_monomorphic_(false), | |
| 1952 expression_(expression), | 2009 expression_(expression), |
| 1953 arguments_(arguments) {} | 2010 arguments_(arguments) { |
| 2011 bit_field_ |= IsMonomorphicField::encode(false); |
| 2012 } |
| 1954 | 2013 |
| 1955 static int parent_num_ids() { return Expression::num_ids(); } | 2014 static int parent_num_ids() { return Expression::num_ids(); } |
| 1956 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2015 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 1957 | 2016 |
| 1958 bool is_monomorphic_; | |
| 1959 FeedbackVectorSlot callnew_feedback_slot_; | 2017 FeedbackVectorSlot callnew_feedback_slot_; |
| 1960 Expression* expression_; | 2018 Expression* expression_; |
| 1961 ZoneList<Expression*>* arguments_; | 2019 ZoneList<Expression*>* arguments_; |
| 1962 Handle<JSFunction> target_; | 2020 Handle<JSFunction> target_; |
| 1963 Handle<AllocationSite> allocation_site_; | 2021 Handle<AllocationSite> allocation_site_; |
| 2022 |
| 2023 class IsMonomorphicField |
| 2024 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; |
| 1964 }; | 2025 }; |
| 1965 | 2026 |
| 1966 | 2027 |
| 1967 // The CallRuntime class does not represent any official JavaScript | 2028 // The CallRuntime class does not represent any official JavaScript |
| 1968 // language construct. Instead it is used to call a C or JS function | 2029 // language construct. Instead it is used to call a C or JS function |
| 1969 // with a set of arguments. This is used from the builtins that are | 2030 // with a set of arguments. This is used from the builtins that are |
| 1970 // implemented in JavaScript (see "v8natives.js"). | 2031 // implemented in JavaScript (see "v8natives.js"). |
| 1971 class CallRuntime final : public Expression { | 2032 class CallRuntime final : public Expression { |
| 1972 public: | 2033 public: |
| 1973 ZoneList<Expression*>* arguments() const { return arguments_; } | 2034 ZoneList<Expression*>* arguments() const { return arguments_; } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2011 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2072 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2012 | 2073 |
| 2013 int context_index_; | 2074 int context_index_; |
| 2014 const Runtime::Function* function_; | 2075 const Runtime::Function* function_; |
| 2015 ZoneList<Expression*>* arguments_; | 2076 ZoneList<Expression*>* arguments_; |
| 2016 }; | 2077 }; |
| 2017 | 2078 |
| 2018 | 2079 |
| 2019 class UnaryOperation final : public Expression { | 2080 class UnaryOperation final : public Expression { |
| 2020 public: | 2081 public: |
| 2021 Token::Value op() const { return op_; } | 2082 Token::Value op() const { return OperatorField::decode(bit_field_); } |
| 2022 Expression* expression() const { return expression_; } | 2083 Expression* expression() const { return expression_; } |
| 2023 void set_expression(Expression* e) { expression_ = e; } | 2084 void set_expression(Expression* e) { expression_ = e; } |
| 2024 | 2085 |
| 2025 // For unary not (Token::NOT), the AST ids where true and false will | 2086 // For unary not (Token::NOT), the AST ids where true and false will |
| 2026 // actually be materialized, respectively. | 2087 // actually be materialized, respectively. |
| 2027 static int num_ids() { return parent_num_ids() + 2; } | 2088 static int num_ids() { return parent_num_ids() + 2; } |
| 2028 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); } | 2089 BailoutId MaterializeTrueId() const { return BailoutId(local_id(0)); } |
| 2029 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); } | 2090 BailoutId MaterializeFalseId() const { return BailoutId(local_id(1)); } |
| 2030 | 2091 |
| 2031 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); | 2092 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
| 2032 | 2093 |
| 2033 private: | 2094 private: |
| 2034 friend class AstNodeFactory; | 2095 friend class AstNodeFactory; |
| 2035 | 2096 |
| 2036 UnaryOperation(Token::Value op, Expression* expression, int pos) | 2097 UnaryOperation(Token::Value op, Expression* expression, int pos) |
| 2037 : Expression(pos, kUnaryOperation), op_(op), expression_(expression) { | 2098 : Expression(pos, kUnaryOperation), expression_(expression) { |
| 2099 bit_field_ |= OperatorField::encode(op); |
| 2038 DCHECK(Token::IsUnaryOp(op)); | 2100 DCHECK(Token::IsUnaryOp(op)); |
| 2039 } | 2101 } |
| 2040 | 2102 |
| 2041 static int parent_num_ids() { return Expression::num_ids(); } | 2103 static int parent_num_ids() { return Expression::num_ids(); } |
| 2042 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2104 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2043 | 2105 |
| 2044 Token::Value op_; | |
| 2045 Expression* expression_; | 2106 Expression* expression_; |
| 2107 |
| 2108 class OperatorField |
| 2109 : public BitField<Token::Value, Expression::kNextBitFieldIndex, 7> {}; |
| 2046 }; | 2110 }; |
| 2047 | 2111 |
| 2048 | 2112 |
| 2049 class BinaryOperation final : public Expression { | 2113 class BinaryOperation final : public Expression { |
| 2050 public: | 2114 public: |
| 2051 Token::Value op() const { return static_cast<Token::Value>(op_); } | 2115 Token::Value op() const { return OperatorField::decode(bit_field_); } |
| 2052 Expression* left() const { return left_; } | 2116 Expression* left() const { return left_; } |
| 2053 void set_left(Expression* e) { left_ = e; } | 2117 void set_left(Expression* e) { left_ = e; } |
| 2054 Expression* right() const { return right_; } | 2118 Expression* right() const { return right_; } |
| 2055 void set_right(Expression* e) { right_ = e; } | 2119 void set_right(Expression* e) { right_ = e; } |
| 2056 Handle<AllocationSite> allocation_site() const { return allocation_site_; } | 2120 Handle<AllocationSite> allocation_site() const { return allocation_site_; } |
| 2057 void set_allocation_site(Handle<AllocationSite> allocation_site) { | 2121 void set_allocation_site(Handle<AllocationSite> allocation_site) { |
| 2058 allocation_site_ = allocation_site; | 2122 allocation_site_ = allocation_site; |
| 2059 } | 2123 } |
| 2060 | 2124 |
| 2061 void MarkTail() { | 2125 void MarkTail() { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2095 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); | 2159 if (arg.IsJust()) fixed_right_arg_value_ = arg.FromJust(); |
| 2096 } | 2160 } |
| 2097 | 2161 |
| 2098 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); | 2162 void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); |
| 2099 | 2163 |
| 2100 private: | 2164 private: |
| 2101 friend class AstNodeFactory; | 2165 friend class AstNodeFactory; |
| 2102 | 2166 |
| 2103 BinaryOperation(Token::Value op, Expression* left, Expression* right, int pos) | 2167 BinaryOperation(Token::Value op, Expression* left, Expression* right, int pos) |
| 2104 : Expression(pos, kBinaryOperation), | 2168 : Expression(pos, kBinaryOperation), |
| 2105 op_(static_cast<byte>(op)), | |
| 2106 has_fixed_right_arg_(false), | 2169 has_fixed_right_arg_(false), |
| 2107 fixed_right_arg_value_(0), | 2170 fixed_right_arg_value_(0), |
| 2108 left_(left), | 2171 left_(left), |
| 2109 right_(right) { | 2172 right_(right) { |
| 2173 bit_field_ |= OperatorField::encode(op); |
| 2110 DCHECK(Token::IsBinaryOp(op)); | 2174 DCHECK(Token::IsBinaryOp(op)); |
| 2111 } | 2175 } |
| 2112 | 2176 |
| 2113 static int parent_num_ids() { return Expression::num_ids(); } | 2177 static int parent_num_ids() { return Expression::num_ids(); } |
| 2114 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2178 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2115 | 2179 |
| 2116 const byte op_; // actually Token::Value | |
| 2117 // TODO(rossberg): the fixed arg should probably be represented as a Constant | 2180 // TODO(rossberg): the fixed arg should probably be represented as a Constant |
| 2118 // type for the RHS. Currenty it's actually a Maybe<int> | 2181 // type for the RHS. Currenty it's actually a Maybe<int> |
| 2119 bool has_fixed_right_arg_; | 2182 bool has_fixed_right_arg_; |
| 2120 int fixed_right_arg_value_; | 2183 int fixed_right_arg_value_; |
| 2121 Expression* left_; | 2184 Expression* left_; |
| 2122 Expression* right_; | 2185 Expression* right_; |
| 2123 Handle<AllocationSite> allocation_site_; | 2186 Handle<AllocationSite> allocation_site_; |
| 2124 FeedbackVectorSlot type_feedback_slot_; | 2187 FeedbackVectorSlot type_feedback_slot_; |
| 2188 |
| 2189 class OperatorField |
| 2190 : public BitField<Token::Value, Expression::kNextBitFieldIndex, 7> {}; |
| 2125 }; | 2191 }; |
| 2126 | 2192 |
| 2127 | 2193 |
| 2128 class CountOperation final : public Expression { | 2194 class CountOperation final : public Expression { |
| 2129 public: | 2195 public: |
| 2130 bool is_prefix() const { return IsPrefixField::decode(bit_field_); } | 2196 bool is_prefix() const { return IsPrefixField::decode(bit_field_); } |
| 2131 bool is_postfix() const { return !is_prefix(); } | 2197 bool is_postfix() const { return !is_prefix(); } |
| 2132 | 2198 |
| 2133 Token::Value op() const { return TokenField::decode(bit_field_); } | 2199 Token::Value op() const { return TokenField::decode(bit_field_); } |
| 2134 Token::Value binary_op() { | 2200 Token::Value binary_op() { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2169 } | 2235 } |
| 2170 | 2236 |
| 2171 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, | 2237 void AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, |
| 2172 FeedbackVectorSlotCache* cache); | 2238 FeedbackVectorSlotCache* cache); |
| 2173 FeedbackVectorSlot CountSlot() const { return slot_; } | 2239 FeedbackVectorSlot CountSlot() const { return slot_; } |
| 2174 | 2240 |
| 2175 private: | 2241 private: |
| 2176 friend class AstNodeFactory; | 2242 friend class AstNodeFactory; |
| 2177 | 2243 |
| 2178 CountOperation(Token::Value op, bool is_prefix, Expression* expr, int pos) | 2244 CountOperation(Token::Value op, bool is_prefix, Expression* expr, int pos) |
| 2179 : Expression(pos, kCountOperation), | 2245 : Expression(pos, kCountOperation), type_(NULL), expression_(expr) { |
| 2180 bit_field_( | 2246 bit_field_ |= |
| 2181 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | | 2247 IsPrefixField::encode(is_prefix) | KeyTypeField::encode(ELEMENT) | |
| 2182 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), | 2248 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op); |
| 2183 type_(NULL), | 2249 } |
| 2184 expression_(expr) {} | |
| 2185 | 2250 |
| 2186 static int parent_num_ids() { return Expression::num_ids(); } | 2251 static int parent_num_ids() { return Expression::num_ids(); } |
| 2187 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2252 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2188 | 2253 |
| 2189 class IsPrefixField : public BitField16<bool, 0, 1> {}; | 2254 class IsPrefixField |
| 2190 class KeyTypeField : public BitField16<IcCheckType, 1, 1> {}; | 2255 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; |
| 2191 class StoreModeField : public BitField16<KeyedAccessStoreMode, 2, 3> {}; | 2256 class KeyTypeField : public BitField<IcCheckType, IsPrefixField::kNext, 1> {}; |
| 2192 class TokenField : public BitField16<Token::Value, 5, 8> {}; | 2257 class StoreModeField |
| 2258 : public BitField<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {}; |
| 2259 class TokenField : public BitField<Token::Value, StoreModeField::kNext, 7> {}; |
| 2193 | 2260 |
| 2194 // Starts with 16-bit field, which should get packed together with | |
| 2195 // Expression's trailing 16-bit field. | |
| 2196 uint16_t bit_field_; | |
| 2197 FeedbackVectorSlot slot_; | 2261 FeedbackVectorSlot slot_; |
| 2198 FeedbackVectorSlot binary_operation_slot_; | 2262 FeedbackVectorSlot binary_operation_slot_; |
| 2199 AstType* type_; | 2263 AstType* type_; |
| 2200 Expression* expression_; | 2264 Expression* expression_; |
| 2201 SmallMapList receiver_types_; | 2265 SmallMapList receiver_types_; |
| 2202 }; | 2266 }; |
| 2203 | 2267 |
| 2204 | 2268 |
| 2205 class CompareOperation final : public Expression { | 2269 class CompareOperation final : public Expression { |
| 2206 public: | 2270 public: |
| 2207 Token::Value op() const { return op_; } | 2271 Token::Value op() const { return OperatorField::decode(bit_field_); } |
| 2208 Expression* left() const { return left_; } | 2272 Expression* left() const { return left_; } |
| 2209 Expression* right() const { return right_; } | 2273 Expression* right() const { return right_; } |
| 2210 | 2274 |
| 2211 void set_left(Expression* e) { left_ = e; } | 2275 void set_left(Expression* e) { left_ = e; } |
| 2212 void set_right(Expression* e) { right_ = e; } | 2276 void set_right(Expression* e) { right_ = e; } |
| 2213 | 2277 |
| 2214 // Type feedback information. | 2278 // Type feedback information. |
| 2215 static int num_ids() { return parent_num_ids() + 1; } | 2279 static int num_ids() { return parent_num_ids() + 1; } |
| 2216 TypeFeedbackId CompareOperationFeedbackId() const { | 2280 TypeFeedbackId CompareOperationFeedbackId() const { |
| 2217 return TypeFeedbackId(local_id(0)); | 2281 return TypeFeedbackId(local_id(0)); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2233 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); | 2297 bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); |
| 2234 bool IsLiteralCompareUndefined(Expression** expr); | 2298 bool IsLiteralCompareUndefined(Expression** expr); |
| 2235 bool IsLiteralCompareNull(Expression** expr); | 2299 bool IsLiteralCompareNull(Expression** expr); |
| 2236 | 2300 |
| 2237 private: | 2301 private: |
| 2238 friend class AstNodeFactory; | 2302 friend class AstNodeFactory; |
| 2239 | 2303 |
| 2240 CompareOperation(Token::Value op, Expression* left, Expression* right, | 2304 CompareOperation(Token::Value op, Expression* left, Expression* right, |
| 2241 int pos) | 2305 int pos) |
| 2242 : Expression(pos, kCompareOperation), | 2306 : Expression(pos, kCompareOperation), |
| 2243 op_(op), | |
| 2244 left_(left), | 2307 left_(left), |
| 2245 right_(right), | 2308 right_(right), |
| 2246 combined_type_(AstType::None()) { | 2309 combined_type_(AstType::None()) { |
| 2310 bit_field_ |= OperatorField::encode(op); |
| 2247 DCHECK(Token::IsCompareOp(op)); | 2311 DCHECK(Token::IsCompareOp(op)); |
| 2248 } | 2312 } |
| 2249 | 2313 |
| 2250 static int parent_num_ids() { return Expression::num_ids(); } | 2314 static int parent_num_ids() { return Expression::num_ids(); } |
| 2251 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2315 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2252 | 2316 |
| 2253 Token::Value op_; | |
| 2254 Expression* left_; | 2317 Expression* left_; |
| 2255 Expression* right_; | 2318 Expression* right_; |
| 2256 | 2319 |
| 2257 AstType* combined_type_; | 2320 AstType* combined_type_; |
| 2258 FeedbackVectorSlot type_feedback_slot_; | 2321 FeedbackVectorSlot type_feedback_slot_; |
| 2322 class OperatorField |
| 2323 : public BitField<Token::Value, Expression::kNextBitFieldIndex, 7> {}; |
| 2259 }; | 2324 }; |
| 2260 | 2325 |
| 2261 | 2326 |
| 2262 class Spread final : public Expression { | 2327 class Spread final : public Expression { |
| 2263 public: | 2328 public: |
| 2264 Expression* expression() const { return expression_; } | 2329 Expression* expression() const { return expression_; } |
| 2265 void set_expression(Expression* e) { expression_ = e; } | 2330 void set_expression(Expression* e) { expression_ = e; } |
| 2266 | 2331 |
| 2267 int expression_position() const { return expr_pos_; } | 2332 int expression_position() const { return expr_pos_; } |
| 2268 | 2333 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2372 FeedbackVectorSlot AssignmentSlot() const { return slot_; } | 2437 FeedbackVectorSlot AssignmentSlot() const { return slot_; } |
| 2373 | 2438 |
| 2374 private: | 2439 private: |
| 2375 friend class AstNodeFactory; | 2440 friend class AstNodeFactory; |
| 2376 | 2441 |
| 2377 Assignment(Token::Value op, Expression* target, Expression* value, int pos); | 2442 Assignment(Token::Value op, Expression* target, Expression* value, int pos); |
| 2378 | 2443 |
| 2379 static int parent_num_ids() { return Expression::num_ids(); } | 2444 static int parent_num_ids() { return Expression::num_ids(); } |
| 2380 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2445 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2381 | 2446 |
| 2382 class IsUninitializedField : public BitField16<bool, 0, 1> {}; | 2447 class IsUninitializedField |
| 2448 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; |
| 2383 class KeyTypeField | 2449 class KeyTypeField |
| 2384 : public BitField16<IcCheckType, IsUninitializedField::kNext, 1> {}; | 2450 : public BitField<IcCheckType, IsUninitializedField::kNext, 1> {}; |
| 2385 class StoreModeField | 2451 class StoreModeField |
| 2386 : public BitField16<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {}; | 2452 : public BitField<KeyedAccessStoreMode, KeyTypeField::kNext, 3> {}; |
| 2387 class TokenField : public BitField16<Token::Value, StoreModeField::kNext, 8> { | 2453 class TokenField : public BitField<Token::Value, StoreModeField::kNext, 7> {}; |
| 2388 }; | |
| 2389 | 2454 |
| 2390 // Starts with 16-bit field, which should get packed together with | |
| 2391 // Expression's trailing 16-bit field. | |
| 2392 uint16_t bit_field_; | |
| 2393 FeedbackVectorSlot slot_; | 2455 FeedbackVectorSlot slot_; |
| 2394 Expression* target_; | 2456 Expression* target_; |
| 2395 Expression* value_; | 2457 Expression* value_; |
| 2396 BinaryOperation* binary_operation_; | 2458 BinaryOperation* binary_operation_; |
| 2397 SmallMapList receiver_types_; | 2459 SmallMapList receiver_types_; |
| 2398 }; | 2460 }; |
| 2399 | 2461 |
| 2400 | 2462 |
| 2401 // The RewritableExpression class is a wrapper for AST nodes that wait | 2463 // The RewritableExpression class is a wrapper for AST nodes that wait |
| 2402 // for some potential rewriting. However, even if such nodes are indeed | 2464 // for some potential rewriting. However, even if such nodes are indeed |
| 2403 // rewritten, the RewritableExpression wrapper nodes will survive in the | 2465 // rewritten, the RewritableExpression wrapper nodes will survive in the |
| 2404 // final AST and should be just ignored, i.e., they should be treated as | 2466 // final AST and should be just ignored, i.e., they should be treated as |
| 2405 // equivalent to the wrapped nodes. For this reason and to simplify later | 2467 // equivalent to the wrapped nodes. For this reason and to simplify later |
| 2406 // phases, RewritableExpressions are considered as exceptions of AST nodes | 2468 // phases, RewritableExpressions are considered as exceptions of AST nodes |
| 2407 // in the following sense: | 2469 // in the following sense: |
| 2408 // | 2470 // |
| 2409 // 1. IsRewritableExpression and AsRewritableExpression behave as usual. | 2471 // 1. IsRewritableExpression and AsRewritableExpression behave as usual. |
| 2410 // 2. All other Is* and As* methods are practically delegated to the | 2472 // 2. All other Is* and As* methods are practically delegated to the |
| 2411 // wrapped node, i.e. IsArrayLiteral() will return true iff the | 2473 // wrapped node, i.e. IsArrayLiteral() will return true iff the |
| 2412 // wrapped node is an array literal. | 2474 // wrapped node is an array literal. |
| 2413 // | 2475 // |
| 2414 // Furthermore, an invariant that should be respected is that the wrapped | 2476 // Furthermore, an invariant that should be respected is that the wrapped |
| 2415 // node is not a RewritableExpression. | 2477 // node is not a RewritableExpression. |
| 2416 class RewritableExpression final : public Expression { | 2478 class RewritableExpression final : public Expression { |
| 2417 public: | 2479 public: |
| 2418 Expression* expression() const { return expr_; } | 2480 Expression* expression() const { return expr_; } |
| 2419 bool is_rewritten() const { return is_rewritten_; } | 2481 bool is_rewritten() const { return IsRewrittenField::decode(bit_field_); } |
| 2420 | 2482 |
| 2421 void Rewrite(Expression* new_expression) { | 2483 void Rewrite(Expression* new_expression) { |
| 2422 DCHECK(!is_rewritten()); | 2484 DCHECK(!is_rewritten()); |
| 2423 DCHECK_NOT_NULL(new_expression); | 2485 DCHECK_NOT_NULL(new_expression); |
| 2424 DCHECK(!new_expression->IsRewritableExpression()); | 2486 DCHECK(!new_expression->IsRewritableExpression()); |
| 2425 expr_ = new_expression; | 2487 expr_ = new_expression; |
| 2426 is_rewritten_ = true; | 2488 bit_field_ = IsRewrittenField::update(bit_field_, true); |
| 2427 } | 2489 } |
| 2428 | 2490 |
| 2429 static int num_ids() { return parent_num_ids(); } | 2491 static int num_ids() { return parent_num_ids(); } |
| 2430 | 2492 |
| 2431 private: | 2493 private: |
| 2432 friend class AstNodeFactory; | 2494 friend class AstNodeFactory; |
| 2433 | 2495 |
| 2434 explicit RewritableExpression(Expression* expression) | 2496 explicit RewritableExpression(Expression* expression) |
| 2435 : Expression(expression->position(), kRewritableExpression), | 2497 : Expression(expression->position(), kRewritableExpression), |
| 2436 is_rewritten_(false), | |
| 2437 expr_(expression) { | 2498 expr_(expression) { |
| 2499 bit_field_ |= IsRewrittenField::encode(false); |
| 2438 DCHECK(!expression->IsRewritableExpression()); | 2500 DCHECK(!expression->IsRewritableExpression()); |
| 2439 } | 2501 } |
| 2440 | 2502 |
| 2441 int local_id(int n) const { return base_id() + parent_num_ids() + n; } | 2503 int local_id(int n) const { return base_id() + parent_num_ids() + n; } |
| 2442 | 2504 |
| 2443 bool is_rewritten_; | |
| 2444 Expression* expr_; | 2505 Expression* expr_; |
| 2506 |
| 2507 class IsRewrittenField |
| 2508 : public BitField<bool, Expression::kNextBitFieldIndex, 1> {}; |
| 2445 }; | 2509 }; |
| 2446 | 2510 |
| 2447 // Our Yield is different from the JS yield in that it "returns" its argument as | 2511 // Our Yield is different from the JS yield in that it "returns" its argument as |
| 2448 // is, without wrapping it in an iterator result object. Such wrapping, if | 2512 // is, without wrapping it in an iterator result object. Such wrapping, if |
| 2449 // desired, must be done beforehand (see the parser). | 2513 // desired, must be done beforehand (see the parser). |
| 2450 class Yield final : public Expression { | 2514 class Yield final : public Expression { |
| 2451 public: | 2515 public: |
| 2452 enum OnException { kOnExceptionThrow, kOnExceptionRethrow }; | 2516 enum OnException { kOnExceptionThrow, kOnExceptionRethrow }; |
| 2453 | 2517 |
| 2454 Expression* generator_object() const { return generator_object_; } | 2518 Expression* generator_object() const { return generator_object_; } |
| 2455 Expression* expression() const { return expression_; } | 2519 Expression* expression() const { return expression_; } |
| 2520 OnException on_exception() const { |
| 2521 return OnExceptionField::decode(bit_field_); |
| 2522 } |
| 2456 bool rethrow_on_exception() const { | 2523 bool rethrow_on_exception() const { |
| 2457 return on_exception_ == kOnExceptionRethrow; | 2524 return on_exception() == kOnExceptionRethrow; |
| 2458 } | 2525 } |
| 2459 int yield_id() const { return yield_id_; } | 2526 int yield_id() const { return yield_id_; } |
| 2460 | 2527 |
| 2461 void set_generator_object(Expression* e) { generator_object_ = e; } | 2528 void set_generator_object(Expression* e) { generator_object_ = e; } |
| 2462 void set_expression(Expression* e) { expression_ = e; } | 2529 void set_expression(Expression* e) { expression_ = e; } |
| 2463 void set_yield_id(int yield_id) { yield_id_ = yield_id; } | 2530 void set_yield_id(int yield_id) { yield_id_ = yield_id; } |
| 2464 | 2531 |
| 2465 private: | 2532 private: |
| 2466 friend class AstNodeFactory; | 2533 friend class AstNodeFactory; |
| 2467 | 2534 |
| 2468 Yield(Expression* generator_object, Expression* expression, int pos, | 2535 Yield(Expression* generator_object, Expression* expression, int pos, |
| 2469 OnException on_exception) | 2536 OnException on_exception) |
| 2470 : Expression(pos, kYield), | 2537 : Expression(pos, kYield), |
| 2471 on_exception_(on_exception), | |
| 2472 yield_id_(-1), | 2538 yield_id_(-1), |
| 2473 generator_object_(generator_object), | 2539 generator_object_(generator_object), |
| 2474 expression_(expression) {} | 2540 expression_(expression) { |
| 2541 bit_field_ |= OnExceptionField::encode(on_exception); |
| 2542 } |
| 2475 | 2543 |
| 2476 OnException on_exception_; | |
| 2477 int yield_id_; | 2544 int yield_id_; |
| 2478 Expression* generator_object_; | 2545 Expression* generator_object_; |
| 2479 Expression* expression_; | 2546 Expression* expression_; |
| 2547 |
| 2548 class OnExceptionField |
| 2549 : public BitField<OnException, Expression::kNextBitFieldIndex, 1> {}; |
| 2480 }; | 2550 }; |
| 2481 | 2551 |
| 2482 | 2552 |
| 2483 class Throw final : public Expression { | 2553 class Throw final : public Expression { |
| 2484 public: | 2554 public: |
| 2485 Expression* exception() const { return exception_; } | 2555 Expression* exception() const { return exception_; } |
| 2486 void set_exception(Expression* e) { exception_ = e; } | 2556 void set_exception(Expression* e) { exception_ = e; } |
| 2487 | 2557 |
| 2488 private: | 2558 private: |
| 2489 friend class AstNodeFactory; | 2559 friend class AstNodeFactory; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2563 raw_inferred_name_ = NULL; | 2633 raw_inferred_name_ = NULL; |
| 2564 } | 2634 } |
| 2565 | 2635 |
| 2566 void set_raw_inferred_name(const AstString* raw_inferred_name) { | 2636 void set_raw_inferred_name(const AstString* raw_inferred_name) { |
| 2567 DCHECK(raw_inferred_name != NULL); | 2637 DCHECK(raw_inferred_name != NULL); |
| 2568 raw_inferred_name_ = raw_inferred_name; | 2638 raw_inferred_name_ = raw_inferred_name; |
| 2569 DCHECK(inferred_name_.is_null()); | 2639 DCHECK(inferred_name_.is_null()); |
| 2570 inferred_name_ = Handle<String>(); | 2640 inferred_name_ = Handle<String>(); |
| 2571 } | 2641 } |
| 2572 | 2642 |
| 2573 bool pretenure() const { return Pretenure::decode(bitfield_); } | 2643 bool pretenure() const { return Pretenure::decode(bit_field_); } |
| 2574 void set_pretenure() { bitfield_ = Pretenure::update(bitfield_, true); } | 2644 void set_pretenure() { bit_field_ = Pretenure::update(bit_field_, true); } |
| 2575 | 2645 |
| 2576 bool has_duplicate_parameters() const { | 2646 bool has_duplicate_parameters() const { |
| 2577 return HasDuplicateParameters::decode(bitfield_); | 2647 return HasDuplicateParameters::decode(bit_field_); |
| 2578 } | 2648 } |
| 2579 | 2649 |
| 2580 bool is_function() const { return IsFunction::decode(bitfield_); } | 2650 bool is_function() const { return IsFunction::decode(bit_field_); } |
| 2581 | 2651 |
| 2582 // This is used as a heuristic on when to eagerly compile a function | 2652 // This is used as a heuristic on when to eagerly compile a function |
| 2583 // literal. We consider the following constructs as hints that the | 2653 // literal. We consider the following constructs as hints that the |
| 2584 // function will be called immediately: | 2654 // function will be called immediately: |
| 2585 // - (function() { ... })(); | 2655 // - (function() { ... })(); |
| 2586 // - var x = function() { ... }(); | 2656 // - var x = function() { ... }(); |
| 2587 bool should_eager_compile() const { | 2657 bool should_eager_compile() const { |
| 2588 return ShouldEagerCompile::decode(bitfield_); | 2658 return ShouldEagerCompile::decode(bit_field_); |
| 2589 } | 2659 } |
| 2590 void set_should_eager_compile() { | 2660 void set_should_eager_compile() { |
| 2591 bitfield_ = ShouldEagerCompile::update(bitfield_, true); | 2661 bit_field_ = ShouldEagerCompile::update(bit_field_, true); |
| 2592 } | 2662 } |
| 2593 | 2663 |
| 2594 // A hint that we expect this function to be called (exactly) once, | 2664 // A hint that we expect this function to be called (exactly) once, |
| 2595 // i.e. we suspect it's an initialization function. | 2665 // i.e. we suspect it's an initialization function. |
| 2596 bool should_be_used_once_hint() const { | 2666 bool should_be_used_once_hint() const { |
| 2597 return ShouldBeUsedOnceHint::decode(bitfield_); | 2667 return ShouldNotBeUsedOnceHintField::decode(bit_field_); |
| 2598 } | 2668 } |
| 2599 void set_should_be_used_once_hint() { | 2669 void set_should_be_used_once_hint() { |
| 2600 bitfield_ = ShouldBeUsedOnceHint::update(bitfield_, true); | 2670 bit_field_ = ShouldNotBeUsedOnceHintField::update(bit_field_, true); |
| 2601 } | 2671 } |
| 2602 | 2672 |
| 2603 FunctionType function_type() const { | 2673 FunctionType function_type() const { |
| 2604 return FunctionTypeBits::decode(bitfield_); | 2674 return FunctionTypeBits::decode(bit_field_); |
| 2605 } | 2675 } |
| 2606 FunctionKind kind() const { return FunctionKindBits::decode(bitfield_); } | 2676 FunctionKind kind() const { return FunctionKindBits::decode(bit_field_); } |
| 2607 | 2677 |
| 2608 int ast_node_count() { return ast_properties_.node_count(); } | 2678 int ast_node_count() { return ast_properties_.node_count(); } |
| 2609 AstProperties::Flags flags() const { return ast_properties_.flags(); } | 2679 AstProperties::Flags flags() const { return ast_properties_.flags(); } |
| 2610 void set_ast_properties(AstProperties* ast_properties) { | 2680 void set_ast_properties(AstProperties* ast_properties) { |
| 2611 ast_properties_ = *ast_properties; | 2681 ast_properties_ = *ast_properties; |
| 2612 } | 2682 } |
| 2613 const FeedbackVectorSpec* feedback_vector_spec() const { | 2683 const FeedbackVectorSpec* feedback_vector_spec() const { |
| 2614 return ast_properties_.get_spec(); | 2684 return ast_properties_.get_spec(); |
| 2615 } | 2685 } |
| 2616 bool dont_optimize() { return dont_optimize_reason_ != kNoReason; } | 2686 bool dont_optimize() { return dont_optimize_reason() != kNoReason; } |
| 2617 BailoutReason dont_optimize_reason() { return dont_optimize_reason_; } | 2687 BailoutReason dont_optimize_reason() { |
| 2688 return DontOptimizeReasonField::decode(bit_field_2_); |
| 2689 } |
| 2618 void set_dont_optimize_reason(BailoutReason reason) { | 2690 void set_dont_optimize_reason(BailoutReason reason) { |
| 2619 dont_optimize_reason_ = reason; | 2691 bit_field_2_ = DontOptimizeReasonField::update(bit_field_2_, reason); |
| 2620 } | 2692 } |
| 2621 | 2693 |
| 2622 bool IsAnonymousFunctionDefinition() const { | 2694 bool IsAnonymousFunctionDefinition() const { |
| 2623 return is_anonymous_expression(); | 2695 return is_anonymous_expression(); |
| 2624 } | 2696 } |
| 2625 | 2697 |
| 2626 int yield_count() { return yield_count_; } | 2698 int yield_count() { return yield_count_; } |
| 2627 void set_yield_count(int yield_count) { yield_count_ = yield_count; } | 2699 void set_yield_count(int yield_count) { yield_count_ = yield_count; } |
| 2628 | 2700 |
| 2629 bool requires_class_field_init() { | 2701 bool requires_class_field_init() { |
| 2630 return RequiresClassFieldInit::decode(bitfield_); | 2702 return RequiresClassFieldInit::decode(bit_field_); |
| 2631 } | 2703 } |
| 2632 void set_requires_class_field_init(bool requires_class_field_init) { | 2704 void set_requires_class_field_init(bool requires_class_field_init) { |
| 2633 bitfield_ = | 2705 bit_field_ = |
| 2634 RequiresClassFieldInit::update(bitfield_, requires_class_field_init); | 2706 RequiresClassFieldInit::update(bit_field_, requires_class_field_init); |
| 2635 } | 2707 } |
| 2636 bool is_class_field_initializer() { | 2708 bool is_class_field_initializer() { |
| 2637 return IsClassFieldInitializer::decode(bitfield_); | 2709 return IsClassFieldInitializer::decode(bit_field_2_); |
| 2638 } | 2710 } |
| 2639 void set_is_class_field_initializer(bool is_class_field_initializer) { | 2711 void set_is_class_field_initializer(bool is_class_field_initializer) { |
| 2640 bitfield_ = | 2712 bit_field_ = IsClassFieldInitializer::update(bit_field_2_, |
| 2641 IsClassFieldInitializer::update(bitfield_, is_class_field_initializer); | 2713 is_class_field_initializer); |
| 2642 } | 2714 } |
| 2643 | 2715 |
| 2644 private: | 2716 private: |
| 2645 friend class AstNodeFactory; | 2717 friend class AstNodeFactory; |
| 2646 | 2718 |
| 2647 FunctionLiteral(Zone* zone, const AstString* name, | 2719 FunctionLiteral(Zone* zone, const AstString* name, |
| 2648 AstValueFactory* ast_value_factory, DeclarationScope* scope, | 2720 AstValueFactory* ast_value_factory, DeclarationScope* scope, |
| 2649 ZoneList<Statement*>* body, int materialized_literal_count, | 2721 ZoneList<Statement*>* body, int materialized_literal_count, |
| 2650 int expected_property_count, int parameter_count, | 2722 int expected_property_count, int parameter_count, |
| 2651 FunctionType function_type, | 2723 FunctionType function_type, |
| 2652 ParameterFlag has_duplicate_parameters, | 2724 ParameterFlag has_duplicate_parameters, |
| 2653 EagerCompileHint eager_compile_hint, FunctionKind kind, | 2725 EagerCompileHint eager_compile_hint, FunctionKind kind, |
| 2654 int position, bool is_function) | 2726 int position, bool is_function) |
| 2655 : Expression(position, kFunctionLiteral), | 2727 : Expression(position, kFunctionLiteral), |
| 2656 dont_optimize_reason_(kNoReason), | |
| 2657 materialized_literal_count_(materialized_literal_count), | 2728 materialized_literal_count_(materialized_literal_count), |
| 2658 expected_property_count_(expected_property_count), | 2729 expected_property_count_(expected_property_count), |
| 2659 parameter_count_(parameter_count), | 2730 parameter_count_(parameter_count), |
| 2660 function_token_position_(kNoSourcePosition), | 2731 function_token_position_(kNoSourcePosition), |
| 2661 yield_count_(0), | 2732 yield_count_(0), |
| 2662 raw_name_(name), | 2733 raw_name_(name), |
| 2663 scope_(scope), | 2734 scope_(scope), |
| 2664 body_(body), | 2735 body_(body), |
| 2665 raw_inferred_name_(ast_value_factory->empty_string()), | 2736 raw_inferred_name_(ast_value_factory->empty_string()), |
| 2666 ast_properties_(zone) { | 2737 ast_properties_(zone) { |
| 2667 bitfield_ = | 2738 bit_field_ |= |
| 2668 FunctionTypeBits::encode(function_type) | Pretenure::encode(false) | | 2739 FunctionTypeBits::encode(function_type) | Pretenure::encode(false) | |
| 2669 HasDuplicateParameters::encode(has_duplicate_parameters == | 2740 HasDuplicateParameters::encode(has_duplicate_parameters == |
| 2670 kHasDuplicateParameters) | | 2741 kHasDuplicateParameters) | |
| 2671 IsFunction::encode(is_function) | | 2742 IsFunction::encode(is_function) | |
| 2672 ShouldEagerCompile::encode(eager_compile_hint == kShouldEagerCompile) | | 2743 ShouldEagerCompile::encode(eager_compile_hint == kShouldEagerCompile) | |
| 2673 RequiresClassFieldInit::encode(false) | | 2744 FunctionKindBits::encode(kind) | RequiresClassFieldInit::encode(false) | |
| 2674 IsClassFieldInitializer::encode(false) | | 2745 ShouldNotBeUsedOnceHintField::encode(false); |
| 2675 FunctionKindBits::encode(kind) | ShouldBeUsedOnceHint::encode(false); | 2746 |
| 2747 bit_field_2_ = DontOptimizeReasonField::encode(kNoReason) | |
| 2748 IsClassFieldInitializer::encode(false); |
| 2749 |
| 2676 DCHECK(IsValidFunctionKind(kind)); | 2750 DCHECK(IsValidFunctionKind(kind)); |
| 2677 } | 2751 } |
| 2678 | 2752 |
| 2679 class FunctionTypeBits : public BitField<FunctionType, 0, 2> {}; | 2753 class FunctionTypeBits |
| 2680 class Pretenure : public BitField<bool, 2, 1> {}; | 2754 : public BitField<FunctionType, Expression::kNextBitFieldIndex, 2> {}; |
| 2681 class HasDuplicateParameters : public BitField<bool, 3, 1> {}; | 2755 class Pretenure : public BitField<bool, FunctionTypeBits::kNext, 1> {}; |
| 2682 class IsFunction : public BitField<bool, 4, 1> {}; | 2756 class HasDuplicateParameters : public BitField<bool, Pretenure::kNext, 1> {}; |
| 2683 class ShouldEagerCompile : public BitField<bool, 5, 1> {}; | 2757 class IsFunction : public BitField<bool, HasDuplicateParameters::kNext, 1> {}; |
| 2684 class ShouldBeUsedOnceHint : public BitField<bool, 6, 1> {}; | 2758 class ShouldEagerCompile : public BitField<bool, IsFunction::kNext, 1> {}; |
| 2685 class RequiresClassFieldInit : public BitField<bool, 7, 1> {}; | 2759 class FunctionKindBits |
| 2686 class IsClassFieldInitializer : public BitField<bool, 8, 1> {}; | 2760 : public BitField<FunctionKind, ShouldEagerCompile::kNext, 9> {}; |
| 2687 class FunctionKindBits : public BitField<FunctionKind, 9, 9> {}; | 2761 class ShouldNotBeUsedOnceHintField |
| 2762 : public BitField<bool, FunctionKindBits::kNext, 1> {}; |
| 2763 class RequiresClassFieldInit |
| 2764 : public BitField<bool, ShouldNotBeUsedOnceHintField::kNext, 1> {}; |
| 2688 | 2765 |
| 2689 uint32_t bitfield_; | 2766 uint32_t bit_field_2_; |
| 2690 | 2767 |
| 2691 BailoutReason dont_optimize_reason_; | 2768 class IsClassFieldInitializer : public BitField<bool, 0, 1> {}; |
| 2769 class DontOptimizeReasonField |
| 2770 : public BitField<BailoutReason, IsClassFieldInitializer::kNext, 8> {}; |
| 2692 | 2771 |
| 2693 int materialized_literal_count_; | 2772 int materialized_literal_count_; |
| 2694 int expected_property_count_; | 2773 int expected_property_count_; |
| 2695 int parameter_count_; | 2774 int parameter_count_; |
| 2696 int function_token_position_; | 2775 int function_token_position_; |
| 2697 int yield_count_; | 2776 int yield_count_; |
| 2698 | 2777 |
| 2699 const AstString* raw_name_; | 2778 const AstString* raw_name_; |
| 2700 DeclarationScope* scope_; | 2779 DeclarationScope* scope_; |
| 2701 ZoneList<Statement*>* body_; | 2780 ZoneList<Statement*>* body_; |
| (...skipping 833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3535 : NULL; \ | 3614 : NULL; \ |
| 3536 } | 3615 } |
| 3537 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) | 3616 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) |
| 3538 #undef DECLARE_NODE_FUNCTIONS | 3617 #undef DECLARE_NODE_FUNCTIONS |
| 3539 | 3618 |
| 3540 | 3619 |
| 3541 } // namespace internal | 3620 } // namespace internal |
| 3542 } // namespace v8 | 3621 } // namespace v8 |
| 3543 | 3622 |
| 3544 #endif // V8_AST_AST_H_ | 3623 #endif // V8_AST_AST_H_ |
| OLD | NEW |