Source/JavaScriptCore: https://bugs.webkit.org/show_bug.cgi?id=119548
[WebKit-https.git] / Source / JavaScriptCore / debugger / DebuggerCallFrame.cpp
1 /*
2  * Copyright (C) 2008 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "config.h"
30 #include "DebuggerCallFrame.h"
31
32 #include "JSFunction.h"
33 #include "CodeBlock.h"
34 #include "Interpreter.h"
35 #include "Operations.h"
36 #include "Parser.h"
37
38 namespace JSC {
39
40 String DebuggerCallFrame::functionName() const
41 {
42     if (!m_callFrame->codeBlock())
43         return String();
44
45     if (!m_callFrame->callee())
46         return String();
47
48     JSObject* function = m_callFrame->callee();
49     if (!function || !function->inherits(JSFunction::info()))
50         return String();
51     return jsCast<JSFunction*>(function)->name(m_callFrame);
52 }
53     
54 String DebuggerCallFrame::calculatedFunctionName() const
55 {
56     if (!m_callFrame->codeBlock())
57         return String();
58
59     JSObject* function = m_callFrame->callee();
60
61     if (!function)
62         return String();
63
64     return getCalculatedDisplayName(m_callFrame, function);
65 }
66
67 DebuggerCallFrame::Type DebuggerCallFrame::type() const
68 {
69     if (m_callFrame->callee())
70         return FunctionType;
71
72     return ProgramType;
73 }
74
75 JSObject* DebuggerCallFrame::thisObject() const
76 {
77     CodeBlock* codeBlock = m_callFrame->codeBlock();
78     if (!codeBlock)
79         return 0;
80
81     JSValue thisValue = m_callFrame->uncheckedR(codeBlock->thisRegister()).jsValue();
82     if (!thisValue.isObject())
83         return 0;
84
85     return asObject(thisValue);
86 }
87
88 JSValue DebuggerCallFrame::evaluate(const String& script, JSValue& exception) const
89 {
90     if (!m_callFrame->codeBlock())
91         return JSValue();
92     
93     VM& vm = m_callFrame->vm();
94     EvalExecutable* eval = EvalExecutable::create(m_callFrame, makeSource(script), m_callFrame->codeBlock()->isStrictMode());
95     if (vm.exception()) {
96         exception = vm.exception();
97         vm.clearException();
98     }
99
100     JSValue result = vm.interpreter->execute(eval, m_callFrame, thisObject(), m_callFrame->scope());
101     if (vm.exception()) {
102         exception = vm.exception();
103         vm.clearException();
104     }
105     ASSERT(result);
106     return result;
107 }
108
109 } // namespace JSC