Index: src/frames.h |
diff --git a/src/frames.h b/src/frames.h |
index 91a8b12e28dfbabede86e6d97d09ab0291eca259..19e4d609b5c27616d8be34e8ff96cf3c4509cf35 100644 |
--- a/src/frames.h |
+++ b/src/frames.h |
@@ -47,7 +47,7 @@ int JSCallerSavedCode(int n); |
// Forward declarations. |
-class StackFrameIterator; |
+class StackFrameIteratorBase; |
class ThreadLocalTop; |
class Isolate; |
@@ -306,7 +306,7 @@ class StackFrame BASE_EMBEDDED { |
Isolate* isolate() const { return isolate_; } |
protected: |
- inline explicit StackFrame(StackFrameIterator* iterator); |
+ inline explicit StackFrame(StackFrameIteratorBase* iterator); |
virtual ~StackFrame() { } |
// Compute the stack pointer for the calling frame. |
@@ -321,14 +321,14 @@ class StackFrame BASE_EMBEDDED { |
inline StackHandler* top_handler() const; |
// Compute the stack frame type for the given state. |
- static Type ComputeType(const StackFrameIterator* iterator, State* state); |
+ static Type ComputeType(const StackFrameIteratorBase* iterator, State* state); |
#ifdef DEBUG |
bool can_access_heap_objects() const; |
#endif |
private: |
- const StackFrameIterator* iterator_; |
+ const StackFrameIteratorBase* iterator_; |
Isolate* isolate_; |
State state_; |
@@ -341,6 +341,7 @@ class StackFrame BASE_EMBEDDED { |
static const intptr_t kIsolateTag = 1; |
friend class StackFrameIterator; |
+ friend class StackFrameIteratorBase; |
friend class StackHandlerIterator; |
friend class SafeStackFrameIterator; |
@@ -366,7 +367,7 @@ class EntryFrame: public StackFrame { |
virtual void SetCallerFp(Address caller_fp); |
protected: |
- inline explicit EntryFrame(StackFrameIterator* iterator); |
+ inline explicit EntryFrame(StackFrameIteratorBase* iterator); |
// The caller stack pointer for entry frames is always zero. The |
// real information about the caller frame is available through the |
@@ -377,7 +378,7 @@ class EntryFrame: public StackFrame { |
virtual void ComputeCallerState(State* state) const; |
virtual Type GetCallerState(State* state) const; |
- friend class StackFrameIterator; |
+ friend class StackFrameIteratorBase; |
}; |
@@ -393,10 +394,10 @@ class EntryConstructFrame: public EntryFrame { |
} |
protected: |
- inline explicit EntryConstructFrame(StackFrameIterator* iterator); |
+ inline explicit EntryConstructFrame(StackFrameIteratorBase* iterator); |
private: |
- friend class StackFrameIterator; |
+ friend class StackFrameIteratorBase; |
}; |
@@ -427,14 +428,14 @@ class ExitFrame: public StackFrame { |
static void FillState(Address fp, Address sp, State* state); |
protected: |
- inline explicit ExitFrame(StackFrameIterator* iterator); |
+ inline explicit ExitFrame(StackFrameIteratorBase* iterator); |
virtual Address GetCallerStackPointer() const; |
private: |
virtual void ComputeCallerState(State* state) const; |
- friend class StackFrameIterator; |
+ friend class StackFrameIteratorBase; |
}; |
@@ -460,7 +461,7 @@ class StandardFrame: public StackFrame { |
} |
protected: |
- inline explicit StandardFrame(StackFrameIterator* iterator); |
+ inline explicit StandardFrame(StackFrameIteratorBase* iterator); |
virtual void ComputeCallerState(State* state) const; |
@@ -497,7 +498,7 @@ class StandardFrame: public StackFrame { |
private: |
friend class StackFrame; |
- friend class StackFrameIterator; |
+ friend class SafeStackFrameIterator; |
}; |
@@ -603,7 +604,7 @@ class JavaScriptFrame: public StandardFrame { |
bool print_line_number); |
protected: |
- inline explicit JavaScriptFrame(StackFrameIterator* iterator); |
+ inline explicit JavaScriptFrame(StackFrameIteratorBase* iterator); |
virtual Address GetCallerStackPointer() const; |
@@ -616,7 +617,7 @@ class JavaScriptFrame: public StandardFrame { |
private: |
inline Object* function_slot_object() const; |
- friend class StackFrameIterator; |
+ friend class StackFrameIteratorBase; |
}; |
@@ -631,13 +632,13 @@ class StubFrame : public StandardFrame { |
virtual Code* unchecked_code() const; |
protected: |
- inline explicit StubFrame(StackFrameIterator* iterator); |
+ inline explicit StubFrame(StackFrameIteratorBase* iterator); |
virtual Address GetCallerStackPointer() const; |
virtual int GetNumberOfIncomingArguments() const; |
- friend class StackFrameIterator; |
+ friend class StackFrameIteratorBase; |
}; |
@@ -660,12 +661,12 @@ class OptimizedFrame : public JavaScriptFrame { |
DeoptimizationInputData* GetDeoptimizationData(int* deopt_index); |
protected: |
- inline explicit OptimizedFrame(StackFrameIterator* iterator); |
+ inline explicit OptimizedFrame(StackFrameIteratorBase* iterator); |
private: |
JSFunction* LiteralAt(FixedArray* literal_array, int literal_id); |
- friend class StackFrameIterator; |
+ friend class StackFrameIteratorBase; |
}; |
@@ -690,14 +691,14 @@ class ArgumentsAdaptorFrame: public JavaScriptFrame { |
int index) const; |
protected: |
- inline explicit ArgumentsAdaptorFrame(StackFrameIterator* iterator); |
+ inline explicit ArgumentsAdaptorFrame(StackFrameIteratorBase* iterator); |
virtual int GetNumberOfIncomingArguments() const; |
virtual Address GetCallerStackPointer() const; |
private: |
- friend class StackFrameIterator; |
+ friend class StackFrameIteratorBase; |
}; |
@@ -717,12 +718,12 @@ class InternalFrame: public StandardFrame { |
} |
protected: |
- inline explicit InternalFrame(StackFrameIterator* iterator); |
+ inline explicit InternalFrame(StackFrameIteratorBase* iterator); |
virtual Address GetCallerStackPointer() const; |
private: |
- friend class StackFrameIterator; |
+ friend class StackFrameIteratorBase; |
}; |
@@ -750,12 +751,12 @@ class StubFailureTrampolineFrame: public StandardFrame { |
protected: |
inline explicit StubFailureTrampolineFrame( |
- StackFrameIterator* iterator); |
+ StackFrameIteratorBase* iterator); |
virtual Address GetCallerStackPointer() const; |
private: |
- friend class StackFrameIterator; |
+ friend class StackFrameIteratorBase; |
}; |
@@ -771,40 +772,22 @@ class ConstructFrame: public InternalFrame { |
} |
protected: |
- inline explicit ConstructFrame(StackFrameIterator* iterator); |
+ inline explicit ConstructFrame(StackFrameIteratorBase* iterator); |
private: |
- friend class StackFrameIterator; |
+ friend class StackFrameIteratorBase; |
}; |
-class StackFrameIterator BASE_EMBEDDED { |
+class StackFrameIteratorBase BASE_EMBEDDED { |
public: |
- // An iterator that iterates over the isolate's current thread's stack, |
- explicit StackFrameIterator(Isolate* isolate); |
- |
- // An iterator that iterates over a given thread's stack. |
- StackFrameIterator(Isolate* isolate, ThreadLocalTop* t); |
- |
- StackFrame* frame() const { |
- ASSERT(!done()); |
- return frame_; |
- } |
- |
Isolate* isolate() const { return isolate_; } |
bool done() const { return frame_ == NULL; } |
- void Advance() { (this->*advance_)(); } |
- |
- private: |
- // An iterator that can start from a given FP address. |
- // If use_top, then work as usual, if fp isn't NULL, use it, |
- // otherwise, do nothing. This constructor is used to create |
- // StackFrameIterator for "safe" stack iteration. |
- StackFrameIterator(Isolate* isolate, bool use_top, Address fp, Address sp); |
- // Go back to the first frame. |
- void Reset(); |
+ protected: |
+ // An iterator that iterates over a given thread's stack. |
+ StackFrameIteratorBase(Isolate* isolate, bool can_access_heap_objects); |
Isolate* isolate_; |
#define DECLARE_SINGLETON(ignore, type) type type##_; |
@@ -812,10 +795,6 @@ class StackFrameIterator BASE_EMBEDDED { |
#undef DECLARE_SINGLETON |
StackFrame* frame_; |
StackHandler* handler_; |
- ThreadLocalTop* thread_; |
- Address fp_; |
- Address sp_; |
- void (StackFrameIterator::*advance_)(); |
const bool can_access_heap_objects_; |
StackHandler* handler() const { |
@@ -828,11 +807,29 @@ class StackFrameIterator BASE_EMBEDDED { |
// A helper function, can return a NULL pointer. |
StackFrame* SingletonFor(StackFrame::Type type); |
- void AdvanceWithHandler(); |
- void AdvanceWithoutHandler(); |
- |
+ private: |
friend class StackFrame; |
- friend class SafeStackFrameIterator; |
+ DISALLOW_COPY_AND_ASSIGN(StackFrameIteratorBase); |
+}; |
+ |
+ |
+class StackFrameIterator: public StackFrameIteratorBase { |
+ public: |
+ // An iterator that iterates over the isolate's current thread's stack, |
+ explicit StackFrameIterator(Isolate* isolate); |
+ // An iterator that iterates over a given thread's stack. |
+ StackFrameIterator(Isolate* isolate, ThreadLocalTop* t); |
+ |
+ StackFrame* frame() const { |
+ ASSERT(!done()); |
+ return frame_; |
+ } |
+ void Advance(); |
+ |
+ private: |
+ // Go back to the first frame. |
+ void Reset(ThreadLocalTop* top); |
+ |
DISALLOW_COPY_AND_ASSIGN(StackFrameIterator); |
}; |
@@ -874,61 +871,28 @@ class StackTraceFrameIterator: public JavaScriptFrameIterator { |
}; |
-class SafeStackFrameIterator BASE_EMBEDDED { |
+class SafeStackFrameIterator: public StackFrameIteratorBase { |
public: |
SafeStackFrameIterator(Isolate* isolate, |
Address fp, Address sp, |
Address low_bound, Address high_bound); |
inline JavaScriptFrame* frame() const; |
- |
- bool done() const { return iteration_done_ || iterator_.done(); } |
void Advance(); |
private: |
void AdvanceOneFrame(); |
- static bool IsWithinBounds( |
- Address low_bound, Address high_bound, Address addr) { |
- return low_bound <= addr && addr <= high_bound; |
- } |
- |
- 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 stack_validator_.IsValid(addr); |
+ return low_bound_ <= addr && addr <= high_bound_; |
} |
bool IsValidFrame(StackFrame* frame) const; |
bool IsValidCaller(StackFrame* frame); |
- static bool IsValidTop(Isolate* isolate, |
- Address low_bound, Address high_bound); |
+ bool IsValidExitFrame(Address fp) const; |
+ bool IsValidTop(ThreadLocalTop* top) const; |
- StackAddressValidator stack_validator_; |
- const bool is_valid_top_; |
- const bool is_valid_fp_; |
- bool iteration_done_; |
- StackFrameIterator iterator_; |
+ const Address low_bound_; |
+ const Address high_bound_; |
}; |