| 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_DEBUG_DEBUG_H_ | 5 #ifndef V8_DEBUG_DEBUG_H_ |
| 6 #define V8_DEBUG_DEBUG_H_ | 6 #define V8_DEBUG_DEBUG_H_ |
| 7 | 7 |
| 8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/arguments.h" | 9 #include "src/arguments.h" |
| 10 #include "src/assembler.h" | 10 #include "src/assembler.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 enum BreakPositionAlignment { | 57 enum BreakPositionAlignment { |
| 58 STATEMENT_ALIGNED = 0, | 58 STATEMENT_ALIGNED = 0, |
| 59 BREAK_POSITION_ALIGNED = 1 | 59 BREAK_POSITION_ALIGNED = 1 |
| 60 }; | 60 }; |
| 61 | 61 |
| 62 | 62 |
| 63 class BreakLocation { | 63 class BreakLocation { |
| 64 public: | 64 public: |
| 65 // Find the break point at the supplied address, or the closest one before | 65 // Find the break point at the supplied address, or the closest one before |
| 66 // the address. | 66 // the address. |
| 67 static BreakLocation FromAddress(Handle<DebugInfo> debug_info, Address pc); | 67 static BreakLocation FromCodeOffset(Handle<DebugInfo> debug_info, int offset); |
| 68 | 68 |
| 69 template <class Frame> | 69 static BreakLocation FromFrame(Handle<DebugInfo> debug_info, |
| 70 static BreakLocation FromFrame(Handle<DebugInfo> debug_info, Frame* frame) { | 70 JavaScriptFrame* frame); |
| 71 // PC points to the instruction after the current one, possibly a break | |
| 72 // location as well. So the "- 1" to exclude it from the search. | |
| 73 return FromAddress(debug_info, frame->pc() - 1); | |
| 74 } | |
| 75 | 71 |
| 76 static void FromAddressSameStatement(Handle<DebugInfo> debug_info, Address pc, | 72 static void FromCodeOffsetSameStatement(Handle<DebugInfo> debug_info, |
| 77 List<BreakLocation>* result_out); | 73 int offset, |
| 74 List<BreakLocation>* result_out); |
| 78 | 75 |
| 79 static BreakLocation FromPosition(Handle<DebugInfo> debug_info, int position, | 76 static BreakLocation FromPosition(Handle<DebugInfo> debug_info, int position, |
| 80 BreakPositionAlignment alignment); | 77 BreakPositionAlignment alignment); |
| 81 | 78 |
| 82 bool IsDebugBreak() const; | 79 bool IsDebugBreak() const; |
| 83 | 80 |
| 84 inline bool IsReturn() const { | 81 inline bool IsReturn() const { |
| 85 return RelocInfo::IsDebugBreakSlotAtReturn(rmode_); | 82 return RelocInfo::IsDebugBreakSlotAtReturn(rmode_); |
| 86 } | 83 } |
| 87 inline bool IsCall() const { | 84 inline bool IsCall() const { |
| 88 return RelocInfo::IsDebugBreakSlotAtCall(rmode_); | 85 return RelocInfo::IsDebugBreakSlotAtCall(rmode_); |
| 89 } | 86 } |
| 90 inline bool HasBreakPoint() const { | 87 inline bool HasBreakPoint() const { |
| 91 return debug_info_->HasBreakPoint(pc_offset_); | 88 return debug_info_->HasBreakPoint(code_offset_); |
| 92 } | 89 } |
| 93 | 90 |
| 94 Handle<Object> BreakPointObjects() const; | 91 Handle<Object> BreakPointObjects() const; |
| 95 | 92 |
| 96 void SetBreakPoint(Handle<Object> break_point_object); | 93 void SetBreakPoint(Handle<Object> break_point_object); |
| 97 void ClearBreakPoint(Handle<Object> break_point_object); | 94 void ClearBreakPoint(Handle<Object> break_point_object); |
| 98 | 95 |
| 99 void SetOneShot(); | 96 void SetOneShot(); |
| 100 void ClearOneShot(); | 97 void ClearOneShot(); |
| 101 | 98 |
| 102 | 99 |
| 103 inline RelocInfo rinfo() const { | 100 inline RelocInfo rinfo() const { |
| 104 return RelocInfo(debug_info_->GetIsolate(), pc(), rmode(), data_, code()); | 101 return RelocInfo(debug_info_->GetIsolate(), pc(), rmode(), data_, code()); |
| 105 } | 102 } |
| 106 | 103 |
| 107 inline int position() const { return position_; } | 104 inline int position() const { return position_; } |
| 108 inline int statement_position() const { return statement_position_; } | 105 inline int statement_position() const { return statement_position_; } |
| 109 | 106 |
| 110 inline Address pc() const { return code()->entry() + pc_offset_; } | 107 inline int code_offset() const { return code_offset_; } |
| 111 | 108 |
| 112 inline RelocInfo::Mode rmode() const { return rmode_; } | 109 inline RelocInfo::Mode rmode() const { return rmode_; } |
| 113 | 110 |
| 114 inline Code* code() const { return debug_info_->code(); } | 111 inline Code* code() const { return debug_info_->code(); } |
| 115 | 112 |
| 116 private: | 113 private: |
| 117 BreakLocation(Handle<DebugInfo> debug_info, RelocInfo* rinfo, int position, | 114 BreakLocation(Handle<DebugInfo> debug_info, RelocInfo* rinfo, int position, |
| 118 int statement_position); | 115 int statement_position); |
| 119 | 116 |
| 120 class Iterator { | 117 class Iterator { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 149 int position_; | 146 int position_; |
| 150 int statement_position_; | 147 int statement_position_; |
| 151 | 148 |
| 152 DisallowHeapAllocation no_gc_; | 149 DisallowHeapAllocation no_gc_; |
| 153 | 150 |
| 154 DISALLOW_COPY_AND_ASSIGN(Iterator); | 151 DISALLOW_COPY_AND_ASSIGN(Iterator); |
| 155 }; | 152 }; |
| 156 | 153 |
| 157 friend class Debug; | 154 friend class Debug; |
| 158 | 155 |
| 159 static int BreakIndexFromAddress(Handle<DebugInfo> debug_info, Address pc); | 156 static int BreakIndexFromCodeOffset(Handle<DebugInfo> debug_info, int offset); |
| 160 | 157 |
| 161 void SetDebugBreak(); | 158 void SetDebugBreak(); |
| 162 void ClearDebugBreak(); | 159 void ClearDebugBreak(); |
| 163 | 160 |
| 164 inline bool IsDebuggerStatement() const { | 161 inline bool IsDebuggerStatement() const { |
| 165 return RelocInfo::IsDebuggerStatement(rmode_); | 162 return RelocInfo::IsDebuggerStatement(rmode_); |
| 166 } | 163 } |
| 167 inline bool IsDebugBreakSlot() const { | 164 inline bool IsDebugBreakSlot() const { |
| 168 return RelocInfo::IsDebugBreakSlot(rmode_); | 165 return RelocInfo::IsDebugBreakSlot(rmode_); |
| 169 } | 166 } |
| 170 | 167 |
| 168 inline Address pc() const { return code()->entry() + code_offset_; } |
| 169 |
| 171 Handle<DebugInfo> debug_info_; | 170 Handle<DebugInfo> debug_info_; |
| 172 int pc_offset_; | 171 int code_offset_; |
| 173 RelocInfo::Mode rmode_; | 172 RelocInfo::Mode rmode_; |
| 174 intptr_t data_; | 173 intptr_t data_; |
| 175 int position_; | 174 int position_; |
| 176 int statement_position_; | 175 int statement_position_; |
| 177 }; | 176 }; |
| 178 | 177 |
| 179 | 178 |
| 180 // Linked list holding debug info objects. The debug info objects are kept as | 179 // Linked list holding debug info objects. The debug info objects are kept as |
| 181 // weak handles to avoid a debug info object to keep a function alive. | 180 // weak handles to avoid a debug info object to keep a function alive. |
| 182 class DebugInfoListNode { | 181 class DebugInfoListNode { |
| (...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 748 static void PatchDebugBreakSlot(Isolate* isolate, Address pc, | 747 static void PatchDebugBreakSlot(Isolate* isolate, Address pc, |
| 749 Handle<Code> code); | 748 Handle<Code> code); |
| 750 static void ClearDebugBreakSlot(Isolate* isolate, Address pc); | 749 static void ClearDebugBreakSlot(Isolate* isolate, Address pc); |
| 751 }; | 750 }; |
| 752 | 751 |
| 753 | 752 |
| 754 } // namespace internal | 753 } // namespace internal |
| 755 } // namespace v8 | 754 } // namespace v8 |
| 756 | 755 |
| 757 #endif // V8_DEBUG_DEBUG_H_ | 756 #endif // V8_DEBUG_DEBUG_H_ |
| OLD | NEW |