| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/debugger.h" | 5 #include "vm/debugger.h" |
| 6 | 6 |
| 7 #include "vm/code_generator.h" | 7 #include "vm/code_generator.h" |
| 8 #include "vm/code_patcher.h" | 8 #include "vm/code_patcher.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 | 62 |
| 63 | 63 |
| 64 void SourceBreakpoint::Disable() { | 64 void SourceBreakpoint::Disable() { |
| 65 is_enabled_ = false; | 65 is_enabled_ = false; |
| 66 Isolate::Current()->debugger()->SyncBreakpoint(this); | 66 Isolate::Current()->debugger()->SyncBreakpoint(this); |
| 67 } | 67 } |
| 68 | 68 |
| 69 | 69 |
| 70 RawScript* SourceBreakpoint::SourceCode() { | 70 RawScript* SourceBreakpoint::SourceCode() { |
| 71 const Function& func = Function::Handle(function_); | 71 const Function& func = Function::Handle(function_); |
| 72 const Class& cls = Class::Handle(func.owner()); | 72 return func.script(); |
| 73 return cls.script(); | |
| 74 } | 73 } |
| 75 | 74 |
| 76 | 75 |
| 77 RawString* SourceBreakpoint::SourceUrl() { | 76 RawString* SourceBreakpoint::SourceUrl() { |
| 78 const Script& script = Script::Handle(SourceCode()); | 77 const Script& script = Script::Handle(SourceCode()); |
| 79 return script.url(); | 78 return script.url(); |
| 80 } | 79 } |
| 81 | 80 |
| 82 | 81 |
| 83 intptr_t SourceBreakpoint::LineNumber() { | 82 intptr_t SourceBreakpoint::LineNumber() { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 ASSERT(isolate != NULL); | 128 ASSERT(isolate != NULL); |
| 130 const Code& code = Code::Handle(Code::LookupCode(pc_)); | 129 const Code& code = Code::Handle(Code::LookupCode(pc_)); |
| 131 function_ = code.function(); | 130 function_ = code.function(); |
| 132 } | 131 } |
| 133 return function_; | 132 return function_; |
| 134 } | 133 } |
| 135 | 134 |
| 136 | 135 |
| 137 const char* Debugger::QualifiedFunctionName(const Function& func) { | 136 const char* Debugger::QualifiedFunctionName(const Function& func) { |
| 138 const String& func_name = String::Handle(func.name()); | 137 const String& func_name = String::Handle(func.name()); |
| 139 Class& func_class = Class::Handle(func.owner()); | 138 Class& func_class = Class::Handle(func.Owner()); |
| 140 String& class_name = String::Handle(func_class.Name()); | 139 String& class_name = String::Handle(func_class.Name()); |
| 141 | 140 |
| 142 const char* kFormat = "%s%s%s"; | 141 const char* kFormat = "%s%s%s"; |
| 143 intptr_t len = OS::SNPrint(NULL, 0, kFormat, | 142 intptr_t len = OS::SNPrint(NULL, 0, kFormat, |
| 144 func_class.IsTopLevel() ? "" : class_name.ToCString(), | 143 func_class.IsTopLevel() ? "" : class_name.ToCString(), |
| 145 func_class.IsTopLevel() ? "" : ".", | 144 func_class.IsTopLevel() ? "" : ".", |
| 146 func_name.ToCString()); | 145 func_name.ToCString()); |
| 147 len++; // String terminator. | 146 len++; // String terminator. |
| 148 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 147 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
| 149 OS::SNPrint(chars, len, kFormat, | 148 OS::SNPrint(chars, len, kFormat, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 161 | 160 |
| 162 | 161 |
| 163 RawString* ActivationFrame::SourceUrl() { | 162 RawString* ActivationFrame::SourceUrl() { |
| 164 const Script& script = Script::Handle(SourceScript()); | 163 const Script& script = Script::Handle(SourceScript()); |
| 165 return script.url(); | 164 return script.url(); |
| 166 } | 165 } |
| 167 | 166 |
| 168 | 167 |
| 169 RawScript* ActivationFrame::SourceScript() { | 168 RawScript* ActivationFrame::SourceScript() { |
| 170 const Function& func = DartFunction(); | 169 const Function& func = DartFunction(); |
| 171 const Class& cls = Class::Handle(func.owner()); | 170 return func.script(); |
| 172 return cls.script(); | |
| 173 } | 171 } |
| 174 | 172 |
| 175 | 173 |
| 176 RawLibrary* ActivationFrame::Library() { | 174 RawLibrary* ActivationFrame::Library() { |
| 177 const Function& func = DartFunction(); | 175 const Function& func = DartFunction(); |
| 178 const Class& cls = Class::Handle(func.owner()); | 176 const Class& cls = Class::Handle(func.Owner()); |
| 179 return cls.library(); | 177 return cls.library(); |
| 180 } | 178 } |
| 181 | 179 |
| 182 | 180 |
| 183 void ActivationFrame::GetPcDescriptors() { | 181 void ActivationFrame::GetPcDescriptors() { |
| 184 if (pc_desc_.IsNull()) { | 182 if (pc_desc_.IsNull()) { |
| 185 const Function& func = DartFunction(); | 183 const Function& func = DartFunction(); |
| 186 ASSERT(!func.HasOptimizedCode()); | 184 ASSERT(!func.HasOptimizedCode()); |
| 187 Code& code = Code::Handle(func.unoptimized_code()); | 185 Code& code = Code::Handle(func.unoptimized_code()); |
| 188 ASSERT(!code.IsNull()); | 186 ASSERT(!code.IsNull()); |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 pc_ = 0ul; | 479 pc_ = 0ul; |
| 482 src_bpt_ = NULL; | 480 src_bpt_ = NULL; |
| 483 next_ = NULL; | 481 next_ = NULL; |
| 484 breakpoint_kind_ = PcDescriptors::kOther; | 482 breakpoint_kind_ = PcDescriptors::kOther; |
| 485 #endif | 483 #endif |
| 486 } | 484 } |
| 487 | 485 |
| 488 | 486 |
| 489 RawScript* CodeBreakpoint::SourceCode() { | 487 RawScript* CodeBreakpoint::SourceCode() { |
| 490 const Function& func = Function::Handle(function_); | 488 const Function& func = Function::Handle(function_); |
| 491 const Class& cls = Class::Handle(func.owner()); | 489 return func.script(); |
| 492 return cls.script(); | |
| 493 } | 490 } |
| 494 | 491 |
| 495 | 492 |
| 496 RawString* CodeBreakpoint::SourceUrl() { | 493 RawString* CodeBreakpoint::SourceUrl() { |
| 497 const Script& script = Script::Handle(SourceCode()); | 494 const Script& script = Script::Handle(SourceCode()); |
| 498 return script.url(); | 495 return script.url(); |
| 499 } | 496 } |
| 500 | 497 |
| 501 | 498 |
| 502 intptr_t CodeBreakpoint::LineNumber() { | 499 intptr_t CodeBreakpoint::LineNumber() { |
| (...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1268 } | 1265 } |
| 1269 | 1266 |
| 1270 | 1267 |
| 1271 bool Debugger::IsDebuggable(const Function& func) { | 1268 bool Debugger::IsDebuggable(const Function& func) { |
| 1272 RawFunction::Kind fkind = func.kind(); | 1269 RawFunction::Kind fkind = func.kind(); |
| 1273 if ((fkind == RawFunction::kImplicitGetter) || | 1270 if ((fkind == RawFunction::kImplicitGetter) || |
| 1274 (fkind == RawFunction::kImplicitSetter) || | 1271 (fkind == RawFunction::kImplicitSetter) || |
| 1275 (fkind == RawFunction::kConstImplicitGetter)) { | 1272 (fkind == RawFunction::kConstImplicitGetter)) { |
| 1276 return false; | 1273 return false; |
| 1277 } | 1274 } |
| 1278 const Class& cls = Class::Handle(func.owner()); | 1275 const Class& cls = Class::Handle(func.Owner()); |
| 1279 const Library& lib = Library::Handle(cls.library()); | 1276 const Library& lib = Library::Handle(cls.library()); |
| 1280 return lib.IsDebuggable(); | 1277 return lib.IsDebuggable(); |
| 1281 } | 1278 } |
| 1282 | 1279 |
| 1283 | 1280 |
| 1284 void Debugger::SignalBpReached() { | 1281 void Debugger::SignalBpReached() { |
| 1285 if (ignore_breakpoints_) { | 1282 if (ignore_breakpoints_) { |
| 1286 return; | 1283 return; |
| 1287 } | 1284 } |
| 1288 DebuggerStackTrace* stack_trace = CollectStackTrace(); | 1285 DebuggerStackTrace* stack_trace = CollectStackTrace(); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1419 // there are any breakpoints. The parent function is the actual method on | 1416 // there are any breakpoints. The parent function is the actual method on |
| 1420 // which the user sets breakpoints. | 1417 // which the user sets breakpoints. |
| 1421 lookup_function = func.parent_function(); | 1418 lookup_function = func.parent_function(); |
| 1422 ASSERT(!lookup_function.IsNull()); | 1419 ASSERT(!lookup_function.IsNull()); |
| 1423 } | 1420 } |
| 1424 SourceBreakpoint* bpt = src_breakpoints_; | 1421 SourceBreakpoint* bpt = src_breakpoints_; |
| 1425 while (bpt != NULL) { | 1422 while (bpt != NULL) { |
| 1426 if (lookup_function.raw() == bpt->function()) { | 1423 if (lookup_function.raw() == bpt->function()) { |
| 1427 // Check if the breakpoint is inside a closure or local function | 1424 // Check if the breakpoint is inside a closure or local function |
| 1428 // within the newly compiled function. | 1425 // within the newly compiled function. |
| 1429 Class& owner = Class::Handle(lookup_function.owner()); | 1426 Class& owner = Class::Handle(lookup_function.Owner()); |
| 1430 Function& closure = | 1427 Function& closure = |
| 1431 Function::Handle(owner.LookupClosureFunction(bpt->token_pos())); | 1428 Function::Handle(owner.LookupClosureFunction(bpt->token_pos())); |
| 1432 if (!closure.IsNull() && (closure.raw() != lookup_function.raw())) { | 1429 if (!closure.IsNull() && (closure.raw() != lookup_function.raw())) { |
| 1433 if (verbose) { | 1430 if (verbose) { |
| 1434 OS::Print("Resetting pending breakpoint to function %s\n", | 1431 OS::Print("Resetting pending breakpoint to function %s\n", |
| 1435 closure.ToFullyQualifiedCString()); | 1432 closure.ToFullyQualifiedCString()); |
| 1436 } | 1433 } |
| 1437 bpt->set_function(closure); | 1434 bpt->set_function(closure); |
| 1438 } else { | 1435 } else { |
| 1439 if (verbose) { | 1436 if (verbose) { |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1568 } | 1565 } |
| 1569 | 1566 |
| 1570 | 1567 |
| 1571 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { | 1568 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { |
| 1572 ASSERT(bpt->next() == NULL); | 1569 ASSERT(bpt->next() == NULL); |
| 1573 bpt->set_next(code_breakpoints_); | 1570 bpt->set_next(code_breakpoints_); |
| 1574 code_breakpoints_ = bpt; | 1571 code_breakpoints_ = bpt; |
| 1575 } | 1572 } |
| 1576 | 1573 |
| 1577 } // namespace dart | 1574 } // namespace dart |
| OLD | NEW |