Index: src/frames.h |
diff --git a/src/frames.h b/src/frames.h |
index 20111904f5afad572b3cb588ddff16e2ce42ca94..9b0a07817aebca883f59f8ab773c0883eab40da5 100644 |
--- a/src/frames.h |
+++ b/src/frames.h |
@@ -202,6 +202,7 @@ class StackFrame BASE_EMBEDDED { |
protected: |
struct State { |
+ State() : sp(NULL), fp(NULL), pc_address(NULL) { } |
Address sp; |
Address fp; |
Address* pc_address; |
@@ -318,6 +319,8 @@ class ExitFrame: public StackFrame { |
// pointer. Used when constructing the first stack frame seen by an |
// iterator and the frames following entry frames. |
static Type GetStateForFramePointer(Address fp, State* state); |
+ static Address ComputeStackPointer(Address fp); |
+ static void FillState(Address fp, Address sp, State* state); |
protected: |
explicit ExitFrame(StackFrameIterator* iterator) : StackFrame(iterator) { } |
@@ -443,6 +446,7 @@ class JavaScriptFrame: public StandardFrame { |
inline Object* function_slot_object() const; |
friend class StackFrameIterator; |
+ friend class StackTracer; |
}; |
@@ -654,12 +658,36 @@ class SafeStackFrameIterator BASE_EMBEDDED { |
} |
private: |
+ class StackAddressValidator { |
+ public: |
+ StackAddressValidator(Address low_bound, Address high_bound) |
+ : low_bound_(low_bound), high_bound_(high_bound) { } |
+ bool IsValid(Address addr) const { |
+ return IsWithinBounds(low_bound_, high_bound_, addr); |
+ } |
+ private: |
+ Address low_bound_; |
+ Address high_bound_; |
+ }; |
+ |
+ class ExitFrameValidator { |
+ public: |
+ explicit ExitFrameValidator(const StackAddressValidator& validator) |
+ : validator_(validator) { } |
+ ExitFrameValidator(Address low_bound, Address high_bound) |
+ : validator_(low_bound, high_bound) { } |
+ bool IsValidFP(Address fp); |
+ private: |
+ StackAddressValidator validator_; |
+ }; |
+ |
bool IsValidStackAddress(Address addr) const { |
- return IsWithinBounds(low_bound_, high_bound_, addr); |
+ return stack_validator_.IsValid(addr); |
} |
bool CanIterateHandles(StackFrame* frame, StackHandler* handler); |
bool IsValidFrame(StackFrame* frame) const; |
bool IsValidCaller(StackFrame* frame); |
+ static bool IsValidTop(Address low_bound, Address high_bound); |
// This is a nasty hack to make sure the active count is incremented |
// before the constructor for the embedded iterator is invoked. This |
@@ -674,8 +702,7 @@ class SafeStackFrameIterator BASE_EMBEDDED { |
ActiveCountMaintainer maintainer_; |
static int active_count_; |
- Address low_bound_; |
- Address high_bound_; |
+ StackAddressValidator stack_validator_; |
const bool is_valid_top_; |
const bool is_valid_fp_; |
const bool is_working_iterator_; |