| 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_DEOPTIMIZER_H_ | 5 #ifndef V8_DEOPTIMIZER_H_ |
| 6 #define V8_DEOPTIMIZER_H_ | 6 #define V8_DEOPTIMIZER_H_ |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
| (...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 | 455 |
| 456 void operator delete(void* pointer, uint32_t frame_size) { | 456 void operator delete(void* pointer, uint32_t frame_size) { |
| 457 free(pointer); | 457 free(pointer); |
| 458 } | 458 } |
| 459 | 459 |
| 460 void operator delete(void* description) { | 460 void operator delete(void* description) { |
| 461 free(description); | 461 free(description); |
| 462 } | 462 } |
| 463 | 463 |
| 464 uint32_t GetFrameSize() const { | 464 uint32_t GetFrameSize() const { |
| 465 ASSERT(static_cast<uint32_t>(frame_size_) == frame_size_); | 465 DCHECK(static_cast<uint32_t>(frame_size_) == frame_size_); |
| 466 return static_cast<uint32_t>(frame_size_); | 466 return static_cast<uint32_t>(frame_size_); |
| 467 } | 467 } |
| 468 | 468 |
| 469 JSFunction* GetFunction() const { return function_; } | 469 JSFunction* GetFunction() const { return function_; } |
| 470 | 470 |
| 471 unsigned GetOffsetFromSlotIndex(int slot_index); | 471 unsigned GetOffsetFromSlotIndex(int slot_index); |
| 472 | 472 |
| 473 intptr_t GetFrameSlot(unsigned offset) { | 473 intptr_t GetFrameSlot(unsigned offset) { |
| 474 return *GetFrameSlotPointer(offset); | 474 return *GetFrameSlotPointer(offset); |
| 475 } | 475 } |
| 476 | 476 |
| 477 double GetDoubleFrameSlot(unsigned offset) { | 477 double GetDoubleFrameSlot(unsigned offset) { |
| 478 intptr_t* ptr = GetFrameSlotPointer(offset); | 478 intptr_t* ptr = GetFrameSlotPointer(offset); |
| 479 return read_double_value(reinterpret_cast<Address>(ptr)); | 479 return read_double_value(reinterpret_cast<Address>(ptr)); |
| 480 } | 480 } |
| 481 | 481 |
| 482 void SetFrameSlot(unsigned offset, intptr_t value) { | 482 void SetFrameSlot(unsigned offset, intptr_t value) { |
| 483 *GetFrameSlotPointer(offset) = value; | 483 *GetFrameSlotPointer(offset) = value; |
| 484 } | 484 } |
| 485 | 485 |
| 486 void SetCallerPc(unsigned offset, intptr_t value); | 486 void SetCallerPc(unsigned offset, intptr_t value); |
| 487 | 487 |
| 488 void SetCallerFp(unsigned offset, intptr_t value); | 488 void SetCallerFp(unsigned offset, intptr_t value); |
| 489 | 489 |
| 490 void SetCallerConstantPool(unsigned offset, intptr_t value); | 490 void SetCallerConstantPool(unsigned offset, intptr_t value); |
| 491 | 491 |
| 492 intptr_t GetRegister(unsigned n) const { | 492 intptr_t GetRegister(unsigned n) const { |
| 493 #if DEBUG | 493 #if DEBUG |
| 494 // This convoluted ASSERT is needed to work around a gcc problem that | 494 // This convoluted DCHECK is needed to work around a gcc problem that |
| 495 // improperly detects an array bounds overflow in optimized debug builds | 495 // improperly detects an array bounds overflow in optimized debug builds |
| 496 // when using a plain ASSERT. | 496 // when using a plain DCHECK. |
| 497 if (n >= ARRAY_SIZE(registers_)) { | 497 if (n >= ARRAY_SIZE(registers_)) { |
| 498 ASSERT(false); | 498 DCHECK(false); |
| 499 return 0; | 499 return 0; |
| 500 } | 500 } |
| 501 #endif | 501 #endif |
| 502 return registers_[n]; | 502 return registers_[n]; |
| 503 } | 503 } |
| 504 | 504 |
| 505 double GetDoubleRegister(unsigned n) const { | 505 double GetDoubleRegister(unsigned n) const { |
| 506 ASSERT(n < ARRAY_SIZE(double_registers_)); | 506 DCHECK(n < ARRAY_SIZE(double_registers_)); |
| 507 return double_registers_[n]; | 507 return double_registers_[n]; |
| 508 } | 508 } |
| 509 | 509 |
| 510 void SetRegister(unsigned n, intptr_t value) { | 510 void SetRegister(unsigned n, intptr_t value) { |
| 511 ASSERT(n < ARRAY_SIZE(registers_)); | 511 DCHECK(n < ARRAY_SIZE(registers_)); |
| 512 registers_[n] = value; | 512 registers_[n] = value; |
| 513 } | 513 } |
| 514 | 514 |
| 515 void SetDoubleRegister(unsigned n, double value) { | 515 void SetDoubleRegister(unsigned n, double value) { |
| 516 ASSERT(n < ARRAY_SIZE(double_registers_)); | 516 DCHECK(n < ARRAY_SIZE(double_registers_)); |
| 517 double_registers_[n] = value; | 517 double_registers_[n] = value; |
| 518 } | 518 } |
| 519 | 519 |
| 520 intptr_t GetTop() const { return top_; } | 520 intptr_t GetTop() const { return top_; } |
| 521 void SetTop(intptr_t top) { top_ = top; } | 521 void SetTop(intptr_t top) { top_ = top; } |
| 522 | 522 |
| 523 intptr_t GetPc() const { return pc_; } | 523 intptr_t GetPc() const { return pc_; } |
| 524 void SetPc(intptr_t pc) { pc_ = pc; } | 524 void SetPc(intptr_t pc) { pc_ = pc; } |
| 525 | 525 |
| 526 intptr_t GetFp() const { return fp_; } | 526 intptr_t GetFp() const { return fp_; } |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 | 602 |
| 603 // Continuation is the PC where the execution continues after | 603 // Continuation is the PC where the execution continues after |
| 604 // deoptimizing. | 604 // deoptimizing. |
| 605 intptr_t continuation_; | 605 intptr_t continuation_; |
| 606 | 606 |
| 607 // This must be at the end of the object as the object is allocated larger | 607 // This must be at the end of the object as the object is allocated larger |
| 608 // than it's definition indicate to extend this array. | 608 // than it's definition indicate to extend this array. |
| 609 intptr_t frame_content_[1]; | 609 intptr_t frame_content_[1]; |
| 610 | 610 |
| 611 intptr_t* GetFrameSlotPointer(unsigned offset) { | 611 intptr_t* GetFrameSlotPointer(unsigned offset) { |
| 612 ASSERT(offset < frame_size_); | 612 DCHECK(offset < frame_size_); |
| 613 return reinterpret_cast<intptr_t*>( | 613 return reinterpret_cast<intptr_t*>( |
| 614 reinterpret_cast<Address>(this) + frame_content_offset() + offset); | 614 reinterpret_cast<Address>(this) + frame_content_offset() + offset); |
| 615 } | 615 } |
| 616 | 616 |
| 617 int ComputeFixedSize(); | 617 int ComputeFixedSize(); |
| 618 }; | 618 }; |
| 619 | 619 |
| 620 | 620 |
| 621 class DeoptimizerData { | 621 class DeoptimizerData { |
| 622 public: | 622 public: |
| (...skipping 28 matching lines...) Expand all Loading... |
| 651 | 651 |
| 652 private: | 652 private: |
| 653 ZoneList<uint8_t> contents_; | 653 ZoneList<uint8_t> contents_; |
| 654 }; | 654 }; |
| 655 | 655 |
| 656 | 656 |
| 657 class TranslationIterator BASE_EMBEDDED { | 657 class TranslationIterator BASE_EMBEDDED { |
| 658 public: | 658 public: |
| 659 TranslationIterator(ByteArray* buffer, int index) | 659 TranslationIterator(ByteArray* buffer, int index) |
| 660 : buffer_(buffer), index_(index) { | 660 : buffer_(buffer), index_(index) { |
| 661 ASSERT(index >= 0 && index < buffer->length()); | 661 DCHECK(index >= 0 && index < buffer->length()); |
| 662 } | 662 } |
| 663 | 663 |
| 664 int32_t Next(); | 664 int32_t Next(); |
| 665 | 665 |
| 666 bool HasNext() const { return index_ < buffer_->length(); } | 666 bool HasNext() const { return index_ < buffer_->length(); } |
| 667 | 667 |
| 668 void Skip(int n) { | 668 void Skip(int n) { |
| 669 for (int i = 0; i < n; i++) Next(); | 669 for (int i = 0; i < n; i++) Next(); |
| 670 } | 670 } |
| 671 | 671 |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 923 } | 923 } |
| 924 | 924 |
| 925 // Check if this frame is preceded by construct stub frame. The bottom-most | 925 // Check if this frame is preceded by construct stub frame. The bottom-most |
| 926 // inlined frame might still be called by an uninlined construct stub. | 926 // inlined frame might still be called by an uninlined construct stub. |
| 927 bool HasConstructStub() { | 927 bool HasConstructStub() { |
| 928 return has_construct_stub_; | 928 return has_construct_stub_; |
| 929 } | 929 } |
| 930 | 930 |
| 931 // Get an incoming argument. | 931 // Get an incoming argument. |
| 932 Object* GetParameter(int index) { | 932 Object* GetParameter(int index) { |
| 933 ASSERT(0 <= index && index < parameters_count()); | 933 DCHECK(0 <= index && index < parameters_count()); |
| 934 return parameters_[index]; | 934 return parameters_[index]; |
| 935 } | 935 } |
| 936 | 936 |
| 937 // Get an expression from the expression stack. | 937 // Get an expression from the expression stack. |
| 938 Object* GetExpression(int index) { | 938 Object* GetExpression(int index) { |
| 939 ASSERT(0 <= index && index < expression_count()); | 939 DCHECK(0 <= index && index < expression_count()); |
| 940 return expression_stack_[index]; | 940 return expression_stack_[index]; |
| 941 } | 941 } |
| 942 | 942 |
| 943 int GetSourcePosition() { | 943 int GetSourcePosition() { |
| 944 return source_position_; | 944 return source_position_; |
| 945 } | 945 } |
| 946 | 946 |
| 947 private: | 947 private: |
| 948 // Set an incoming argument. | 948 // Set an incoming argument. |
| 949 void SetParameter(int index, Object* obj) { | 949 void SetParameter(int index, Object* obj) { |
| 950 ASSERT(0 <= index && index < parameters_count()); | 950 DCHECK(0 <= index && index < parameters_count()); |
| 951 parameters_[index] = obj; | 951 parameters_[index] = obj; |
| 952 } | 952 } |
| 953 | 953 |
| 954 // Set an expression on the expression stack. | 954 // Set an expression on the expression stack. |
| 955 void SetExpression(int index, Object* obj) { | 955 void SetExpression(int index, Object* obj) { |
| 956 ASSERT(0 <= index && index < expression_count()); | 956 DCHECK(0 <= index && index < expression_count()); |
| 957 expression_stack_[index] = obj; | 957 expression_stack_[index] = obj; |
| 958 } | 958 } |
| 959 | 959 |
| 960 JSFunction* function_; | 960 JSFunction* function_; |
| 961 bool has_construct_stub_; | 961 bool has_construct_stub_; |
| 962 int parameters_count_; | 962 int parameters_count_; |
| 963 int expression_count_; | 963 int expression_count_; |
| 964 Object** parameters_; | 964 Object** parameters_; |
| 965 Object** expression_stack_; | 965 Object** expression_stack_; |
| 966 int source_position_; | 966 int source_position_; |
| 967 | 967 |
| 968 friend class Deoptimizer; | 968 friend class Deoptimizer; |
| 969 }; | 969 }; |
| 970 | 970 |
| 971 } } // namespace v8::internal | 971 } } // namespace v8::internal |
| 972 | 972 |
| 973 #endif // V8_DEOPTIMIZER_H_ | 973 #endif // V8_DEOPTIMIZER_H_ |
| OLD | NEW |