| 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_;
|
|
|