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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 int statement_position, | 74 int statement_position, |
75 List<BreakLocation>* result_out); | 75 List<BreakLocation>* result_out); |
76 | 76 |
77 static BreakLocation FromPosition(Handle<DebugInfo> debug_info, int position, | 77 static BreakLocation FromPosition(Handle<DebugInfo> debug_info, int position, |
78 BreakPositionAlignment alignment); | 78 BreakPositionAlignment alignment); |
79 | 79 |
80 bool IsDebugBreak() const; | 80 bool IsDebugBreak() const; |
81 | 81 |
82 inline bool IsReturn() const { return type_ == DEBUG_BREAK_SLOT_AT_RETURN; } | 82 inline bool IsReturn() const { return type_ == DEBUG_BREAK_SLOT_AT_RETURN; } |
83 inline bool IsCall() const { return type_ == DEBUG_BREAK_SLOT_AT_CALL; } | 83 inline bool IsCall() const { return type_ == DEBUG_BREAK_SLOT_AT_CALL; } |
| 84 inline bool IsTailCall() const { |
| 85 return type_ == DEBUG_BREAK_SLOT_AT_TAIL_CALL; |
| 86 } |
84 inline bool IsDebugBreakSlot() const { return type_ >= DEBUG_BREAK_SLOT; } | 87 inline bool IsDebugBreakSlot() const { return type_ >= DEBUG_BREAK_SLOT; } |
85 inline bool IsDebuggerStatement() const { | 88 inline bool IsDebuggerStatement() const { |
86 return type_ == DEBUGGER_STATEMENT; | 89 return type_ == DEBUGGER_STATEMENT; |
87 } | 90 } |
88 inline bool HasBreakPoint() const { | 91 inline bool HasBreakPoint() const { |
89 return debug_info_->HasBreakPoint(code_offset_); | 92 return debug_info_->HasBreakPoint(code_offset_); |
90 } | 93 } |
91 | 94 |
92 Handle<Object> BreakPointObjects() const; | 95 Handle<Object> BreakPointObjects() const; |
93 | 96 |
(...skipping 12 matching lines...) Expand all Loading... |
106 inline AbstractCode* abstract_code() const { | 109 inline AbstractCode* abstract_code() const { |
107 return debug_info_->abstract_code(); | 110 return debug_info_->abstract_code(); |
108 } | 111 } |
109 | 112 |
110 protected: | 113 protected: |
111 enum DebugBreakType { | 114 enum DebugBreakType { |
112 NOT_DEBUG_BREAK, | 115 NOT_DEBUG_BREAK, |
113 DEBUGGER_STATEMENT, | 116 DEBUGGER_STATEMENT, |
114 DEBUG_BREAK_SLOT, | 117 DEBUG_BREAK_SLOT, |
115 DEBUG_BREAK_SLOT_AT_CALL, | 118 DEBUG_BREAK_SLOT_AT_CALL, |
116 DEBUG_BREAK_SLOT_AT_RETURN | 119 DEBUG_BREAK_SLOT_AT_RETURN, |
| 120 DEBUG_BREAK_SLOT_AT_TAIL_CALL, |
117 }; | 121 }; |
118 | 122 |
119 BreakLocation(Handle<DebugInfo> debug_info, DebugBreakType type, | 123 BreakLocation(Handle<DebugInfo> debug_info, DebugBreakType type, |
120 int code_offset, int position, int statement_position); | 124 int code_offset, int position, int statement_position); |
121 | 125 |
122 class Iterator { | 126 class Iterator { |
123 public: | 127 public: |
124 virtual ~Iterator() {} | 128 virtual ~Iterator() {} |
125 | 129 |
126 virtual BreakLocation GetBreakLocation() = 0; | 130 virtual BreakLocation GetBreakLocation() = 0; |
127 virtual bool Done() const = 0; | 131 virtual bool Done() const = 0; |
128 virtual void Next() = 0; | 132 virtual void Next() = 0; |
129 | 133 |
130 void SkipTo(int count) { | 134 void SkipTo(int count) { |
131 while (count-- > 0) Next(); | 135 while (count-- > 0) Next(); |
132 } | 136 } |
133 | 137 |
134 virtual int code_offset() = 0; | 138 virtual int code_offset() = 0; |
135 int break_index() const { return break_index_; } | 139 int break_index() const { return break_index_; } |
136 inline int position() const { return position_; } | 140 inline int position() const { return position_; } |
137 inline int statement_position() const { return statement_position_; } | 141 inline int statement_position() const { return statement_position_; } |
138 | 142 |
139 protected: | 143 protected: |
140 explicit Iterator(Handle<DebugInfo> debug_info); | 144 explicit Iterator(Handle<DebugInfo> debug_info); |
141 int ReturnPosition(); | 145 int ReturnPosition(); |
142 | 146 |
| 147 Isolate* isolate() { return debug_info_->GetIsolate(); } |
| 148 |
143 Handle<DebugInfo> debug_info_; | 149 Handle<DebugInfo> debug_info_; |
144 int break_index_; | 150 int break_index_; |
145 int position_; | 151 int position_; |
146 int statement_position_; | 152 int statement_position_; |
147 | 153 |
148 private: | 154 private: |
149 DisallowHeapAllocation no_gc_; | 155 DisallowHeapAllocation no_gc_; |
150 DISALLOW_COPY_AND_ASSIGN(Iterator); | 156 DISALLOW_COPY_AND_ASSIGN(Iterator); |
151 }; | 157 }; |
152 | 158 |
153 class CodeIterator : public Iterator { | 159 class CodeIterator : public Iterator { |
154 public: | 160 public: |
155 CodeIterator(Handle<DebugInfo> debug_info, BreakLocatorType type); | 161 CodeIterator(Handle<DebugInfo> debug_info, BreakLocatorType type); |
156 ~CodeIterator() override {} | 162 ~CodeIterator() override {} |
157 | 163 |
158 BreakLocation GetBreakLocation() override; | 164 BreakLocation GetBreakLocation() override; |
159 bool Done() const override { return reloc_iterator_.done(); } | 165 bool Done() const override { return reloc_iterator_.done(); } |
160 void Next() override; | 166 void Next() override; |
161 | 167 |
162 int code_offset() override { | 168 int code_offset() override { |
163 return static_cast<int>( | 169 return static_cast<int>( |
164 rinfo()->pc() - | 170 rinfo()->pc() - |
165 debug_info_->abstract_code()->GetCode()->instruction_start()); | 171 debug_info_->abstract_code()->GetCode()->instruction_start()); |
166 } | 172 } |
167 | 173 |
168 private: | 174 private: |
169 static int GetModeMask(BreakLocatorType type); | 175 int GetModeMask(BreakLocatorType type); |
170 RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); } | 176 RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); } |
171 RelocInfo* rinfo() { return reloc_iterator_.rinfo(); } | 177 RelocInfo* rinfo() { return reloc_iterator_.rinfo(); } |
172 | 178 |
173 RelocIterator reloc_iterator_; | 179 RelocIterator reloc_iterator_; |
174 DISALLOW_COPY_AND_ASSIGN(CodeIterator); | 180 DISALLOW_COPY_AND_ASSIGN(CodeIterator); |
175 }; | 181 }; |
176 | 182 |
177 class BytecodeArrayIterator : public Iterator { | 183 class BytecodeArrayIterator : public Iterator { |
178 public: | 184 public: |
179 BytecodeArrayIterator(Handle<DebugInfo> debug_info, BreakLocatorType type); | 185 BytecodeArrayIterator(Handle<DebugInfo> debug_info, BreakLocatorType type); |
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 Handle<Code> code); | 803 Handle<Code> code); |
798 static bool DebugBreakSlotIsPatched(Address pc); | 804 static bool DebugBreakSlotIsPatched(Address pc); |
799 static void ClearDebugBreakSlot(Isolate* isolate, Address pc); | 805 static void ClearDebugBreakSlot(Isolate* isolate, Address pc); |
800 }; | 806 }; |
801 | 807 |
802 | 808 |
803 } // namespace internal | 809 } // namespace internal |
804 } // namespace v8 | 810 } // namespace v8 |
805 | 811 |
806 #endif // V8_DEBUG_DEBUG_H_ | 812 #endif // V8_DEBUG_DEBUG_H_ |
OLD | NEW |