1 /* 2 * Copyright (C) 2008, 2009 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" 33 #include <wtf/Assertions.h> 34 #include <wtf/VectorTraits.h> 35 36 namespace JSC { 37 38 class CodeBlock; 39 class ExecState; 40 class JSActivation; 41 class JSObject; 42 class JSPropertyNameIterator; 43 class ScopeChainNode; 44 45 struct Instruction; 46 47 typedef ExecState CallFrame; 48 49 class Register { 50 WTF_MAKE_FAST_ALLOCATED; 51 public: 52 Register(); 53 54 Register(const JSValue&); 55 Register& operator=(const JSValue&); 56 JSValue jsValue() const; 57 EncodedJSValue encodedJSValue() const; 58 59 Register& operator=(CallFrame*); 60 Register& operator=(CodeBlock*); 61 Register& operator=(ScopeChainNode*); 62 Register& operator=(Instruction*); 63 64 int32_t i() const; 65 JSActivation* activation() const; 66 CallFrame* callFrame() const; 67 CodeBlock* codeBlock() const; 68 JSObject* function() const; 69 JSPropertyNameIterator* propertyNameIterator() const; 70 ScopeChainNode* scopeChain() const; 71 Instruction* vPC() const; 72 withInt(int32_t i)73 static Register withInt(int32_t i) 74 { 75 Register r = jsNumber(i); 76 return r; 77 } 78 79 static inline Register withCallee(JSObject* callee); 80 81 private: 82 union { 83 EncodedJSValue value; 84 CallFrame* callFrame; 85 CodeBlock* codeBlock; 86 Instruction* vPC; 87 } u; 88 }; 89 Register()90 ALWAYS_INLINE Register::Register() 91 { 92 #ifndef NDEBUG 93 *this = JSValue(); 94 #endif 95 } 96 Register(const JSValue & v)97 ALWAYS_INLINE Register::Register(const JSValue& v) 98 { 99 #if ENABLE(JSC_ZOMBIES) 100 ASSERT(!v.isZombie()); 101 #endif 102 u.value = JSValue::encode(v); 103 } 104 105 ALWAYS_INLINE Register& Register::operator=(const JSValue& v) 106 { 107 #if ENABLE(JSC_ZOMBIES) 108 ASSERT(!v.isZombie()); 109 #endif 110 u.value = JSValue::encode(v); 111 return *this; 112 } 113 jsValue()114 ALWAYS_INLINE JSValue Register::jsValue() const 115 { 116 return JSValue::decode(u.value); 117 } 118 encodedJSValue()119 ALWAYS_INLINE EncodedJSValue Register::encodedJSValue() const 120 { 121 return u.value; 122 } 123 124 // Interpreter functions 125 126 ALWAYS_INLINE Register& Register::operator=(CallFrame* callFrame) 127 { 128 u.callFrame = callFrame; 129 return *this; 130 } 131 132 ALWAYS_INLINE Register& Register::operator=(CodeBlock* codeBlock) 133 { 134 u.codeBlock = codeBlock; 135 return *this; 136 } 137 138 ALWAYS_INLINE Register& Register::operator=(Instruction* vPC) 139 { 140 u.vPC = vPC; 141 return *this; 142 } 143 i()144 ALWAYS_INLINE int32_t Register::i() const 145 { 146 return jsValue().asInt32(); 147 } 148 callFrame()149 ALWAYS_INLINE CallFrame* Register::callFrame() const 150 { 151 return u.callFrame; 152 } 153 codeBlock()154 ALWAYS_INLINE CodeBlock* Register::codeBlock() const 155 { 156 return u.codeBlock; 157 } 158 vPC()159 ALWAYS_INLINE Instruction* Register::vPC() const 160 { 161 return u.vPC; 162 } 163 164 } // namespace JSC 165 166 namespace WTF { 167 168 template<> struct VectorTraits<JSC::Register> : VectorTraitsBase<true, JSC::Register> { }; 169 170 } // namespace WTF 171 172 #endif // Register_h 173