]>
Commit | Line | Data |
---|---|---|
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 | ||
37 | namespace 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 | ||
224 | namespace WTF { | |
225 | ||
226 | template<> struct VectorTraits<JSC::Register> : VectorTraitsBase<true, JSC::Register> { }; | |
227 | ||
228 | } // namespace WTF | |
229 | ||
230 | #endif // Register_h |