Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(854)

Side by Side Diff: src/debug/debug.cc

Issue 2169463002: [debugger] use absolute source positions for break locations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: address comment Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/debug/debug.h ('k') | src/debug/debug.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "src/debug/debug.h" 5 #include "src/debug/debug.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/arguments.h" 8 #include "src/arguments.h"
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 : debug_info_(debug_info), 79 : debug_info_(debug_info),
80 code_offset_(code_offset), 80 code_offset_(code_offset),
81 type_(type), 81 type_(type),
82 position_(position), 82 position_(position),
83 statement_position_(statement_position) { 83 statement_position_(statement_position) {
84 if (type == DEBUG_BREAK_SLOT_AT_RETURN) { 84 if (type == DEBUG_BREAK_SLOT_AT_RETURN) {
85 int return_position = 0; 85 int return_position = 0;
86 SharedFunctionInfo* shared = debug_info->shared(); 86 SharedFunctionInfo* shared = debug_info->shared();
87 if (shared->HasSourceCode()) { 87 if (shared->HasSourceCode()) {
88 return_position = 88 return_position =
89 std::max(shared->end_position() - shared->start_position() - 1, 0); 89 std::max(shared->end_position() - 1, shared->start_position());
90 } 90 }
91 // TODO(yangguo): find out why return position is wrong for liveedit. 91 // TODO(yangguo): find out why return position is wrong for liveedit.
92 position_ = return_position; 92 position_ = return_position;
93 statement_position = return_position; 93 statement_position_ = return_position;
94 } 94 }
95 } 95 }
96 96
97 BreakLocation::Iterator* BreakLocation::GetIterator( 97 BreakLocation::Iterator* BreakLocation::GetIterator(
98 Handle<DebugInfo> debug_info, BreakLocatorType type) { 98 Handle<DebugInfo> debug_info, BreakLocatorType type) {
99 if (debug_info->abstract_code()->IsBytecodeArray()) { 99 if (debug_info->abstract_code()->IsBytecodeArray()) {
100 return new BytecodeArrayIterator(debug_info, type); 100 return new BytecodeArrayIterator(debug_info, type);
101 } else { 101 } else {
102 return new CodeIterator(debug_info, type); 102 return new CodeIterator(debug_info, type);
103 } 103 }
104 } 104 }
105 105
106 BreakLocation::Iterator::Iterator(Handle<DebugInfo> debug_info) 106 BreakLocation::Iterator::Iterator(Handle<DebugInfo> debug_info)
107 : debug_info_(debug_info), 107 : debug_info_(debug_info), break_index_(-1) {
108 break_index_(-1), 108 position_ = debug_info->shared()->start_position();
109 position_(1), 109 statement_position_ = position_;
110 statement_position_(1) {} 110 }
111 111
112 BreakLocation::CodeIterator::CodeIterator(Handle<DebugInfo> debug_info, 112 BreakLocation::CodeIterator::CodeIterator(Handle<DebugInfo> debug_info,
113 BreakLocatorType type) 113 BreakLocatorType type)
114 : Iterator(debug_info), 114 : Iterator(debug_info),
115 reloc_iterator_(debug_info->abstract_code()->GetCode(), 115 reloc_iterator_(debug_info->abstract_code()->GetCode(),
116 GetModeMask(type)), 116 GetModeMask(type)),
117 source_position_iterator_( 117 source_position_iterator_(
118 debug_info->abstract_code()->GetCode()->source_position_table()), 118 debug_info->abstract_code()->GetCode()->source_position_table()) {
119 start_position_(debug_info_->shared()->start_position()) {
120 // There is at least one break location. 119 // There is at least one break location.
121 DCHECK(!Done()); 120 DCHECK(!Done());
122 Next(); 121 Next();
123 } 122 }
124 123
125 int BreakLocation::CodeIterator::GetModeMask(BreakLocatorType type) { 124 int BreakLocation::CodeIterator::GetModeMask(BreakLocatorType type) {
126 int mask = 0; 125 int mask = 0;
127 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_RETURN); 126 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_RETURN);
128 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_CALL); 127 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_CALL);
129 if (isolate()->is_tail_call_elimination_enabled()) { 128 if (isolate()->is_tail_call_elimination_enabled()) {
(...skipping 13 matching lines...) Expand all
143 // Iterate through reloc info stopping at each breakable code target. 142 // Iterate through reloc info stopping at each breakable code target.
144 bool first = break_index_ == -1; 143 bool first = break_index_ == -1;
145 144
146 if (!first) reloc_iterator_.next(); 145 if (!first) reloc_iterator_.next();
147 first = false; 146 first = false;
148 if (Done()) return; 147 if (Done()) return;
149 148
150 int offset = code_offset(); 149 int offset = code_offset();
151 while (!source_position_iterator_.done() && 150 while (!source_position_iterator_.done() &&
152 source_position_iterator_.code_offset() <= offset) { 151 source_position_iterator_.code_offset() <= offset) {
153 position_ = source_position_iterator_.source_position() - start_position_; 152 position_ = source_position_iterator_.source_position();
154 if (source_position_iterator_.is_statement()) { 153 if (source_position_iterator_.is_statement()) {
155 statement_position_ = position_; 154 statement_position_ = position_;
156 } 155 }
157 source_position_iterator_.Advance(); 156 source_position_iterator_.Advance();
158 } 157 }
159 158
160 DCHECK(RelocInfo::IsDebugBreakSlot(rmode()) || 159 DCHECK(RelocInfo::IsDebugBreakSlot(rmode()) ||
161 RelocInfo::IsDebuggerStatement(rmode())); 160 RelocInfo::IsDebuggerStatement(rmode()));
162 break_index_++; 161 break_index_++;
163 } 162 }
(...skipping 18 matching lines...) Expand all
182 return BreakLocation(debug_info_, type, code_offset(), position(), 181 return BreakLocation(debug_info_, type, code_offset(), position(),
183 statement_position()); 182 statement_position());
184 } 183 }
185 184
186 BreakLocation::BytecodeArrayIterator::BytecodeArrayIterator( 185 BreakLocation::BytecodeArrayIterator::BytecodeArrayIterator(
187 Handle<DebugInfo> debug_info, BreakLocatorType type) 186 Handle<DebugInfo> debug_info, BreakLocatorType type)
188 : Iterator(debug_info), 187 : Iterator(debug_info),
189 source_position_iterator_(debug_info->abstract_code() 188 source_position_iterator_(debug_info->abstract_code()
190 ->GetBytecodeArray() 189 ->GetBytecodeArray()
191 ->source_position_table()), 190 ->source_position_table()),
192 break_locator_type_(type), 191 break_locator_type_(type) {
193 start_position_(debug_info->shared()->start_position()) {
194 // There is at least one break location. 192 // There is at least one break location.
195 DCHECK(!Done()); 193 DCHECK(!Done());
196 Next(); 194 Next();
197 } 195 }
198 196
199 void BreakLocation::BytecodeArrayIterator::Next() { 197 void BreakLocation::BytecodeArrayIterator::Next() {
200 DisallowHeapAllocation no_gc; 198 DisallowHeapAllocation no_gc;
201 DCHECK(!Done()); 199 DCHECK(!Done());
202 bool first = break_index_ == -1; 200 bool first = break_index_ == -1;
203 while (!Done()) { 201 while (!Done()) {
204 if (!first) source_position_iterator_.Advance(); 202 if (!first) source_position_iterator_.Advance();
205 first = false; 203 first = false;
206 if (Done()) return; 204 if (Done()) return;
207 position_ = source_position_iterator_.source_position() - start_position_; 205 position_ = source_position_iterator_.source_position();
208 if (source_position_iterator_.is_statement()) { 206 if (source_position_iterator_.is_statement()) {
209 statement_position_ = position_; 207 statement_position_ = position_;
210 } 208 }
211 DCHECK(position_ >= 0); 209 DCHECK(position_ >= 0);
212 DCHECK(statement_position_ >= 0); 210 DCHECK(statement_position_ >= 0);
213 211
214 enum DebugBreakType type = GetDebugBreakType(); 212 enum DebugBreakType type = GetDebugBreakType();
215 if (type == NOT_DEBUG_BREAK) continue; 213 if (type == NOT_DEBUG_BREAK) continue;
216 214
217 if (break_locator_type_ == ALL_BREAK_LOCATIONS) break; 215 if (break_locator_type_ == ALL_BREAK_LOCATIONS) break;
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 797
800 // Make sure the function has set up the debug info. 798 // Make sure the function has set up the debug info.
801 Handle<SharedFunctionInfo> shared = Handle<SharedFunctionInfo>::cast(result); 799 Handle<SharedFunctionInfo> shared = Handle<SharedFunctionInfo>::cast(result);
802 if (!EnsureDebugInfo(shared, Handle<JSFunction>::null())) { 800 if (!EnsureDebugInfo(shared, Handle<JSFunction>::null())) {
803 // Return if retrieving debug info failed. 801 // Return if retrieving debug info failed.
804 return false; 802 return false;
805 } 803 }
806 804
807 // Find position within function. The script position might be before the 805 // Find position within function. The script position might be before the
808 // source position of the first function. 806 // source position of the first function.
809 int position;
810 if (shared->start_position() > *source_position) { 807 if (shared->start_position() > *source_position) {
811 position = 0; 808 *source_position = shared->start_position();
812 } else {
813 position = *source_position - shared->start_position();
814 } 809 }
815 810
816 Handle<DebugInfo> debug_info(shared->GetDebugInfo()); 811 Handle<DebugInfo> debug_info(shared->GetDebugInfo());
817 // Source positions starts with zero.
818 DCHECK(position >= 0);
819 812
820 // Find the break point and change it. 813 // Find the break point and change it.
821 BreakLocation location = 814 BreakLocation location =
822 BreakLocation::FromPosition(debug_info, position, alignment); 815 BreakLocation::FromPosition(debug_info, *source_position, alignment);
823 location.SetBreakPoint(break_point_object); 816 location.SetBreakPoint(break_point_object);
824 817
825 feature_tracker()->Track(DebugFeatureTracker::kBreakPoint); 818 feature_tracker()->Track(DebugFeatureTracker::kBreakPoint);
826 819
827 position = (alignment == STATEMENT_ALIGNED) ? location.statement_position() 820 *source_position = (alignment == STATEMENT_ALIGNED)
828 : location.position(); 821 ? location.statement_position()
829 822 : location.position();
830 *source_position = position + shared->start_position();
831 823
832 // At least one active break point now. 824 // At least one active break point now.
833 DCHECK(debug_info->GetBreakPointCount() > 0); 825 DCHECK(debug_info->GetBreakPointCount() > 0);
834 return true; 826 return true;
835 } 827 }
836 828
837 829
838 void Debug::ClearBreakPoint(Handle<Object> break_point_object) { 830 void Debug::ClearBreakPoint(Handle<Object> break_point_object) {
839 HandleScope scope(isolate_); 831 HandleScope scope(isolate_);
840 832
(...skipping 1751 matching lines...) Expand 10 before | Expand all | Expand 10 after
2592 } 2584 }
2593 2585
2594 2586
2595 void LockingCommandMessageQueue::Clear() { 2587 void LockingCommandMessageQueue::Clear() {
2596 base::LockGuard<base::Mutex> lock_guard(&mutex_); 2588 base::LockGuard<base::Mutex> lock_guard(&mutex_);
2597 queue_.Clear(); 2589 queue_.Clear();
2598 } 2590 }
2599 2591
2600 } // namespace internal 2592 } // namespace internal
2601 } // namespace v8 2593 } // namespace v8
OLDNEW
« no previous file with comments | « src/debug/debug.h ('k') | src/debug/debug.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698