Author: [email protected]
Date: Mon Apr 13 07:42:01 2009
New Revision: 1693

Modified:
    branches/bleeding_edge/src/frames.cc
    branches/bleeding_edge/src/frames.h

Log:
Added another check in SafeStackFrameIterator.

While playing with profiling in debug version of Chrome, I encontered a
case when assertion in StackHandlerIterator failed.

Review URL: http://codereview.chromium.org/65005

Modified: branches/bleeding_edge/src/frames.cc
==============================================================================
--- branches/bleeding_edge/src/frames.cc        (original)
+++ branches/bleeding_edge/src/frames.cc        Mon Apr 13 07:42:01 2009
@@ -208,7 +208,9 @@
    StackFrame* last_frame = iterator_.frame();
    Address last_sp = last_frame->sp(), last_fp = last_frame->fp();
    // Before advancing to the next stack frame, perform pointer validity  
tests
-  iteration_done_ = !IsValidFrame(last_frame) | 
| !IsValidCaller(last_frame);
+  iteration_done_ = !IsValidFrame(last_frame) ||
+      !CanIterateHandles(last_frame, iterator_.handler()) ||
+      !IsValidCaller(last_frame);
    if (iteration_done_) return;

    iterator_.Advance();
@@ -216,6 +218,15 @@
    // Check that we have actually moved to the previous frame in the stack
    StackFrame* prev_frame = iterator_.frame();
    iteration_done_ = prev_frame->sp() < last_sp || prev_frame->fp() <  
last_fp;
+}
+
+
+bool SafeStackFrameIterator::CanIterateHandles(StackFrame* frame,
+                                               StackHandler* handler) {
+  // If StackIterator iterates over StackHandles, verify that
+  // StackHandlerIterator can be instantiated (see StackHandlerIterator
+  // constructor.)
+  return !is_valid_top_ || (frame->sp() <= handler->address());
  }



Modified: branches/bleeding_edge/src/frames.h
==============================================================================
--- branches/bleeding_edge/src/frames.h (original)
+++ branches/bleeding_edge/src/frames.h Mon Apr 13 07:42:01 2009
@@ -638,6 +638,7 @@
    bool IsValidStackAddress(Address addr) const {
      return IsWithinBounds(low_bound_, high_bound_, addr);
    }
+  bool CanIterateHandles(StackFrame* frame, StackHandler* handler);
    bool IsValidFrame(StackFrame* frame) const;
    bool IsValidCaller(StackFrame* frame);


--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to