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 #ifndef VM_DEBUGGER_H_ | 5 #ifndef VM_DEBUGGER_H_ |
6 #define VM_DEBUGGER_H_ | 6 #define VM_DEBUGGER_H_ |
7 | 7 |
8 #include "include/dart_tools_api.h" | 8 #include "include/dart_tools_api.h" |
9 | 9 |
10 #include "vm/object.h" | 10 #include "vm/object.h" |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 // change when the underlying code gets compiled. | 92 // change when the underlying code gets compiled. |
93 // A latent breakpoint represents a breakpoint location in Dart source | 93 // A latent breakpoint represents a breakpoint location in Dart source |
94 // that is not loaded in the VM when the breakpoint is requested. | 94 // that is not loaded in the VM when the breakpoint is requested. |
95 // When a script with matching url is loaded, a latent breakpoint | 95 // When a script with matching url is loaded, a latent breakpoint |
96 // becomes an unresolved breakpoint. | 96 // becomes an unresolved breakpoint. |
97 class BreakpointLocation { | 97 class BreakpointLocation { |
98 public: | 98 public: |
99 // Create a new unresolved breakpoint. | 99 // Create a new unresolved breakpoint. |
100 BreakpointLocation(const Script& script, | 100 BreakpointLocation(const Script& script, |
101 intptr_t token_pos, | 101 intptr_t token_pos, |
102 intptr_t end_token_pos); | 102 intptr_t end_token_pos, |
| 103 intptr_t requested_column_number); |
103 // Create a new latent breakpoint. | 104 // Create a new latent breakpoint. |
104 BreakpointLocation(const String& url, | 105 BreakpointLocation(const String& url, |
105 intptr_t line_number); | 106 intptr_t requested_line_number, |
| 107 intptr_t requested_column_number); |
106 | 108 |
107 ~BreakpointLocation(); | 109 ~BreakpointLocation(); |
108 | 110 |
109 RawFunction* function() const { return function_; } | 111 RawFunction* function() const { return function_; } |
110 intptr_t token_pos() const { return token_pos_; } | 112 intptr_t token_pos() const { return token_pos_; } |
111 intptr_t end_token_pos() const { return end_token_pos_; } | 113 intptr_t end_token_pos() const { return end_token_pos_; } |
112 | 114 |
113 RawScript* script() const { return script_; } | 115 RawScript* script() const { return script_; } |
114 RawString* url() const { return url_; } | 116 RawString* url() const { return url_; } |
| 117 |
| 118 intptr_t requested_line_number() { return requested_line_number_; } |
| 119 intptr_t requested_column_number() { return requested_column_number_; } |
| 120 |
115 intptr_t LineNumber(); | 121 intptr_t LineNumber(); |
| 122 intptr_t ColumnNumber(); |
116 | 123 |
117 void GetCodeLocation(Library* lib, Script* script, intptr_t* token_pos); | 124 void GetCodeLocation(Library* lib, Script* script, intptr_t* token_pos); |
118 | 125 |
119 Breakpoint* AddRepeated(Debugger* dbg); | 126 Breakpoint* AddRepeated(Debugger* dbg); |
120 Breakpoint* AddSingleShot(Debugger* dbg); | 127 Breakpoint* AddSingleShot(Debugger* dbg); |
121 Breakpoint* AddPerClosure(Debugger* dbg, const Instance& closure); | 128 Breakpoint* AddPerClosure(Debugger* dbg, const Instance& closure); |
122 | 129 |
123 bool AnyEnabled() const; | 130 bool AnyEnabled() const; |
124 bool IsResolved() const { return is_resolved_; } | 131 bool IsResolved() const { return is_resolved_; } |
125 bool IsLatent() const { return token_pos_ < 0; } | 132 bool IsLatent() const { return token_pos_ < 0; } |
(...skipping 11 matching lines...) Expand all Loading... |
137 Breakpoint* breakpoints() const { return this->conditions_; } | 144 Breakpoint* breakpoints() const { return this->conditions_; } |
138 void set_breakpoints(Breakpoint* head) { this->conditions_ = head; } | 145 void set_breakpoints(Breakpoint* head) { this->conditions_ = head; } |
139 | 146 |
140 RawScript* script_; | 147 RawScript* script_; |
141 RawString* url_; | 148 RawString* url_; |
142 intptr_t token_pos_; | 149 intptr_t token_pos_; |
143 intptr_t end_token_pos_; | 150 intptr_t end_token_pos_; |
144 bool is_resolved_; | 151 bool is_resolved_; |
145 BreakpointLocation* next_; | 152 BreakpointLocation* next_; |
146 Breakpoint* conditions_; | 153 Breakpoint* conditions_; |
| 154 intptr_t requested_line_number_; |
| 155 intptr_t requested_column_number_; |
147 | 156 |
148 // Valid for resolved breakpoints: | 157 // Valid for resolved breakpoints: |
149 RawFunction* function_; | 158 RawFunction* function_; |
150 intptr_t line_number_; | 159 intptr_t line_number_; |
| 160 intptr_t column_number_; |
151 | 161 |
152 friend class Debugger; | 162 friend class Debugger; |
153 DISALLOW_COPY_AND_ASSIGN(BreakpointLocation); | 163 DISALLOW_COPY_AND_ASSIGN(BreakpointLocation); |
154 }; | 164 }; |
155 | 165 |
156 | 166 |
157 // CodeBreakpoint represents a location in compiled code. There may be | 167 // CodeBreakpoint represents a location in compiled code. There may be |
158 // more than one CodeBreakpoint for one BreakpointLocation, e.g. when a | 168 // more than one CodeBreakpoint for one BreakpointLocation, e.g. when a |
159 // function gets compiled as a regular function and as a closure. | 169 // function gets compiled as a regular function and as a closure. |
160 class CodeBreakpoint { | 170 class CodeBreakpoint { |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 | 463 |
454 // Set breakpoint at closest location to function entry. | 464 // Set breakpoint at closest location to function entry. |
455 Breakpoint* SetBreakpointAtEntry(const Function& target_function, | 465 Breakpoint* SetBreakpointAtEntry(const Function& target_function, |
456 bool single_shot); | 466 bool single_shot); |
457 Breakpoint* SetBreakpointAtActivation(const Instance& closure); | 467 Breakpoint* SetBreakpointAtActivation(const Instance& closure); |
458 Breakpoint* BreakpointAtActivation(const Instance& closure); | 468 Breakpoint* BreakpointAtActivation(const Instance& closure); |
459 | 469 |
460 // TODO(turnidge): script_url may no longer be specific enough. | 470 // TODO(turnidge): script_url may no longer be specific enough. |
461 Breakpoint* SetBreakpointAtLine(const String& script_url, | 471 Breakpoint* SetBreakpointAtLine(const String& script_url, |
462 intptr_t line_number); | 472 intptr_t line_number); |
| 473 Breakpoint* SetBreakpointAtLineCol(const String& script_url, |
| 474 intptr_t line_number, |
| 475 intptr_t column_number); |
463 RawError* OneTimeBreakAtEntry(const Function& target_function); | 476 RawError* OneTimeBreakAtEntry(const Function& target_function); |
464 | 477 |
465 BreakpointLocation* BreakpointLocationAtLine(const String& script_url, | 478 BreakpointLocation* BreakpointLocationAtLineCol(const String& script_url, |
466 intptr_t line_number); | 479 intptr_t line_number, |
| 480 intptr_t column_number); |
467 | 481 |
468 | 482 |
469 void RemoveBreakpoint(intptr_t bp_id); | 483 void RemoveBreakpoint(intptr_t bp_id); |
470 Breakpoint* GetBreakpointById(intptr_t id); | 484 Breakpoint* GetBreakpointById(intptr_t id); |
471 | 485 |
472 void SetStepOver(); | 486 void SetStepOver(); |
473 void SetSingleStep(); | 487 void SetSingleStep(); |
474 void SetStepOut(); | 488 void SetStepOut(); |
475 bool IsStepping() const { return resume_action_ != kContinue; } | 489 bool IsStepping() const { return resume_action_ != kContinue; } |
476 | 490 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
568 | 582 |
569 void FindCompiledFunctions(const Script& script, | 583 void FindCompiledFunctions(const Script& script, |
570 intptr_t start_pos, | 584 intptr_t start_pos, |
571 intptr_t end_pos, | 585 intptr_t end_pos, |
572 GrowableObjectArray* function_list); | 586 GrowableObjectArray* function_list); |
573 RawFunction* FindBestFit(const Script& script, intptr_t token_pos); | 587 RawFunction* FindBestFit(const Script& script, intptr_t token_pos); |
574 RawFunction* FindInnermostClosure(const Function& function, | 588 RawFunction* FindInnermostClosure(const Function& function, |
575 intptr_t token_pos); | 589 intptr_t token_pos); |
576 intptr_t ResolveBreakpointPos(const Function& func, | 590 intptr_t ResolveBreakpointPos(const Function& func, |
577 intptr_t requested_token_pos, | 591 intptr_t requested_token_pos, |
578 intptr_t last_token_pos); | 592 intptr_t last_token_pos, |
| 593 intptr_t requested_col); |
579 void DeoptimizeWorld(); | 594 void DeoptimizeWorld(); |
580 BreakpointLocation* SetBreakpoint(const Script& script, | 595 BreakpointLocation* SetBreakpoint(const Script& script, |
581 intptr_t token_pos, | 596 intptr_t token_pos, |
582 intptr_t last_token_pos); | 597 intptr_t last_token_pos, |
| 598 intptr_t requested_col); |
583 void RemoveInternalBreakpoints(); | 599 void RemoveInternalBreakpoints(); |
584 void UnlinkCodeBreakpoints(BreakpointLocation* bpt_location); | 600 void UnlinkCodeBreakpoints(BreakpointLocation* bpt_location); |
585 BreakpointLocation* GetLatentBreakpoint(const String& url, intptr_t line); | 601 BreakpointLocation* GetLatentBreakpoint(const String& url, |
| 602 intptr_t line, |
| 603 intptr_t column); |
586 void RegisterBreakpointLocation(BreakpointLocation* bpt); | 604 void RegisterBreakpointLocation(BreakpointLocation* bpt); |
587 void RegisterCodeBreakpoint(CodeBreakpoint* bpt); | 605 void RegisterCodeBreakpoint(CodeBreakpoint* bpt); |
588 BreakpointLocation* GetBreakpointLocation(const Script& script, | 606 BreakpointLocation* GetBreakpointLocation(const Script& script, |
589 intptr_t token_pos); | 607 intptr_t token_pos, |
| 608 intptr_t requested_column); |
590 void MakeCodeBreakpointAt(const Function& func, | 609 void MakeCodeBreakpointAt(const Function& func, |
591 BreakpointLocation* bpt); | 610 BreakpointLocation* bpt); |
592 // Returns NULL if no breakpoint exists for the given address. | 611 // Returns NULL if no breakpoint exists for the given address. |
593 CodeBreakpoint* GetCodeBreakpoint(uword breakpoint_address); | 612 CodeBreakpoint* GetCodeBreakpoint(uword breakpoint_address); |
594 | 613 |
595 void SyncBreakpointLocation(BreakpointLocation* loc); | 614 void SyncBreakpointLocation(BreakpointLocation* loc); |
596 | 615 |
597 ActivationFrame* TopDartFrame() const; | 616 ActivationFrame* TopDartFrame() const; |
598 static ActivationFrame* CollectDartFrame(Isolate* isolate, | 617 static ActivationFrame* CollectDartFrame(Isolate* isolate, |
599 uword pc, | 618 uword pc, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 | 686 |
668 friend class Isolate; | 687 friend class Isolate; |
669 friend class BreakpointLocation; | 688 friend class BreakpointLocation; |
670 DISALLOW_COPY_AND_ASSIGN(Debugger); | 689 DISALLOW_COPY_AND_ASSIGN(Debugger); |
671 }; | 690 }; |
672 | 691 |
673 | 692 |
674 } // namespace dart | 693 } // namespace dart |
675 | 694 |
676 #endif // VM_DEBUGGER_H_ | 695 #endif // VM_DEBUGGER_H_ |
OLD | NEW |