From: mikhail.naganov@gmail.com Date: Mon, 13 Apr 2009 14:42:01 +0000 (+0000) Subject: Added another check in SafeStackFrameIterator. X-Git-Tag: upstream/4.7.83~24332 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ce6d2916b810953a6cea6d96e8ce0dc5771344e8;p=platform%2Fupstream%2Fv8.git 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 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1693 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/frames.cc b/src/frames.cc index a7da25a63..a9bbbede3 100644 --- a/src/frames.cc +++ b/src/frames.cc @@ -208,7 +208,9 @@ void SafeStackFrameIterator::Advance() { 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(); @@ -219,6 +221,15 @@ void SafeStackFrameIterator::Advance() { } +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()); +} + + bool SafeStackFrameIterator::IsValidFrame(StackFrame* frame) const { return IsValidStackAddress(frame->sp()) && IsValidStackAddress(frame->fp()) && // JavaScriptFrame uses function shared info to advance, hence it must diff --git a/src/frames.h b/src/frames.h index 78d8e723f..fbf99ffb4 100644 --- a/src/frames.h +++ b/src/frames.h @@ -638,6 +638,7 @@ class SafeStackFrameIterator BASE_EMBEDDED { 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);