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

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

Issue 2221333002: [debugger] reapply break points after clearing one shots. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 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') | no next file » | 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 <memory> 7 #include <memory>
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/arguments.h" 10 #include "src/arguments.h"
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 void BreakLocation::ClearBreakPoint(Handle<Object> break_point_object) { 329 void BreakLocation::ClearBreakPoint(Handle<Object> break_point_object) {
330 // Clear the break point information. 330 // Clear the break point information.
331 DebugInfo::ClearBreakPoint(debug_info_, code_offset_, break_point_object); 331 DebugInfo::ClearBreakPoint(debug_info_, code_offset_, break_point_object);
332 // If there are no more break points here remove the debug break. 332 // If there are no more break points here remove the debug break.
333 if (!HasBreakPoint()) { 333 if (!HasBreakPoint()) {
334 ClearDebugBreak(); 334 ClearDebugBreak();
335 DCHECK(!IsDebugBreak()); 335 DCHECK(!IsDebugBreak());
336 } 336 }
337 } 337 }
338 338
339 void BreakLocation::ReapplyBreakPoint() {
340 // We indeed have a break point here to re-apply.
341 DCHECK(HasBreakPoint());
342 // The break point is currently not applied to code.
343 DCHECK(!IsDebugBreak());
344 SetDebugBreak();
345 }
339 346
340 void BreakLocation::SetOneShot() { 347 void BreakLocation::SetOneShot() {
341 // Debugger statement always calls debugger. No need to modify it. 348 // Debugger statement always calls debugger. No need to modify it.
342 if (IsDebuggerStatement()) return; 349 if (IsDebuggerStatement()) return;
343 350
344 // If there is a real break point here no more to do. 351 // If there is a real break point here no more to do.
345 if (HasBreakPoint()) { 352 if (HasBreakPoint()) {
346 DCHECK(IsDebugBreak()); 353 DCHECK(IsDebugBreak());
347 return; 354 return;
348 } 355 }
349 356
350 // Patch code with debug break. 357 // Patch code with debug break.
351 SetDebugBreak(); 358 SetDebugBreak();
352 } 359 }
353 360
354 361
355 void BreakLocation::ClearOneShot() { 362 void BreakLocation::ClearOneShot() {
356 // Debugger statement always calls debugger. No need to modify it. 363 // Debugger statement always calls debugger. No need to modify it.
357 if (IsDebuggerStatement()) return; 364 if (IsDebuggerStatement()) return;
358 365
359 // If there is a real break point here no more to do.
360 if (HasBreakPoint()) {
361 DCHECK(IsDebugBreak());
362 return;
363 }
364
365 // Patch code removing debug break. 366 // Patch code removing debug break.
366 ClearDebugBreak(); 367 ClearDebugBreak();
367 DCHECK(!IsDebugBreak()); 368 DCHECK(!IsDebugBreak());
368 } 369 }
369 370
370 371
371 void BreakLocation::SetDebugBreak() { 372 void BreakLocation::SetDebugBreak() {
372 // Debugger statement always calls debugger. No need to modify it. 373 // Debugger statement always calls debugger. No need to modify it.
373 if (IsDebuggerStatement()) return; 374 if (IsDebuggerStatement()) return;
374 375
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after
1120 } 1121 }
1121 1122
1122 1123
1123 // Clears all the one-shot break points that are currently set. Normally this 1124 // Clears all the one-shot break points that are currently set. Normally this
1124 // function is called each time a break point is hit as one shot break points 1125 // function is called each time a break point is hit as one shot break points
1125 // are used to support stepping. 1126 // are used to support stepping.
1126 void Debug::ClearOneShot() { 1127 void Debug::ClearOneShot() {
1127 // The current implementation just runs through all the breakpoints. When the 1128 // The current implementation just runs through all the breakpoints. When the
1128 // last break point for a function is removed that function is automatically 1129 // last break point for a function is removed that function is automatically
1129 // removed from the list. 1130 // removed from the list.
1131 DisallowHeapAllocation no_gc;
1130 for (DebugInfoListNode* node = debug_info_list_; node != NULL; 1132 for (DebugInfoListNode* node = debug_info_list_; node != NULL;
1131 node = node->next()) { 1133 node = node->next()) {
1134 Handle<DebugInfo> debug_info = node->debug_info();
1132 for (std::unique_ptr<BreakLocation::Iterator> it( 1135 for (std::unique_ptr<BreakLocation::Iterator> it(
1133 BreakLocation::GetIterator(node->debug_info())); 1136 BreakLocation::GetIterator(debug_info));
1134 !it->Done(); it->Next()) { 1137 !it->Done(); it->Next()) {
1135 it->GetBreakLocation().ClearOneShot(); 1138 it->GetBreakLocation().ClearOneShot();
1136 } 1139 }
1140 // Re-apply break points after having cleared everything.
1141 if (debug_info->break_points()->IsUndefined(isolate_)) continue;
1142 FixedArray* break_points = debug_info->break_points();
1143 for (int i = 0; i < break_points->length(); i++) {
1144 if (break_points->get(i)->IsUndefined(isolate_)) continue;
1145 BreakPointInfo* break_point_info =
1146 BreakPointInfo::cast(break_points->get(i));
1147 if (break_point_info->GetBreakPointCount() == 0) continue;
1148 BreakLocation break_location = BreakLocation::FromPosition(
1149 debug_info, break_point_info->source_position(),
1150 BREAK_POSITION_ALIGNED);
1151 break_location.ReapplyBreakPoint();
1152 }
1137 } 1153 }
1138 } 1154 }
1139 1155
1140 1156
1141 bool MatchingCodeTargets(Code* target1, Code* target2) { 1157 bool MatchingCodeTargets(Code* target1, Code* target2) {
1142 if (target1 == target2) return true; 1158 if (target1 == target2) return true;
1143 if (target1->kind() != target2->kind()) return false; 1159 if (target1->kind() != target2->kind()) return false;
1144 return target1->is_handler() || target1->is_inline_cache_stub(); 1160 return target1->is_handler() || target1->is_inline_cache_stub();
1145 } 1161 }
1146 1162
(...skipping 1430 matching lines...) Expand 10 before | Expand all | Expand 10 after
2577 } 2593 }
2578 2594
2579 2595
2580 void LockingCommandMessageQueue::Clear() { 2596 void LockingCommandMessageQueue::Clear() {
2581 base::LockGuard<base::Mutex> lock_guard(&mutex_); 2597 base::LockGuard<base::Mutex> lock_guard(&mutex_);
2582 queue_.Clear(); 2598 queue_.Clear();
2583 } 2599 }
2584 2600
2585 } // namespace internal 2601 } // namespace internal
2586 } // namespace v8 2602 } // namespace v8
OLDNEW
« no previous file with comments | « src/debug/debug.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698