]> git.saurik.com Git - apple/javascriptcore.git/blame - interpreter/Register.h
JavaScriptCore-554.1.tar.gz
[apple/javascriptcore.git] / interpreter / Register.h
CommitLineData
9dae56ea
A
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#ifndef Register_h
30#define Register_h
31
32#include "JSValue.h"
ba379fdc
A
33#include <wtf/Assertions.h>
34#include <wtf/FastAllocBase.h>
9dae56ea
A
35#include <wtf/VectorTraits.h>
36
37namespace JSC {
38
39 class Arguments;
40 class CodeBlock;
41 class ExecState;
42 class JSActivation;
43 class JSFunction;
44 class JSPropertyNameIterator;
45 class ScopeChainNode;
46
47 struct Instruction;
48
49 typedef ExecState CallFrame;
50
ba379fdc 51 class Register : public WTF::FastAllocBase {
9dae56ea
A
52 public:
53 Register();
9dae56ea 54
ba379fdc
A
55 Register(const JSValue&);
56 Register& operator=(const JSValue&);
57 JSValue jsValue() const;
9dae56ea
A
58
59 bool marked() const;
60 void mark();
61
ba379fdc
A
62 Register& operator=(JSActivation*);
63 Register& operator=(CallFrame*);
64 Register& operator=(CodeBlock*);
65 Register& operator=(JSFunction*);
66 Register& operator=(JSPropertyNameIterator*);
67 Register& operator=(ScopeChainNode*);
68 Register& operator=(Instruction*);
69
70 int32_t i() const;
9dae56ea
A
71 JSActivation* activation() const;
72 Arguments* arguments() const;
73 CallFrame* callFrame() const;
74 CodeBlock* codeBlock() const;
75 JSFunction* function() const;
76 JSPropertyNameIterator* propertyNameIterator() const;
77 ScopeChainNode* scopeChain() const;
78 Instruction* vPC() const;
79
ba379fdc
A
80 static Register withInt(int32_t i)
81 {
82 Register r;
83 r.u.i = i;
84 return r;
85 }
86
87 private:
9dae56ea 88 union {
ba379fdc
A
89 int32_t i;
90 EncodedJSValue value;
9dae56ea
A
91
92 JSActivation* activation;
9dae56ea
A
93 CallFrame* callFrame;
94 CodeBlock* codeBlock;
95 JSFunction* function;
96 JSPropertyNameIterator* propertyNameIterator;
97 ScopeChainNode* scopeChain;
98 Instruction* vPC;
99 } u;
9dae56ea
A
100 };
101
9dae56ea
A
102 ALWAYS_INLINE Register::Register()
103 {
104#ifndef NDEBUG
ba379fdc 105 *this = JSValue();
9dae56ea
A
106#endif
107 }
108
ba379fdc 109 ALWAYS_INLINE Register::Register(const JSValue& v)
9dae56ea 110 {
ba379fdc 111 u.value = JSValue::encode(v);
9dae56ea
A
112 }
113
ba379fdc 114 ALWAYS_INLINE Register& Register::operator=(const JSValue& v)
9dae56ea 115 {
ba379fdc
A
116#if ENABLE(JSC_ZOMBIES)
117 ASSERT(!v.isZombie());
118#endif
119 u.value = JSValue::encode(v);
120 return *this;
9dae56ea 121 }
ba379fdc
A
122
123 ALWAYS_INLINE JSValue Register::jsValue() const
9dae56ea 124 {
ba379fdc 125 return JSValue::decode(u.value);
9dae56ea
A
126 }
127
128 ALWAYS_INLINE bool Register::marked() const
129 {
ba379fdc 130 return jsValue().marked();
9dae56ea
A
131 }
132
133 ALWAYS_INLINE void Register::mark()
134 {
ba379fdc 135 jsValue().mark();
9dae56ea
A
136 }
137
138 // Interpreter functions
139
ba379fdc 140 ALWAYS_INLINE Register& Register::operator=(JSActivation* activation)
9dae56ea 141 {
9dae56ea 142 u.activation = activation;
ba379fdc 143 return *this;
9dae56ea
A
144 }
145
ba379fdc 146 ALWAYS_INLINE Register& Register::operator=(CallFrame* callFrame)
9dae56ea 147 {
9dae56ea 148 u.callFrame = callFrame;
ba379fdc 149 return *this;
9dae56ea
A
150 }
151
ba379fdc 152 ALWAYS_INLINE Register& Register::operator=(CodeBlock* codeBlock)
9dae56ea 153 {
9dae56ea 154 u.codeBlock = codeBlock;
ba379fdc 155 return *this;
9dae56ea
A
156 }
157
ba379fdc 158 ALWAYS_INLINE Register& Register::operator=(JSFunction* function)
9dae56ea 159 {
9dae56ea 160 u.function = function;
ba379fdc 161 return *this;
9dae56ea
A
162 }
163
ba379fdc 164 ALWAYS_INLINE Register& Register::operator=(Instruction* vPC)
9dae56ea 165 {
9dae56ea 166 u.vPC = vPC;
ba379fdc 167 return *this;
9dae56ea
A
168 }
169
ba379fdc 170 ALWAYS_INLINE Register& Register::operator=(ScopeChainNode* scopeChain)
9dae56ea 171 {
9dae56ea 172 u.scopeChain = scopeChain;
ba379fdc 173 return *this;
9dae56ea
A
174 }
175
ba379fdc 176 ALWAYS_INLINE Register& Register::operator=(JSPropertyNameIterator* propertyNameIterator)
9dae56ea 177 {
9dae56ea 178 u.propertyNameIterator = propertyNameIterator;
ba379fdc 179 return *this;
9dae56ea
A
180 }
181
ba379fdc 182 ALWAYS_INLINE int32_t Register::i() const
9dae56ea 183 {
9dae56ea
A
184 return u.i;
185 }
186
9dae56ea
A
187 ALWAYS_INLINE JSActivation* Register::activation() const
188 {
9dae56ea
A
189 return u.activation;
190 }
191
9dae56ea
A
192 ALWAYS_INLINE CallFrame* Register::callFrame() const
193 {
9dae56ea
A
194 return u.callFrame;
195 }
196
197 ALWAYS_INLINE CodeBlock* Register::codeBlock() const
198 {
9dae56ea
A
199 return u.codeBlock;
200 }
201
202 ALWAYS_INLINE JSFunction* Register::function() const
203 {
9dae56ea
A
204 return u.function;
205 }
206
207 ALWAYS_INLINE JSPropertyNameIterator* Register::propertyNameIterator() const
208 {
9dae56ea
A
209 return u.propertyNameIterator;
210 }
211
212 ALWAYS_INLINE ScopeChainNode* Register::scopeChain() const
213 {
9dae56ea
A
214 return u.scopeChain;
215 }
216
217 ALWAYS_INLINE Instruction* Register::vPC() const
218 {
9dae56ea
A
219 return u.vPC;
220 }
221
9dae56ea
A
222} // namespace JSC
223
224namespace WTF {
225
226 template<> struct VectorTraits<JSC::Register> : VectorTraitsBase<true, JSC::Register> { };
227
228} // namespace WTF
229
230#endif // Register_h