2 * Copyright (C) 2013 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 #ifndef StackVisitor_h
27 #define StackVisitor_h
29 #include <wtf/text/WTFString.h>
34 struct InlineCallFrame
;
44 typedef ExecState CallFrame
;
57 size_t index() const { return m_index
; }
58 size_t argumentCountIncludingThis() const { return m_argumentCountIncludingThis
; }
59 CallFrame
* callerFrame() const { return m_callerFrame
; }
60 JSObject
* callee() const { return m_callee
; }
61 JSScope
* scope() const { return m_scope
; }
62 CodeBlock
* codeBlock() const { return m_codeBlock
; }
63 unsigned bytecodeOffset() const { return m_bytecodeOffset
; }
65 InlineCallFrame
* inlineCallFrame() const { return m_inlineCallFrame
; }
68 bool isJSFrame() const { return !!codeBlock(); }
70 bool isInlinedFrame() const { return !!m_inlineCallFrame
; }
73 JS_EXPORT_PRIVATE String
functionName();
74 JS_EXPORT_PRIVATE String
sourceURL();
75 JS_EXPORT_PRIVATE String
toString();
77 CodeType
codeType() const;
78 JS_EXPORT_PRIVATE
void computeLineAndColumn(unsigned& line
, unsigned& column
);
80 Arguments
* createArguments();
81 Arguments
* existingArguments();
82 CallFrame
* callFrame() const { return m_callFrame
; }
85 JS_EXPORT_PRIVATE
void print(int indentLevel
);
92 void retrieveExpressionInfo(int& divot
, int& startOffset
, int& endOffset
, unsigned& line
, unsigned& column
);
96 size_t m_argumentCountIncludingThis
;
97 CallFrame
* m_callerFrame
;
100 CodeBlock
* m_codeBlock
;
101 unsigned m_bytecodeOffset
;
103 InlineCallFrame
* m_inlineCallFrame
;
105 CallFrame
* m_callFrame
;
107 friend class StackVisitor
;
115 // StackVisitor::visit() expects a Functor that implements the following method:
116 // Status operator()(StackVisitor&);
118 template <typename Functor
>
119 static void visit(CallFrame
* startFrame
, Functor
& functor
)
121 StackVisitor
visitor(startFrame
);
122 while (visitor
->callFrame()) {
123 Status status
= functor(visitor
);
124 if (status
!= Continue
)
126 visitor
.gotoNextFrame();
130 Frame
& operator*() { return m_frame
; }
131 ALWAYS_INLINE Frame
* operator->() { return &m_frame
; }
134 JS_EXPORT_PRIVATE
StackVisitor(CallFrame
* startFrame
);
136 JS_EXPORT_PRIVATE
void gotoNextFrame();
138 void readFrame(CallFrame
*);
139 void readNonInlinedFrame(CallFrame
*, CodeOrigin
* = 0);
141 void readInlinedFrame(CallFrame
*, CodeOrigin
*);
149 #endif // StackVisitor_h