2008-03-20 Maciej Stachowiak <mjs@apple.com>
[WebKit.git] / JavaScriptCore / kjs / ExecState.cpp
1 // -*- mode: c++; c-basic-offset: 4 -*-
2 /*
3  *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
4  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
5  *  Copyright (C) 2003, 2007, 2008 Apple Inc. All rights reserved.
6  *
7  *  This library is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU Library General Public
9  *  License as published by the Free Software Foundation; either
10  *  version 2 of the License, or (at your option) any later version.
11  *
12  *  This library is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  Library General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Library General Public License
18  *  along with this library; see the file COPYING.LIB.  If not, write to
19  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  *  Boston, MA 02110-1301, USA.
21  *
22  */
23
24 #include "config.h"
25 #include "ExecState.h"
26
27 #include "Activation.h"
28 #include "JSGlobalObject.h"
29 #include "function.h"
30 #include "internal.h"
31 #include "scope_chain_mark.h"
32 #include "ExecStateInlines.h"
33
34 namespace KJS {
35
36 static inline List* globalEmptyList()
37 {
38     static List staticEmptyList;
39     return &staticEmptyList;
40 }
41
42 // ECMA 10.2
43
44 // The constructor for the globalExec pseudo-ExecState
45 inline ExecState::ExecState(JSGlobalObject* globalObject)
46     : m_globalObject(globalObject)
47     , m_exception(0)
48     , m_propertyNames(CommonIdentifiers::shared())
49     , m_emptyList(globalEmptyList())
50     , m_callingExec(0)
51     , m_scopeNode(0)
52     , m_function(0)
53     , m_arguments(0)
54     , m_activation(0)
55     , m_localStorage(&globalObject->localStorage())
56     , m_inlineScopeChainNode(0, 0)
57     , m_variableObject(globalObject)
58     , m_thisValue(globalObject)
59     , m_iterationDepth(0)
60     , m_switchDepth(0) 
61     , m_codeType(GlobalCode)
62 {
63     m_scopeChain.push(globalObject);
64 }
65
66 inline ExecState::ExecState(JSGlobalObject* globalObject, JSObject* /*thisObject*/, ProgramNode* programNode)
67     : m_globalObject(globalObject)
68     , m_exception(0)
69     , m_propertyNames(CommonIdentifiers::shared())
70     , m_emptyList(globalEmptyList())
71     , m_callingExec(0)
72     , m_scopeNode(programNode)
73     , m_function(0)
74     , m_arguments(0)
75     , m_activation(0)
76     , m_localStorage(&globalObject->localStorage())
77     , m_inlineScopeChainNode(0, 0)
78     , m_variableObject(globalObject)
79     , m_thisValue(globalObject)
80     , m_iterationDepth(0)
81     , m_switchDepth(0) 
82     , m_codeType(GlobalCode)
83 {
84     // FIXME: This function ignores the "thisObject" parameter, which means that the API for evaluating
85     // a script with a this object that's not the same as the global object is broken, and probably
86     // has been for some time.
87     ASSERT(m_scopeNode);
88     m_scopeChain.push(globalObject);
89 }
90
91 inline ExecState::ExecState(JSGlobalObject* globalObject, JSObject* thisObject, EvalNode* evalNode, ExecState* callingExec, const ScopeChain& scopeChain, JSVariableObject* variableObject)
92     : m_globalObject(globalObject)
93     , m_exception(0)
94     , m_propertyNames(callingExec->m_propertyNames)
95     , m_emptyList(callingExec->m_emptyList)
96     , m_callingExec(callingExec)
97     , m_scopeNode(evalNode)
98     , m_function(0)
99     , m_arguments(0)
100     , m_activation(0)
101     , m_localStorage(callingExec->m_localStorage)
102     , m_scopeChain(scopeChain)
103     , m_inlineScopeChainNode(0, 0)
104     , m_variableObject(variableObject)
105     , m_thisValue(thisObject)
106     , m_iterationDepth(0)
107     , m_switchDepth(0) 
108     , m_codeType(EvalCode)
109 {    
110     ASSERT(m_scopeNode);
111 }
112
113 JSGlobalObject* ExecState::lexicalGlobalObject() const
114 {
115     JSObject* object = m_scopeChain.bottom();
116     if (object && object->isGlobalObject())
117         return static_cast<JSGlobalObject*>(object);
118     return m_globalObject;
119 }
120
121 GlobalExecState::GlobalExecState(JSGlobalObject* globalObject)
122     : ExecState(globalObject)
123 {
124 }
125
126 GlobalExecState::~GlobalExecState()
127 {
128 }
129
130 InterpreterExecState::InterpreterExecState(JSGlobalObject* globalObject, JSObject* thisObject, ProgramNode* programNode)
131     : ExecState(globalObject, thisObject, programNode)
132 {
133     m_globalObject->activeExecStates().append(this);
134 }
135
136 InterpreterExecState::~InterpreterExecState()
137 {
138     ASSERT(m_globalObject->activeExecStates().last() == this);
139     m_globalObject->activeExecStates().removeLast();
140 }
141
142 EvalExecState::EvalExecState(JSGlobalObject* globalObject, JSObject* thisObj, EvalNode* evalNode, ExecState* callingExec, const ScopeChain& scopeChain, JSVariableObject* variableObject)
143     : ExecState(globalObject, thisObj, evalNode, callingExec, scopeChain, variableObject)
144 {
145     m_globalObject->activeExecStates().append(this);
146 }
147
148 EvalExecState::~EvalExecState()
149 {
150     ASSERT(m_globalObject->activeExecStates().last() == this);
151     m_globalObject->activeExecStates().removeLast();
152 }
153     
154 } // namespace KJS