| Index: src/frames.h
|
| diff --git a/src/frames.h b/src/frames.h
|
| index c18cb74f56be831e64a12f32adcd8aa8c3fd0fad..e6dbd24f9de46916fb563f89890f178c46b848b5 100644
|
| --- a/src/frames.h
|
| +++ b/src/frames.h
|
| @@ -509,6 +509,9 @@ class StackFrameIterator BASE_EMBEDDED {
|
| // An iterator that iterates over a given thread's stack.
|
| explicit StackFrameIterator(ThreadLocalTop* thread);
|
|
|
| + // An iterator that conditionally resets itself on init.
|
| + explicit StackFrameIterator(bool reset);
|
| +
|
| StackFrame* frame() const {
|
| ASSERT(!done());
|
| return frame_;
|
| @@ -542,16 +545,21 @@ class StackFrameIterator BASE_EMBEDDED {
|
|
|
|
|
| // Iterator that supports iterating through all JavaScript frames.
|
| -class JavaScriptFrameIterator BASE_EMBEDDED {
|
| +template<typename Iterator>
|
| +class JavaScriptFrameIteratorTemp BASE_EMBEDDED {
|
| public:
|
| - JavaScriptFrameIterator() { if (!done()) Advance(); }
|
| + JavaScriptFrameIteratorTemp() { if (!done()) Advance(); }
|
|
|
| - explicit JavaScriptFrameIterator(ThreadLocalTop* thread) : iterator_(thread) {
|
| + explicit JavaScriptFrameIteratorTemp(ThreadLocalTop* thread) :
|
| + iterator_(thread) {
|
| if (!done()) Advance();
|
| }
|
|
|
| // Skip frames until the frame with the given id is reached.
|
| - explicit JavaScriptFrameIterator(StackFrame::Id id);
|
| + explicit JavaScriptFrameIteratorTemp(StackFrame::Id id);
|
| +
|
| + explicit JavaScriptFrameIteratorTemp(Address low_bound, Address high_bound) :
|
| + iterator_(low_bound, high_bound) { if (!done()) Advance(); }
|
|
|
| inline JavaScriptFrame* frame() const;
|
|
|
| @@ -567,10 +575,68 @@ class JavaScriptFrameIterator BASE_EMBEDDED {
|
| void Reset();
|
|
|
| private:
|
| + Iterator iterator_;
|
| +};
|
| +
|
| +
|
| +typedef JavaScriptFrameIteratorTemp<StackFrameIterator> JavaScriptFrameIterator;
|
| +
|
| +
|
| +// NOTE: The stack trace frame iterator is an iterator that only
|
| +// traverse proper JavaScript frames; that is JavaScript frames that
|
| +// have proper JavaScript functions. This excludes the problematic
|
| +// functions in runtime.js.
|
| +class StackTraceFrameIterator: public JavaScriptFrameIterator {
|
| + public:
|
| + StackTraceFrameIterator();
|
| + void Advance();
|
| +};
|
| +
|
| +
|
| +class SafeStackFrameIterator BASE_EMBEDDED {
|
| + public:
|
| + explicit SafeStackFrameIterator(Address low_bound, Address high_bound);
|
| +
|
| + StackFrame* frame() const {
|
| + ASSERT(is_working_iterator_);
|
| + return iterator_.frame();
|
| + }
|
| +
|
| + bool done() const { return iteration_done_ ? true : iterator_.done(); }
|
| +
|
| + void Advance();
|
| + void Reset();
|
| +
|
| + private:
|
| + static bool IsInBounds(
|
| + Address low_bound, Address high_bound, Address addr) {
|
| + return low_bound <= addr && addr <= high_bound;
|
| + }
|
| + bool IsGoodStackAddress(Address addr) const {
|
| + return IsInBounds(low_bound_, high_bound_, addr);
|
| + }
|
| +
|
| + Address low_bound_;
|
| + Address high_bound_;
|
| + const bool is_working_iterator_;
|
| + bool iteration_done_;
|
| StackFrameIterator iterator_;
|
| };
|
|
|
|
|
| +#ifdef ENABLE_LOGGING_AND_PROFILING
|
| +typedef JavaScriptFrameIteratorTemp<SafeStackFrameIterator>
|
| + SafeJavaScriptFrameIterator;
|
| +
|
| +
|
| +class SafeStackTraceFrameIterator: public SafeJavaScriptFrameIterator {
|
| + public:
|
| + explicit SafeStackTraceFrameIterator(Address low_bound, Address high_bound);
|
| + void Advance();
|
| +};
|
| +#endif
|
| +
|
| +
|
| class StackFrameLocator BASE_EMBEDDED {
|
| public:
|
| // Find the nth JavaScript frame on the stack. The caller must
|
|
|