| Index: src/frames.cc
 | 
| diff --git a/src/frames.cc b/src/frames.cc
 | 
| index 20a71499a381c02c3ab339065c451c49fed69107..327079705b007414cd665ed86f996635f442abf4 100644
 | 
| --- a/src/frames.cc
 | 
| +++ b/src/frames.cc
 | 
| @@ -74,6 +74,11 @@ StackFrameIterator::StackFrameIterator(ThreadLocalTop* t)
 | 
|        frame_(NULL), handler_(NULL), thread_(t) {
 | 
|    Reset();
 | 
|  }
 | 
| +StackFrameIterator::StackFrameIterator(bool reset)
 | 
| +    : STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON)
 | 
| +      frame_(NULL), handler_(NULL), thread_(Top::GetCurrentThread()) {
 | 
| +  if (reset) Reset();
 | 
| +}
 | 
|  #undef INITIALIZE_SINGLETON
 | 
|  
 | 
|  
 | 
| @@ -131,32 +136,77 @@ StackFrame* StackFrameIterator::SingletonFor(StackFrame::Type type,
 | 
|  // -------------------------------------------------------------------------
 | 
|  
 | 
|  
 | 
| -JavaScriptFrameIterator::JavaScriptFrameIterator(StackFrame::Id id) {
 | 
| +StackTraceFrameIterator::StackTraceFrameIterator() {
 | 
| +  if (!done() && !frame()->function()->IsJSFunction()) Advance();
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void StackTraceFrameIterator::Advance() {
 | 
|    while (true) {
 | 
| -    Advance();
 | 
| -    if (frame()->id() == id) return;
 | 
| +    JavaScriptFrameIterator::Advance();
 | 
| +    if (done()) return;
 | 
| +    if (frame()->function()->IsJSFunction()) return;
 | 
|    }
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void JavaScriptFrameIterator::Advance() {
 | 
| -  do {
 | 
| +// -------------------------------------------------------------------------
 | 
| +
 | 
| +
 | 
| +SafeStackFrameIterator::SafeStackFrameIterator(
 | 
| +    Address low_bound, Address high_bound) :
 | 
| +    low_bound_(low_bound), high_bound_(high_bound),
 | 
| +    is_working_iterator_(IsInBounds(low_bound, high_bound,
 | 
| +                                    Top::c_entry_fp(Top::GetCurrentThread()))),
 | 
| +    iteration_done_(!is_working_iterator_), iterator_(is_working_iterator_) {
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void SafeStackFrameIterator::Advance() {
 | 
| +  ASSERT(is_working_iterator_);
 | 
| +  ASSERT(!done());
 | 
| +  StackFrame* frame = iterator_.frame();
 | 
| +  iteration_done_ =
 | 
| +      !IsGoodStackAddress(frame->sp()) || !IsGoodStackAddress(frame->fp());
 | 
| +  if (!iteration_done_) {
 | 
|      iterator_.Advance();
 | 
| -  } while (!iterator_.done() && !iterator_.frame()->is_java_script());
 | 
| +    if (!iterator_.done()) {
 | 
| +      // Check that we have actually moved to the previous frame in the stack
 | 
| +      StackFrame* prev_frame = iterator_.frame();
 | 
| +      iteration_done_ =
 | 
| +          prev_frame->sp() < frame->sp() || prev_frame->fp() < frame->fp();
 | 
| +    }
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void SafeStackFrameIterator::Reset() {
 | 
| +  if (is_working_iterator_) {
 | 
| +    iterator_.Reset();
 | 
| +    iteration_done_ = false;
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void JavaScriptFrameIterator::AdvanceToArgumentsFrame() {
 | 
| -  if (!frame()->has_adapted_arguments()) return;
 | 
| -  iterator_.Advance();
 | 
| -  ASSERT(iterator_.frame()->is_arguments_adaptor());
 | 
| +// -------------------------------------------------------------------------
 | 
| +
 | 
| +
 | 
| +#ifdef ENABLE_LOGGING_AND_PROFILING
 | 
| +SafeStackTraceFrameIterator::SafeStackTraceFrameIterator(
 | 
| +    Address low_bound, Address high_bound) :
 | 
| +    SafeJavaScriptFrameIterator(low_bound, high_bound) {
 | 
| +  if (!done() && !frame()->function()->IsJSFunction()) Advance();
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void JavaScriptFrameIterator::Reset() {
 | 
| -  iterator_.Reset();
 | 
| -  Advance();
 | 
| +void SafeStackTraceFrameIterator::Advance() {
 | 
| +  while (true) {
 | 
| +    SafeJavaScriptFrameIterator::Advance();
 | 
| +    if (done()) return;
 | 
| +    if (frame()->function()->IsJSFunction()) return;
 | 
| +  }
 | 
|  }
 | 
| +#endif
 | 
|  
 | 
|  
 | 
|  // -------------------------------------------------------------------------
 | 
| 
 |