Revert "Revert "Upgrade to 5.0.71.48"" DO NOT MERGE
This reverts commit f2e3994fa5148cc3d9946666f0b0596290192b0e,
and updates the x64 makefile properly so it doesn't break that
build.
FPIIM-449
Change-Id: Ib83e35bfbae6af627451c926a9650ec57c045605
(cherry picked from commit 109988c7ccb6f3fd1a58574fa3dfb88beaef6632)
diff --git a/src/debug/debug.h b/src/debug/debug.h
index 7dcc2b5..81db9e5 100644
--- a/src/debug/debug.h
+++ b/src/debug/debug.h
@@ -16,6 +16,7 @@
#include "src/flags.h"
#include "src/frames.h"
#include "src/hashmap.h"
+#include "src/interpreter/source-position-table.h"
#include "src/runtime/runtime.h"
#include "src/string-stream.h"
#include "src/v8threads.h"
@@ -64,24 +65,32 @@
public:
// Find the break point at the supplied address, or the closest one before
// the address.
- static BreakLocation FromAddress(Handle<DebugInfo> debug_info, Address pc);
+ static BreakLocation FromCodeOffset(Handle<DebugInfo> debug_info, int offset);
- static void FromAddressSameStatement(Handle<DebugInfo> debug_info, Address pc,
- List<BreakLocation>* result_out);
+ static BreakLocation FromFrame(Handle<DebugInfo> debug_info,
+ JavaScriptFrame* frame);
+
+ static void FromCodeOffsetSameStatement(Handle<DebugInfo> debug_info,
+ int offset,
+ List<BreakLocation>* result_out);
+
+ static void AllForStatementPosition(Handle<DebugInfo> debug_info,
+ int statement_position,
+ List<BreakLocation>* result_out);
static BreakLocation FromPosition(Handle<DebugInfo> debug_info, int position,
BreakPositionAlignment alignment);
bool IsDebugBreak() const;
- inline bool IsReturn() const {
- return RelocInfo::IsDebugBreakSlotAtReturn(rmode_);
- }
- inline bool IsCall() const {
- return RelocInfo::IsDebugBreakSlotAtCall(rmode_);
+ inline bool IsReturn() const { return type_ == DEBUG_BREAK_SLOT_AT_RETURN; }
+ inline bool IsCall() const { return type_ == DEBUG_BREAK_SLOT_AT_CALL; }
+ inline bool IsDebugBreakSlot() const { return type_ >= DEBUG_BREAK_SLOT; }
+ inline bool IsDebuggerStatement() const {
+ return type_ == DEBUGGER_STATEMENT;
}
inline bool HasBreakPoint() const {
- return debug_info_->HasBreakPoint(pc_offset_);
+ return debug_info_->HasBreakPoint(code_offset_);
}
Handle<Object> BreakPointObjects() const;
@@ -92,79 +101,118 @@
void SetOneShot();
void ClearOneShot();
-
- inline RelocInfo rinfo() const {
- return RelocInfo(debug_info_->GetIsolate(), pc(), rmode(), data_, code());
- }
-
inline int position() const { return position_; }
inline int statement_position() const { return statement_position_; }
- inline Address pc() const { return code()->entry() + pc_offset_; }
+ inline int code_offset() const { return code_offset_; }
+ inline Isolate* isolate() { return debug_info_->GetIsolate(); }
- inline RelocInfo::Mode rmode() const { return rmode_; }
+ inline AbstractCode* abstract_code() const {
+ return debug_info_->abstract_code();
+ }
- inline Code* code() const { return debug_info_->code(); }
+ protected:
+ enum DebugBreakType {
+ NOT_DEBUG_BREAK,
+ DEBUGGER_STATEMENT,
+ DEBUG_BREAK_SLOT,
+ DEBUG_BREAK_SLOT_AT_CALL,
+ DEBUG_BREAK_SLOT_AT_RETURN
+ };
- private:
- BreakLocation(Handle<DebugInfo> debug_info, RelocInfo* rinfo, int position,
- int statement_position);
+ BreakLocation(Handle<DebugInfo> debug_info, DebugBreakType type,
+ int code_offset, int position, int statement_position);
class Iterator {
public:
- Iterator(Handle<DebugInfo> debug_info, BreakLocatorType type);
+ virtual ~Iterator() {}
- BreakLocation GetBreakLocation() {
- return BreakLocation(debug_info_, rinfo(), position(),
- statement_position());
- }
-
- inline bool Done() const { return reloc_iterator_.done(); }
- void Next();
+ virtual BreakLocation GetBreakLocation() = 0;
+ virtual bool Done() const = 0;
+ virtual void Next() = 0;
void SkipTo(int count) {
while (count-- > 0) Next();
}
- inline RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); }
- inline RelocInfo* rinfo() { return reloc_iterator_.rinfo(); }
- inline Address pc() { return rinfo()->pc(); }
+ 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:
- static int GetModeMask(BreakLocatorType type);
+ protected:
+ explicit Iterator(Handle<DebugInfo> debug_info);
Handle<DebugInfo> debug_info_;
- RelocIterator reloc_iterator_;
int break_index_;
int position_;
int statement_position_;
+ private:
DisallowHeapAllocation no_gc_;
-
DISALLOW_COPY_AND_ASSIGN(Iterator);
};
+ 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:
+ static int GetModeMask(BreakLocatorType type);
+ RelocInfo::Mode rmode() { return reloc_iterator_.rinfo()->rmode(); }
+ RelocInfo* rinfo() { return reloc_iterator_.rinfo(); }
+
+ RelocIterator reloc_iterator_;
+ DISALLOW_COPY_AND_ASSIGN(CodeIterator);
+ };
+
+ class BytecodeArrayIterator : public Iterator {
+ public:
+ BytecodeArrayIterator(Handle<DebugInfo> debug_info, BreakLocatorType type);
+ ~BytecodeArrayIterator() override {}
+
+ BreakLocation GetBreakLocation() override;
+ bool Done() const override { return source_position_iterator_.done(); }
+ void Next() override;
+
+ int code_offset() override {
+ return source_position_iterator_.bytecode_offset();
+ }
+
+ private:
+ DebugBreakType GetDebugBreakType();
+
+ interpreter::SourcePositionTableIterator source_position_iterator_;
+ BreakLocatorType break_locator_type_;
+ int start_position_;
+ DISALLOW_COPY_AND_ASSIGN(BytecodeArrayIterator);
+ };
+
+ static Iterator* GetIterator(Handle<DebugInfo> debug_info,
+ BreakLocatorType type = ALL_BREAK_LOCATIONS);
+
+ private:
friend class Debug;
- static int BreakIndexFromAddress(Handle<DebugInfo> debug_info, Address pc);
+ static int BreakIndexFromCodeOffset(Handle<DebugInfo> debug_info, int offset);
void SetDebugBreak();
void ClearDebugBreak();
- inline bool IsDebuggerStatement() const {
- return RelocInfo::IsDebuggerStatement(rmode_);
- }
- inline bool IsDebugBreakSlot() const {
- return RelocInfo::IsDebugBreakSlot(rmode_);
- }
-
Handle<DebugInfo> debug_info_;
- int pc_offset_;
- RelocInfo::Mode rmode_;
- intptr_t data_;
+ int code_offset_;
+ DebugBreakType type_;
int position_;
int statement_position_;
};
@@ -383,7 +431,7 @@
// Internal logic
bool Load();
void Break(Arguments args, JavaScriptFrame*);
- void SetAfterBreakTarget(JavaScriptFrame* frame);
+ Object* SetAfterBreakTarget(JavaScriptFrame* frame);
// Scripts handling.
Handle<FixedArray> GetLoadedScripts();
@@ -555,7 +603,9 @@
void ClearOneShot();
void ActivateStepOut(StackFrame* frame);
void RemoveDebugInfoAndClearFromShared(Handle<DebugInfo> debug_info);
- Handle<Object> CheckBreakPoints(Handle<Object> break_point);
+ Handle<Object> CheckBreakPoints(BreakLocation* location,
+ bool* has_break_points = nullptr);
+ bool IsMutedAtCurrentLocation(JavaScriptFrame* frame);
bool CheckBreakPoint(Handle<Object> break_point_object);
MaybeHandle<Object> CallFunction(const char* name, int argc,
Handle<Object> args[]);
@@ -739,6 +789,7 @@
static void PatchDebugBreakSlot(Isolate* isolate, Address pc,
Handle<Code> code);
+ static bool DebugBreakSlotIsPatched(Address pc);
static void ClearDebugBreakSlot(Isolate* isolate, Address pc);
};