Index: src/debug.h |
diff --git a/src/debug.h b/src/debug.h |
index 3e2db60b8ea70e324884b085ef8068c374a38962..7209b53ad0027bdaa21a882f558bf24ffd6e2ef2 100644 |
--- a/src/debug.h |
+++ b/src/debug.h |
@@ -66,83 +66,161 @@ enum BreakPositionAlignment { |
}; |
-// Class for iterating through the break points in a function and changing |
-// them. |
-class BreakLocationIterator { |
+class BreakLocation { |
public: |
- explicit BreakLocationIterator(Handle<DebugInfo> debug_info, |
- BreakLocatorType type); |
- virtual ~BreakLocationIterator(); |
- |
- void Next(); |
- void Next(int count); |
- void FindBreakLocationFromAddress(Address pc); |
- void FindBreakLocationFromPosition(int position, |
- BreakPositionAlignment alignment); |
- void Reset(); |
- bool Done() const; |
+ // Find the break point at the supplied address, or the closest one before |
+ // the address. |
+ static BreakLocation FromAddress(Handle<DebugInfo> debug_info, |
+ BreakLocatorType type, Address pc); |
+ |
+ static void FromAddressSameStatement(Handle<DebugInfo> debug_info, |
+ BreakLocatorType type, Address pc, |
+ List<BreakLocation>* result_out); |
+ |
+ static BreakLocation FromPosition(Handle<DebugInfo> debug_info, |
+ BreakLocatorType type, int position, |
+ BreakPositionAlignment alignment); |
+ |
+ bool IsDebugBreak() const; |
+ inline bool IsExit() const { return RelocInfo::IsJSReturn(rmode_); } |
+ inline bool IsConstructCall() const { |
+ return RelocInfo::IsConstructCall(rmode_); |
+ } |
+ inline bool IsCodeTarget() const { return RelocInfo::IsCodeTarget(rmode_); } |
+ |
+ Handle<Code> CodeTarget() const; |
+ Handle<Code> OriginalCodeTarget() const; |
+ |
+ bool IsStepInLocation() const; |
+ inline bool HasBreakPoint() const { |
+ return debug_info_->HasBreakPoint(pc_offset_); |
+ } |
+ |
+ Handle<Object> BreakPointObjects() const; |
+ |
void SetBreakPoint(Handle<Object> break_point_object); |
void ClearBreakPoint(Handle<Object> break_point_object); |
+ |
void SetOneShot(); |
void ClearOneShot(); |
- bool IsStepInLocation(Isolate* isolate); |
- bool IsExit() const; |
- bool HasBreakPoint(); |
- bool IsDebugBreak(); |
- Object* BreakPointObjects(); |
- void ClearAllDebugBreak(); |
- |
- inline int code_position() { |
- return static_cast<int>(pc() - debug_info_->code()->entry()); |
- } |
- inline int break_point() { return break_point_; } |
- inline int position() { return position_; } |
- inline int statement_position() { return statement_position_; } |
- inline Address pc() { return reloc_iterator_->rinfo()->pc(); } |
- inline Code* code() { return debug_info_->code(); } |
- inline RelocInfo* rinfo() { return reloc_iterator_->rinfo(); } |
- inline RelocInfo::Mode rmode() const { |
- return reloc_iterator_->rinfo()->rmode(); |
+ inline RelocInfo rinfo() const { |
+ return RelocInfo(pc(), rmode(), data_, code()); |
} |
- inline RelocInfo* original_rinfo() { |
- return reloc_iterator_original_->rinfo(); |
- } |
- inline RelocInfo::Mode original_rmode() const { |
- return reloc_iterator_original_->rinfo()->rmode(); |
+ |
+ inline RelocInfo original_rinfo() const { |
+ return RelocInfo(original_pc(), original_rmode(), original_data_, |
+ original_code()); |
} |
- bool IsDebuggerStatement(); |
+ inline int position() const { return position_; } |
+ inline int statement_position() const { return statement_position_; } |
- protected: |
- bool RinfoDone() const; |
- void RinfoNext(); |
+ inline Address pc() const { return code()->entry() + pc_offset_; } |
+ inline Address original_pc() const { |
+ return original_code()->entry() + original_pc_offset_; |
+ } |
- BreakLocatorType type_; |
- int break_point_; |
- int position_; |
- int statement_position_; |
- Handle<DebugInfo> debug_info_; |
- RelocIterator* reloc_iterator_; |
- RelocIterator* reloc_iterator_original_; |
+ inline RelocInfo::Mode rmode() const { return rmode_; } |
+ inline RelocInfo::Mode original_rmode() const { return original_rmode_; } |
+ |
+ inline Code* code() const { return debug_info_->code(); } |
+ inline Code* original_code() const { return debug_info_->original_code(); } |
private: |
- void SetDebugBreak(); |
- void ClearDebugBreak(); |
+ BreakLocation(Handle<DebugInfo> debug_info, RelocInfo* rinfo, |
+ RelocInfo* original_rinfo, int position, int statement_position) |
+ : debug_info_(debug_info), |
+ pc_offset_(static_cast<int>(rinfo->pc() - debug_info->code()->entry())), |
+ original_pc_offset_(static_cast<int>( |
+ original_rinfo->pc() - debug_info->original_code()->entry())), |
+ rmode_(rinfo->rmode()), |
+ original_rmode_(original_rinfo->rmode()), |
+ data_(rinfo->data()), |
+ original_data_(original_rinfo->data()), |
+ position_(position), |
+ statement_position_(statement_position) {} |
+ |
+ class Iterator { |
+ public: |
+ Iterator(Handle<DebugInfo> debug_info, BreakLocatorType type); |
- void SetDebugBreakAtIC(); |
- void ClearDebugBreakAtIC(); |
+ BreakLocation GetBreakLocation() { |
+ return BreakLocation(debug_info_, rinfo(), original_rinfo(), position(), |
+ statement_position()); |
+ } |
- bool IsDebugBreakAtReturn(); |
- void SetDebugBreakAtReturn(); |
- void ClearDebugBreakAtReturn(); |
+ inline bool Done() const { return RinfoDone(); } |
+ void Next(); |
+ |
+ void SkipTo(int count) { |
+ while (count-- > 0) Next(); |
+ } |
+ |
+ inline RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); } |
+ inline RelocInfo::Mode original_rmode() { |
+ return reloc_iterator_.rinfo()->rmode(); |
+ } |
- bool IsDebugBreakSlot(); |
- bool IsDebugBreakAtSlot(); |
+ inline RelocInfo* rinfo() { return reloc_iterator_.rinfo(); } |
+ inline RelocInfo* original_rinfo() { |
+ return reloc_iterator_original_.rinfo(); |
+ } |
+ |
+ inline Address pc() { return rinfo()->pc(); } |
+ inline Address original_pc() { return original_rinfo()->pc(); } |
+ |
+ int break_index() const { return break_index_; } |
+ |
+ inline int position() const { return position_; } |
+ inline int statement_position() const { return statement_position_; } |
+ |
+ private: |
+ bool RinfoDone() const; |
+ void RinfoNext(); |
+ |
+ Handle<DebugInfo> debug_info_; |
+ BreakLocatorType type_; |
+ RelocIterator reloc_iterator_; |
+ RelocIterator reloc_iterator_original_; |
+ int break_index_; |
+ int position_; |
+ int statement_position_; |
+ |
+ DisallowHeapAllocation no_gc_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Iterator); |
+ }; |
+ |
+ friend class Debug; |
+ |
+ static int BreakIndexFromAddress(Handle<DebugInfo> debug_info, |
+ BreakLocatorType type, Address pc); |
+ |
+ void ClearDebugBreak(); |
+ void RestoreFromOriginal(int length_in_bytes); |
+ |
+ void SetDebugBreak(); |
+ void SetDebugBreakAtReturn(); |
void SetDebugBreakAtSlot(); |
- void ClearDebugBreakAtSlot(); |
+ void SetDebugBreakAtIC(); |
- DISALLOW_COPY_AND_ASSIGN(BreakLocationIterator); |
+ inline bool IsDebuggerStatement() const { |
+ return RelocInfo::IsDebuggerStatement(rmode_); |
+ } |
+ inline bool IsDebugBreakSlot() const { |
+ return RelocInfo::IsDebugBreakSlot(rmode_); |
+ } |
+ |
+ Handle<DebugInfo> debug_info_; |
+ int pc_offset_; |
+ int original_pc_offset_; |
+ RelocInfo::Mode rmode_; |
+ RelocInfo::Mode original_rmode_; |
+ intptr_t data_; |
+ intptr_t original_data_; |
+ int position_; |
+ int statement_position_; |
}; |
@@ -403,8 +481,7 @@ class Debug { |
void ClearStepping(); |
void ClearStepOut(); |
bool IsStepping() { return thread_local_.step_count_ > 0; } |
- bool StepNextContinue(BreakLocationIterator* break_location_iterator, |
- JavaScriptFrame* frame); |
+ bool StepNextContinue(BreakLocation* location, JavaScriptFrame* frame); |
bool StepInActive() { return thread_local_.step_into_fp_ != 0; } |
void HandleStepIn(Handle<Object> function_obj, Handle<Object> holder, |
Address fp, bool is_constructor); |
@@ -422,13 +499,11 @@ class Debug { |
static bool HasDebugInfo(Handle<SharedFunctionInfo> shared); |
// This function is used in FunctionNameUsing* tests. |
- Object* FindSharedFunctionInfoInScript(Handle<Script> script, int position); |
+ Handle<Object> FindSharedFunctionInfoInScript(Handle<Script> script, |
+ int position); |
// Returns true if the current stub call is patched to call the debugger. |
static bool IsDebugBreak(Address addr); |
- // Returns true if the current return statement has been patched to be |
- // a debugger breakpoint. |
- static bool IsDebugBreakAtReturn(RelocInfo* rinfo); |
static Handle<Object> GetSourceBreakLocations( |
Handle<SharedFunctionInfo> shared, |