JavaScriptCore/interpreter/Register.h
changeset 0 4f2f89ce4247
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/JavaScriptCore/interpreter/Register.h	Fri Sep 17 09:02:29 2010 +0300
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef Register_h
+#define Register_h
+
+#include "JSValue.h"
+#include <wtf/Assertions.h>
+#include <wtf/FastAllocBase.h>
+#include <wtf/VectorTraits.h>
+
+namespace JSC {
+
+    class CodeBlock;
+    class ExecState;
+    class JSActivation;
+    class JSObject;
+    class JSPropertyNameIterator;
+    class ScopeChainNode;
+
+    struct Instruction;
+
+    typedef ExecState CallFrame;
+
+    class Register : public WTF::FastAllocBase {
+    public:
+        Register();
+
+        Register(const JSValue&);
+        Register& operator=(const JSValue&);
+        JSValue jsValue() const;
+        
+        Register& operator=(JSActivation*);
+        Register& operator=(CallFrame*);
+        Register& operator=(CodeBlock*);
+        Register& operator=(JSPropertyNameIterator*);
+        Register& operator=(ScopeChainNode*);
+        Register& operator=(Instruction*);
+
+        int32_t i() const;
+        JSActivation* activation() const;
+        CallFrame* callFrame() const;
+        CodeBlock* codeBlock() const;
+        JSObject* function() const;
+        JSPropertyNameIterator* propertyNameIterator() const;
+        ScopeChainNode* scopeChain() const;
+        Instruction* vPC() const;
+
+        static Register withInt(int32_t i)
+        {
+            Register r;
+            r.u.i = i;
+            return r;
+        }
+
+        static Register withCallee(JSObject* callee)
+        {
+            Register r;
+            r.u.function = callee;
+            return r;
+        }
+
+    private:
+        union {
+            int32_t i;
+            EncodedJSValue value;
+
+            JSActivation* activation;
+            CallFrame* callFrame;
+            CodeBlock* codeBlock;
+            JSObject* function;
+            JSPropertyNameIterator* propertyNameIterator;
+            ScopeChainNode* scopeChain;
+            Instruction* vPC;
+        } u;
+    };
+
+    ALWAYS_INLINE Register::Register()
+    {
+#ifndef NDEBUG
+        *this = JSValue();
+#endif
+    }
+
+    ALWAYS_INLINE Register::Register(const JSValue& v)
+    {
+#if ENABLE(JSC_ZOMBIES)
+        ASSERT(!v.isZombie());
+#endif
+        u.value = JSValue::encode(v);
+    }
+
+    ALWAYS_INLINE Register& Register::operator=(const JSValue& v)
+    {
+#if ENABLE(JSC_ZOMBIES)
+        ASSERT(!v.isZombie());
+#endif
+        u.value = JSValue::encode(v);
+        return *this;
+    }
+
+    ALWAYS_INLINE JSValue Register::jsValue() const
+    {
+        return JSValue::decode(u.value);
+    }
+
+    // Interpreter functions
+
+    ALWAYS_INLINE Register& Register::operator=(JSActivation* activation)
+    {
+        u.activation = activation;
+        return *this;
+    }
+
+    ALWAYS_INLINE Register& Register::operator=(CallFrame* callFrame)
+    {
+        u.callFrame = callFrame;
+        return *this;
+    }
+
+    ALWAYS_INLINE Register& Register::operator=(CodeBlock* codeBlock)
+    {
+        u.codeBlock = codeBlock;
+        return *this;
+    }
+
+    ALWAYS_INLINE Register& Register::operator=(Instruction* vPC)
+    {
+        u.vPC = vPC;
+        return *this;
+    }
+
+    ALWAYS_INLINE Register& Register::operator=(ScopeChainNode* scopeChain)
+    {
+        u.scopeChain = scopeChain;
+        return *this;
+    }
+
+    ALWAYS_INLINE Register& Register::operator=(JSPropertyNameIterator* propertyNameIterator)
+    {
+        u.propertyNameIterator = propertyNameIterator;
+        return *this;
+    }
+
+    ALWAYS_INLINE int32_t Register::i() const
+    {
+        return u.i;
+    }
+    
+    ALWAYS_INLINE JSActivation* Register::activation() const
+    {
+        return u.activation;
+    }
+    
+    ALWAYS_INLINE CallFrame* Register::callFrame() const
+    {
+        return u.callFrame;
+    }
+    
+    ALWAYS_INLINE CodeBlock* Register::codeBlock() const
+    {
+        return u.codeBlock;
+    }
+    
+    ALWAYS_INLINE JSObject* Register::function() const
+    {
+        return u.function;
+    }
+    
+    ALWAYS_INLINE JSPropertyNameIterator* Register::propertyNameIterator() const
+    {
+        return u.propertyNameIterator;
+    }
+    
+    ALWAYS_INLINE ScopeChainNode* Register::scopeChain() const
+    {
+        return u.scopeChain;
+    }
+    
+    ALWAYS_INLINE Instruction* Register::vPC() const
+    {
+        return u.vPC;
+    }
+
+} // namespace JSC
+
+namespace WTF {
+
+    template<> struct VectorTraits<JSC::Register> : VectorTraitsBase<true, JSC::Register> { };
+
+} // namespace WTF
+
+#endif // Register_h