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

Unified Diff: src/debug/debug.h

Issue 2238893002: [debugger] separate break point info from code instrumentation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix Created 4 years, 4 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/builtins/x87/builtins-x87.cc ('k') | src/debug/debug.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/debug/debug.h
diff --git a/src/debug/debug.h b/src/debug/debug.h
index 4bfb8a9a2a1231ac05cc473e9aa0545be43c4f9b..36f973c5002484034df2ab40db8c0dc796fd0bc2 100644
--- a/src/debug/debug.h
+++ b/src/debug/debug.h
@@ -61,25 +61,23 @@ enum BreakPositionAlignment {
BREAK_POSITION_ALIGNED = 1
};
+enum DebugBreakType {
+ NOT_DEBUG_BREAK,
+ DEBUGGER_STATEMENT,
+ DEBUG_BREAK_SLOT,
+ DEBUG_BREAK_SLOT_AT_CALL,
+ DEBUG_BREAK_SLOT_AT_RETURN,
+ DEBUG_BREAK_SLOT_AT_TAIL_CALL,
+};
class BreakLocation {
public:
- // Find the break point at the supplied address, or the closest one before
- // the address.
- static BreakLocation FromCodeOffset(Handle<DebugInfo> debug_info, int offset);
-
static BreakLocation FromFrame(Handle<DebugInfo> debug_info,
JavaScriptFrame* frame);
- static void AllForStatementPosition(Handle<DebugInfo> debug_info,
- int statement_position,
- List<BreakLocation>* result_out);
-
- // Find break location (for a break point) from source positon.
- static BreakLocation FromPosition(Handle<DebugInfo> debug_info, int position,
- BreakPositionAlignment alignment);
-
- bool IsDebugBreak() const;
+ static void AllAtCurrentStatement(Handle<DebugInfo> debug_info,
+ JavaScriptFrame* frame,
+ List<BreakLocation>* result_out);
inline bool IsReturn() const { return type_ == DEBUG_BREAK_SLOT_AT_RETURN; }
inline bool IsCall() const { return type_ == DEBUG_BREAK_SLOT_AT_CALL; }
@@ -91,136 +89,137 @@ class BreakLocation {
return type_ == DEBUGGER_STATEMENT;
}
- bool HasBreakPoint() const;
+ bool HasBreakPoint(Handle<DebugInfo> debug_info) const;
- Handle<Object> BreakPointObjects() const;
+ inline int position() const { return position_; }
- void SetBreakPoint(Handle<Object> break_point_object);
- void ClearBreakPoint(Handle<Object> break_point_object);
+ private:
+ BreakLocation(Handle<AbstractCode> abstract_code, DebugBreakType type,
+ int code_offset, int position)
+ : abstract_code_(abstract_code),
+ code_offset_(code_offset),
+ type_(type),
+ position_(position) {
+ DCHECK_NE(NOT_DEBUG_BREAK, type_);
+ }
- void SetOneShot();
- void ClearOneShot();
+ static int BreakIndexFromCodeOffset(Handle<DebugInfo> debug_info,
+ Handle<AbstractCode> abstract_code,
+ int offset);
- inline int position() const { return position_; }
- inline int statement_position() const { return statement_position_; }
+ void SetDebugBreak();
+ void ClearDebugBreak();
- inline int code_offset() const { return code_offset_; }
- inline Isolate* isolate() { return debug_info_->GetIsolate(); }
+ Handle<AbstractCode> abstract_code_;
+ int code_offset_;
+ DebugBreakType type_;
+ int position_;
- inline AbstractCode* abstract_code() const {
- return debug_info_->abstract_code();
+ friend class CodeBreakIterator;
+ friend class BytecodeArrayBreakIterator;
+};
+
+class BreakIterator {
+ public:
+ static std::unique_ptr<BreakIterator> GetIterator(
+ Handle<DebugInfo> debug_info, Handle<AbstractCode> abstract_code,
+ BreakLocatorType type = ALL_BREAK_LOCATIONS);
+
+ virtual ~BreakIterator() {}
+
+ virtual BreakLocation GetBreakLocation() = 0;
+ virtual bool Done() const = 0;
+ virtual void Next() = 0;
+
+ void SkipTo(int count) {
+ while (count-- > 0) Next();
}
- protected:
- enum DebugBreakType {
- NOT_DEBUG_BREAK,
- DEBUGGER_STATEMENT,
- DEBUG_BREAK_SLOT,
- DEBUG_BREAK_SLOT_AT_CALL,
- DEBUG_BREAK_SLOT_AT_RETURN,
- DEBUG_BREAK_SLOT_AT_TAIL_CALL,
- };
+ virtual int code_offset() = 0;
+ int break_index() const { return break_index_; }
+ inline int position() const { return position_; }
+ inline int statement_position() const { return statement_position_; }
- BreakLocation(Handle<DebugInfo> debug_info, DebugBreakType type,
- int code_offset, int position, int statement_position);
+ virtual bool IsDebugBreak() = 0;
+ virtual void ClearDebugBreak() = 0;
+ virtual void SetDebugBreak() = 0;
- class Iterator {
- public:
- virtual ~Iterator() {}
+ protected:
+ explicit BreakIterator(Handle<DebugInfo> debug_info,
+ BreakLocatorType break_locator_type);
- virtual BreakLocation GetBreakLocation() = 0;
- virtual bool Done() const = 0;
- virtual void Next() = 0;
+ int BreakIndexFromPosition(int position, BreakPositionAlignment alignment);
- void SkipTo(int count) {
- while (count-- > 0) Next();
- }
+ Isolate* isolate() { return debug_info_->GetIsolate(); }
+
+ Handle<DebugInfo> debug_info_;
+ int break_index_;
+ int position_;
+ int statement_position_;
+ BreakLocatorType break_locator_type_;
- virtual int code_offset() = 0;
- int break_index() const { return break_index_; }
- inline int position() const { return position_; }
- inline int statement_position() const { return statement_position_; }
+ private:
+ DisallowHeapAllocation no_gc_;
+ DISALLOW_COPY_AND_ASSIGN(BreakIterator);
+};
- protected:
- explicit Iterator(Handle<DebugInfo> debug_info);
+class CodeBreakIterator : public BreakIterator {
+ public:
+ CodeBreakIterator(Handle<DebugInfo> debug_info, BreakLocatorType type);
+ ~CodeBreakIterator() override {}
- Isolate* isolate() { return debug_info_->GetIsolate(); }
+ BreakLocation GetBreakLocation() override;
+ bool Done() const override { return reloc_iterator_.done(); }
+ void Next() override;
- Handle<DebugInfo> debug_info_;
- int break_index_;
- int position_;
- int statement_position_;
+ bool IsDebugBreak() override;
+ void ClearDebugBreak() override;
+ void SetDebugBreak() override;
- private:
- DisallowHeapAllocation no_gc_;
- DISALLOW_COPY_AND_ASSIGN(Iterator);
- };
+ void SkipToPosition(int position, BreakPositionAlignment alignment);
- class CodeIterator : public Iterator {
- public:
- CodeIterator(Handle<DebugInfo> debug_info, BreakLocatorType type);
- ~CodeIterator() override {}
-
- BreakLocation GetBreakLocation() override;
- bool Done() const override { return reloc_iterator_.done(); }
- void Next() override;
-
- int code_offset() override {
- return static_cast<int>(
- rinfo()->pc() -
- debug_info_->abstract_code()->GetCode()->instruction_start());
- }
-
- private:
- int GetModeMask(BreakLocatorType type);
- RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); }
- RelocInfo* rinfo() { return reloc_iterator_.rinfo(); }
-
- RelocIterator reloc_iterator_;
- SourcePositionTableIterator source_position_iterator_;
- DISALLOW_COPY_AND_ASSIGN(CodeIterator);
- };
+ int code_offset() override {
+ return static_cast<int>(rinfo()->pc() -
+ debug_info_->DebugCode()->instruction_start());
+ }
- class BytecodeArrayIterator : public Iterator {
- public:
- BytecodeArrayIterator(Handle<DebugInfo> debug_info, BreakLocatorType type);
- ~BytecodeArrayIterator() override {}
+ private:
+ int GetModeMask(BreakLocatorType type);
+ DebugBreakType GetDebugBreakType();
- BreakLocation GetBreakLocation() override;
- bool Done() const override { return source_position_iterator_.done(); }
- void Next() override;
+ RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); }
+ RelocInfo* rinfo() { return reloc_iterator_.rinfo(); }
- int code_offset() override {
- return source_position_iterator_.code_offset();
- }
+ RelocIterator reloc_iterator_;
+ SourcePositionTableIterator source_position_iterator_;
+ DISALLOW_COPY_AND_ASSIGN(CodeBreakIterator);
+};
- private:
- DebugBreakType GetDebugBreakType();
+class BytecodeArrayBreakIterator : public BreakIterator {
+ public:
+ BytecodeArrayBreakIterator(Handle<DebugInfo> debug_info,
+ BreakLocatorType type);
+ ~BytecodeArrayBreakIterator() override {}
- SourcePositionTableIterator source_position_iterator_;
- BreakLocatorType break_locator_type_;
- DISALLOW_COPY_AND_ASSIGN(BytecodeArrayIterator);
- };
+ BreakLocation GetBreakLocation() override;
+ bool Done() const override { return source_position_iterator_.done(); }
+ void Next() override;
- static Iterator* GetIterator(Handle<DebugInfo> debug_info,
- BreakLocatorType type = ALL_BREAK_LOCATIONS);
+ bool IsDebugBreak() override;
+ void ClearDebugBreak() override;
+ void SetDebugBreak() override;
- private:
- friend class Debug;
+ void SkipToPosition(int position, BreakPositionAlignment alignment);
- static int BreakIndexFromCodeOffset(Handle<DebugInfo> debug_info, int offset);
+ int code_offset() override { return source_position_iterator_.code_offset(); }
- void SetDebugBreak();
- void ClearDebugBreak();
+ private:
+ DebugBreakType GetDebugBreakType();
- Handle<DebugInfo> debug_info_;
- int code_offset_;
- DebugBreakType type_;
- int position_;
- int statement_position_;
+ SourcePositionTableIterator source_position_iterator_;
+ DISALLOW_COPY_AND_ASSIGN(BytecodeArrayBreakIterator);
};
-
// Linked list holding debug info objects. The debug info objects are kept as
// weak handles to avoid a debug info object to keep a function alive.
class DebugInfoListNode {
@@ -241,7 +240,6 @@ class DebugInfoListNode {
};
-
// Message delivered to the message handler callback. This is either a debugger
// event or the response to a command.
class MessageImpl: public v8::Debug::Message {
@@ -449,9 +447,6 @@ class Debug {
int* source_position,
BreakPositionAlignment alignment);
void ClearBreakPoint(Handle<Object> break_point_object);
- void ClearAllBreakPoints();
- void FloodWithOneShot(Handle<JSFunction> function,
- BreakLocatorType type = ALL_BREAK_LOCATIONS);
void ChangeBreakOnException(ExceptionBreakType type, bool enable);
bool IsBreakOnException(ExceptionBreakType type);
@@ -616,10 +611,25 @@ class Debug {
bool auto_continue);
void InvokeMessageHandler(MessageImpl message);
+ // Find the closest source position for a break point for a given position.
+ int FindBreakablePosition(Handle<DebugInfo> debug_info, int source_position,
+ BreakPositionAlignment alignment);
+ // Instrument code to break at break points.
+ void ApplyBreakPoints(Handle<DebugInfo> debug_info);
+ // Clear code from instrumentation.
+ void ClearBreakPoints(Handle<DebugInfo> debug_info);
+ // Clear all code from instrumentation.
+ void ClearAllBreakPoints();
+ // Instrument a function with one-shots.
+ void FloodWithOneShot(Handle<JSFunction> function,
+ BreakLocatorType type = ALL_BREAK_LOCATIONS);
+ // Clear all one-shot instrumentations, but restore break points.
void ClearOneShot();
+
void ActivateStepOut(StackFrame* frame);
void RemoveDebugInfoAndClearFromShared(Handle<DebugInfo> debug_info);
- Handle<Object> CheckBreakPoints(BreakLocation* location,
+ Handle<Object> CheckBreakPoints(Handle<DebugInfo> debug_info,
+ BreakLocation* location,
bool* has_break_points = nullptr);
bool IsMutedAtCurrentLocation(JavaScriptFrame* frame);
bool CheckBreakPoint(Handle<Object> break_point_object);
« no previous file with comments | « src/builtins/x87/builtins-x87.cc ('k') | src/debug/debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698