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

Unified Diff: src/debug.h

Issue 967323002: Refactor BreakLocationIterator. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: static_cast instead Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/assembler.h ('k') | src/debug.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « src/assembler.h ('k') | src/debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698