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

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

Issue 2095893002: Use source position table for unoptimized code. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix gc mole 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/liveedit.cc » ('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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 return v8::Utils::ToLocal(native_context); 59 return v8::Utils::ToLocal(native_context);
60 } 60 }
61 61
62 BreakLocation::BreakLocation(Handle<DebugInfo> debug_info, DebugBreakType type, 62 BreakLocation::BreakLocation(Handle<DebugInfo> debug_info, DebugBreakType type,
63 int code_offset, int position, 63 int code_offset, int position,
64 int statement_position) 64 int statement_position)
65 : debug_info_(debug_info), 65 : debug_info_(debug_info),
66 code_offset_(code_offset), 66 code_offset_(code_offset),
67 type_(type), 67 type_(type),
68 position_(position), 68 position_(position),
69 statement_position_(statement_position) {} 69 statement_position_(statement_position) {
70 #ifdef DEBUG
71 if (type == DEBUG_BREAK_SLOT_AT_RETURN) {
72 int return_position = 0;
73 SharedFunctionInfo* shared = debug_info->shared();
74 if (shared->HasSourceCode()) {
75 return_position =
76 std::max(shared->end_position() - shared->start_position() - 1, 0);
77 }
78 CHECK_EQ(return_position, position);
79 CHECK_EQ(return_position, statement_position);
80 }
81 #endif // DEBUG
82 }
70 83
71 BreakLocation::Iterator* BreakLocation::GetIterator( 84 BreakLocation::Iterator* BreakLocation::GetIterator(
72 Handle<DebugInfo> debug_info, BreakLocatorType type) { 85 Handle<DebugInfo> debug_info, BreakLocatorType type) {
73 if (debug_info->abstract_code()->IsBytecodeArray()) { 86 if (debug_info->abstract_code()->IsBytecodeArray()) {
74 return new BytecodeArrayIterator(debug_info, type); 87 return new BytecodeArrayIterator(debug_info, type);
75 } else { 88 } else {
76 return new CodeIterator(debug_info, type); 89 return new CodeIterator(debug_info, type);
77 } 90 }
78 } 91 }
79 92
80 BreakLocation::Iterator::Iterator(Handle<DebugInfo> debug_info) 93 BreakLocation::Iterator::Iterator(Handle<DebugInfo> debug_info)
81 : debug_info_(debug_info), 94 : debug_info_(debug_info),
82 break_index_(-1), 95 break_index_(-1),
83 position_(1), 96 position_(1),
84 statement_position_(1) {} 97 statement_position_(1) {}
85 98
86 int BreakLocation::Iterator::ReturnPosition() {
87 if (debug_info_->shared()->HasSourceCode()) {
88 return debug_info_->shared()->end_position() -
89 debug_info_->shared()->start_position() - 1;
90 } else {
91 return 0;
92 }
93 }
94
95 BreakLocation::CodeIterator::CodeIterator(Handle<DebugInfo> debug_info, 99 BreakLocation::CodeIterator::CodeIterator(Handle<DebugInfo> debug_info,
96 BreakLocatorType type) 100 BreakLocatorType type)
97 : Iterator(debug_info), 101 : Iterator(debug_info),
98 reloc_iterator_(debug_info->abstract_code()->GetCode(), 102 reloc_iterator_(debug_info->abstract_code()->GetCode(),
99 GetModeMask(type)) { 103 GetModeMask(type)),
104 source_position_iterator_(
105 debug_info->abstract_code()->GetCode()->source_position_table()),
106 start_position_(debug_info_->shared()->start_position()) {
100 // There is at least one break location. 107 // There is at least one break location.
101 DCHECK(!Done()); 108 DCHECK(!Done());
102 Next(); 109 Next();
103 } 110 }
104 111
105 int BreakLocation::CodeIterator::GetModeMask(BreakLocatorType type) { 112 int BreakLocation::CodeIterator::GetModeMask(BreakLocatorType type) {
106 int mask = 0; 113 int mask = 0;
107 mask |= RelocInfo::ModeMask(RelocInfo::POSITION);
108 mask |= RelocInfo::ModeMask(RelocInfo::STATEMENT_POSITION);
109 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_RETURN); 114 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_RETURN);
110 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_CALL); 115 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_CALL);
111 if (isolate()->is_tail_call_elimination_enabled()) { 116 if (isolate()->is_tail_call_elimination_enabled()) {
112 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_TAIL_CALL); 117 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_TAIL_CALL);
113 } 118 }
114 if (type == ALL_BREAK_LOCATIONS) { 119 if (type == ALL_BREAK_LOCATIONS) {
115 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION); 120 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION);
116 mask |= RelocInfo::ModeMask(RelocInfo::DEBUGGER_STATEMENT); 121 mask |= RelocInfo::ModeMask(RelocInfo::DEBUGGER_STATEMENT);
117 } 122 }
118 return mask; 123 return mask;
119 } 124 }
120 125
121 void BreakLocation::CodeIterator::Next() { 126 void BreakLocation::CodeIterator::Next() {
122 DisallowHeapAllocation no_gc; 127 DisallowHeapAllocation no_gc;
123 DCHECK(!Done()); 128 DCHECK(!Done());
124 129
125 // Iterate through reloc info stopping at each breakable code target. 130 // Iterate through reloc info stopping at each breakable code target.
126 bool first = break_index_ == -1; 131 bool first = break_index_ == -1;
127 while (!Done()) {
128 if (!first) reloc_iterator_.next();
129 first = false;
130 if (Done()) return;
131 132
132 // Whenever a statement position or (plain) position is passed update the 133 if (!first) reloc_iterator_.next();
133 // current value of these. 134 first = false;
134 if (RelocInfo::IsPosition(rmode())) { 135 if (Done()) return;
135 if (RelocInfo::IsStatementPosition(rmode())) { 136
136 statement_position_ = static_cast<int>( 137 int offset = code_offset();
137 rinfo()->data() - debug_info_->shared()->start_position()); 138 while (!source_position_iterator_.done() &&
138 } 139 source_position_iterator_.code_offset() <= offset) {
139 // Always update the position as we don't want that to be before the 140 position_ = source_position_iterator_.source_position() - start_position_;
140 // statement position. 141 if (source_position_iterator_.is_statement()) {
141 position_ = static_cast<int>(rinfo()->data() - 142 statement_position_ = position_;
142 debug_info_->shared()->start_position());
143 DCHECK(position_ >= 0);
144 DCHECK(statement_position_ >= 0);
145 continue;
146 } 143 }
144 source_position_iterator_.Advance();
145 }
147 146
148 DCHECK(RelocInfo::IsDebugBreakSlot(rmode()) || 147 DCHECK(RelocInfo::IsDebugBreakSlot(rmode()) ||
149 RelocInfo::IsDebuggerStatement(rmode())); 148 RelocInfo::IsDebuggerStatement(rmode()));
150
151 if (RelocInfo::IsDebugBreakSlotAtReturn(rmode())) {
152 // Set the positions to the end of the function.
153 statement_position_ = position_ = ReturnPosition();
154 }
155
156 break;
157 }
158 break_index_++; 149 break_index_++;
159 } 150 }
160 151
161 BreakLocation BreakLocation::CodeIterator::GetBreakLocation() { 152 BreakLocation BreakLocation::CodeIterator::GetBreakLocation() {
162 DebugBreakType type; 153 DebugBreakType type;
163 if (RelocInfo::IsDebugBreakSlotAtReturn(rmode())) { 154 if (RelocInfo::IsDebugBreakSlotAtReturn(rmode())) {
164 type = DEBUG_BREAK_SLOT_AT_RETURN; 155 type = DEBUG_BREAK_SLOT_AT_RETURN;
165 } else if (RelocInfo::IsDebugBreakSlotAtCall(rmode())) { 156 } else if (RelocInfo::IsDebugBreakSlotAtCall(rmode())) {
166 type = DEBUG_BREAK_SLOT_AT_CALL; 157 type = DEBUG_BREAK_SLOT_AT_CALL;
167 } else if (RelocInfo::IsDebugBreakSlotAtTailCall(rmode())) { 158 } else if (RelocInfo::IsDebugBreakSlotAtTailCall(rmode())) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 DCHECK(position_ >= 0); 198 DCHECK(position_ >= 0);
208 DCHECK(statement_position_ >= 0); 199 DCHECK(statement_position_ >= 0);
209 200
210 enum DebugBreakType type = GetDebugBreakType(); 201 enum DebugBreakType type = GetDebugBreakType();
211 if (type == NOT_DEBUG_BREAK) continue; 202 if (type == NOT_DEBUG_BREAK) continue;
212 203
213 if (break_locator_type_ == ALL_BREAK_LOCATIONS) break; 204 if (break_locator_type_ == ALL_BREAK_LOCATIONS) break;
214 205
215 DCHECK_EQ(CALLS_AND_RETURNS, break_locator_type_); 206 DCHECK_EQ(CALLS_AND_RETURNS, break_locator_type_);
216 if (type == DEBUG_BREAK_SLOT_AT_CALL) break; 207 if (type == DEBUG_BREAK_SLOT_AT_CALL) break;
217 if (type == DEBUG_BREAK_SLOT_AT_RETURN) { 208 if (type == DEBUG_BREAK_SLOT_AT_RETURN) break;
218 DCHECK_EQ(ReturnPosition(), position_);
219 DCHECK_EQ(ReturnPosition(), statement_position_);
220 break;
221 }
222 } 209 }
223 break_index_++; 210 break_index_++;
224 } 211 }
225 212
226 BreakLocation::DebugBreakType 213 BreakLocation::DebugBreakType
227 BreakLocation::BytecodeArrayIterator::GetDebugBreakType() { 214 BreakLocation::BytecodeArrayIterator::GetDebugBreakType() {
228 BytecodeArray* bytecode_array = debug_info_->original_bytecode_array(); 215 BytecodeArray* bytecode_array = debug_info_->original_bytecode_array();
229 interpreter::Bytecode bytecode = 216 interpreter::Bytecode bytecode =
230 interpreter::Bytecodes::FromByte(bytecode_array->get(code_offset())); 217 interpreter::Bytecodes::FromByte(bytecode_array->get(code_offset()));
231 218
(...skipping 2364 matching lines...) Expand 10 before | Expand all | Expand 10 after
2596 } 2583 }
2597 2584
2598 2585
2599 void LockingCommandMessageQueue::Clear() { 2586 void LockingCommandMessageQueue::Clear() {
2600 base::LockGuard<base::Mutex> lock_guard(&mutex_); 2587 base::LockGuard<base::Mutex> lock_guard(&mutex_);
2601 queue_.Clear(); 2588 queue_.Clear();
2602 } 2589 }
2603 2590
2604 } // namespace internal 2591 } // namespace internal
2605 } // namespace v8 2592 } // namespace v8
OLDNEW
« no previous file with comments | « src/debug/debug.h ('k') | src/debug/liveedit.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698