Index: runtime/vm/debugger.h |
=================================================================== |
--- runtime/vm/debugger.h (revision 4881) |
+++ runtime/vm/debugger.h (working copy) |
@@ -9,36 +9,78 @@ |
namespace dart { |
-class Breakpoint; |
+class SourceBreakpoint; |
+class CodeBreakpoint; |
class Isolate; |
class ObjectPointerVisitor; |
class ActiveVariables; |
-// Breakpoint represents a location in Dart source and the corresponding |
-// address in compiled code. |
-class Breakpoint { |
+// SourceBreakpoint represents a user-specified breakpoint location in |
+// Dart source. There may be more than one CodeBreakpoint object per |
+// SourceBreakpoint. |
+class SourceBreakpoint { |
public: |
- Breakpoint(const Function& func, intptr_t pc_desc_index); |
+ SourceBreakpoint(const Function& func, intptr_t token_index); |
RawFunction* function() const { return function_; } |
+ intptr_t token_index() const { return token_index_; } |
+ |
+ RawScript* SourceCode(); |
+ RawString* SourceUrl(); |
+ intptr_t LineNumber(); |
+ |
+ void Enable(); |
+ void Disable(); |
+ bool IsEnabled() const { return is_enabled_; } |
regis
2012/03/02 17:54:53
According to our coding style, it should be is_ena
hausner
2012/03/02 18:01:19
Forward ditto.
|
+ |
+ private: |
+ void VisitObjectPointers(ObjectPointerVisitor* visitor); |
+ |
+ void set_next(SourceBreakpoint* value) { next_ = value; } |
+ SourceBreakpoint* next() const { return this->next_; } |
+ |
+ RawFunction* function_; |
+ intptr_t token_index_; |
+ intptr_t line_number_; |
+ bool is_enabled_; |
+ |
+ SourceBreakpoint* next_; |
+ |
+ friend class Debugger; |
+ DISALLOW_COPY_AND_ASSIGN(SourceBreakpoint); |
+}; |
+ |
+ |
+// CodeBreakpoint represents a location in compiled code. There may be |
+// more than one CodeBreakpoint for one SourceBreakpoint, e.g. when a |
+// function gets compiled as a regular function and as a closure. |
+class CodeBreakpoint { |
+ public: |
+ CodeBreakpoint(const Function& func, intptr_t pc_desc_index); |
+ ~CodeBreakpoint(); |
+ |
+ RawFunction* function() const { return function_; } |
uword pc() const { return pc_; } |
intptr_t token_index() const { return token_index_; } |
- bool is_temporary() const { return is_temporary_; } |
- void set_temporary(bool value) { is_temporary_ = value; } |
+ bool IsInternal() const { return src_bpt_ == NULL; } |
RawScript* SourceCode(); |
RawString* SourceUrl(); |
intptr_t LineNumber(); |
- void SetActive(bool value); |
- bool IsActive(); |
+ void Enable(); |
+ void Disable(); |
+ bool IsEnabled() const { return is_enabled_; } |
regis
2012/03/02 17:54:53
According to our coding style, it should be is_ena
hausner
2012/03/02 18:01:19
True. I anticipate though that this function could
|
private: |
void VisitObjectPointers(ObjectPointerVisitor* visitor); |
- void set_next(Breakpoint* value) { next_ = value; } |
- Breakpoint* next() const { return this->next_; } |
+ SourceBreakpoint* src_bpt() const { return src_bpt_; } |
+ void set_src_bpt(SourceBreakpoint* value) { src_bpt_ = value; } |
+ |
+ void set_next(CodeBreakpoint* value) { next_ = value; } |
+ CodeBreakpoint* next() const { return this->next_; } |
intptr_t pc_desc_index() const { return pc_desc_index_; } |
void PatchCode(); |
@@ -51,22 +93,24 @@ |
intptr_t token_index_; |
uword pc_; |
intptr_t line_number_; |
- bool is_temporary_; |
+ bool is_enabled_; |
- bool is_patched_; |
+ SourceBreakpoint* src_bpt_; |
+ CodeBreakpoint* next_; |
+ |
PcDescriptors::Kind breakpoint_kind_; |
union { |
uword target_address_; |
uint8_t raw[2 * sizeof(uword)]; |
} saved_bytes_; |
- Breakpoint* next_; |
- |
friend class Debugger; |
- DISALLOW_COPY_AND_ASSIGN(Breakpoint); |
+ DISALLOW_COPY_AND_ASSIGN(CodeBreakpoint); |
}; |
+ |
+ |
// ActivationFrame represents one dart function activation frame |
// on the call stack. |
class ActivationFrame : public ZoneAllocated { |
@@ -135,7 +179,7 @@ |
}; |
-typedef void BreakpointHandler(Breakpoint* bpt, StackTrace* stack); |
+typedef void BreakpointHandler(SourceBreakpoint* bpt, StackTrace* stack); |
class Debugger { |
@@ -147,6 +191,8 @@ |
void Shutdown(); |
bool IsActive(); |
+ void NotifyCompilation(const Function& func); |
+ |
void SetBreakpointHandler(BreakpointHandler* handler); |
RawFunction* ResolveFunction(const Library& library, |
@@ -154,13 +200,11 @@ |
const String& function_name); |
// Set breakpoint at closest location to function entry. |
- Breakpoint* SetBreakpointAtEntry(const Function& target_function, |
- Error* error); |
- Breakpoint* SetBreakpointAtLine(const String& script_url, |
- intptr_t line_number, |
- Error* error); |
+ SourceBreakpoint* SetBreakpointAtEntry(const Function& target_function); |
+ SourceBreakpoint* SetBreakpointAtLine(const String& script_url, |
+ intptr_t line_number); |
- void RemoveBreakpoint(Breakpoint* bpt); |
+ void RemoveBreakpoint(SourceBreakpoint* bpt); |
void SetStepOver() { resume_action_ = kStepOver; } |
void SetStepInto() { resume_action_ = kStepInto; } |
@@ -168,9 +212,6 @@ |
void VisitObjectPointers(ObjectPointerVisitor* visitor); |
- // Returns NULL if no breakpoint exists for the given address. |
- Breakpoint* GetBreakpoint(uword breakpoint_address); |
- |
// Called from Runtime when a breakpoint in Dart code is reached. |
void BreakpointCallback(); |
@@ -195,24 +236,31 @@ |
}; |
void InstrumentForStepping(const Function &target_function); |
- Breakpoint* SetBreakpoint(const Function& target_function, |
- intptr_t token_index, |
- Error* error); |
- void UnsetBreakpoint(Breakpoint* bpt); |
- void RemoveTemporaryBreakpoints(); |
- Breakpoint* NewBreakpoint(const Function& func, intptr_t pc_desc_index); |
- void RegisterBreakpoint(Breakpoint* bpt); |
- Breakpoint* GetBreakpointByFunction(const Function& func, |
- intptr_t token_index); |
+ SourceBreakpoint* SetBreakpoint(const Function& target_function, |
+ intptr_t token_index); |
+ void RemoveInternalBreakpoints(); |
+ void RemoveCodeBreakpoints(SourceBreakpoint* src_bpt); |
+ void RegisterSourceBreakpoint(SourceBreakpoint* bpt); |
+ void RegisterCodeBreakpoint(CodeBreakpoint* bpt); |
+ SourceBreakpoint* GetSourceBreakpoint(const Function& func, |
+ intptr_t token_index); |
+ CodeBreakpoint* MakeCodeBreakpoint(SourceBreakpoint* src_bpt); |
+ // Returns NULL if no breakpoint exists for the given address. |
+ CodeBreakpoint* GetCodeBreakpoint(uword breakpoint_address); |
+ |
+ void SyncBreakpoint(SourceBreakpoint* bpt); |
+ |
Isolate* isolate_; |
bool initialized_; |
BreakpointHandler* bp_handler_; |
- Breakpoint* breakpoints_; |
+ SourceBreakpoint* src_breakpoints_; |
+ CodeBreakpoint* code_breakpoints_; |
// Tells debugger what to do when resuming execution after a breakpoint. |
ResumeAction resume_action_; |
+ friend class SourceBreakpoint; |
DISALLOW_COPY_AND_ASSIGN(Debugger); |
}; |