]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - runtime/PutPropertySlot.h
JavaScriptCore-7600.1.4.16.1.tar.gz
[apple/javascriptcore.git] / runtime / PutPropertySlot.h
index 1e2dfe920eedb5d441b2f1b88eb8441da87ec84e..503411b592886708ef428df3bb733b2668f20bd3 100644 (file)
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 COMPUTER, INC. OR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
  * 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
 #ifndef PutPropertySlot_h
 #define PutPropertySlot_h
 
+#include "JSCJSValue.h"
+
 #include <wtf/Assertions.h>
 
 namespace JSC {
     
     class JSObject;
+    class JSFunction;
     
     class PutPropertySlot {
     public:
-        enum Type { Invalid, ExistingProperty, NewProperty };
+        enum Type { Uncachable, ExistingProperty, NewProperty, SetterProperty, CustomProperty };
+        enum Context { UnknownContext, PutById, PutByIdEval };
+        typedef void (*PutValueFunc)(ExecState*, JSObject* base, EncodedJSValue thisObject, EncodedJSValue value);
 
-        PutPropertySlot()
-            : m_type(Invalid)
+        PutPropertySlot(JSValue thisValue, bool isStrictMode = false, Context context = UnknownContext)
+            : m_type(Uncachable)
             , m_base(0)
-            , m_wasTransition(false)
+            , m_thisValue(thisValue)
+            , m_isStrictMode(isStrictMode)
+            , m_context(context)
+            , m_putFunction(nullptr)
         {
         }
 
-        void setExistingProperty(JSObject* base, size_t offset)
+        void setExistingProperty(JSObject* base, PropertyOffset offset)
         {
             m_type = ExistingProperty;
             m_base = base;
             m_offset = offset;
         }
 
-        void setNewProperty(JSObject* base, size_t offset)
+        void setNewProperty(JSObject* base, PropertyOffset offset)
         {
             m_type = NewProperty;
             m_base = base;
             m_offset = offset;
         }
 
+        void setCustomProperty(JSObject* base, PutValueFunc function)
+        {
+            m_type = CustomProperty;
+            m_base = base;
+            m_putFunction = function;
+        }
+        
+        void setCacheableSetter(JSObject* base, PropertyOffset offset)
+        {
+            m_type = SetterProperty;
+            m_base = base;
+            m_offset = offset;
+        }
+
+        PutValueFunc customSetter() const { return m_putFunction; }
+
+        Context context() const { return static_cast<Context>(m_context); }
+
         Type type() const { return m_type; }
         JSObject* base() const { return m_base; }
+        JSValue thisValue() const { return m_thisValue; }
+
+        bool isStrictMode() const { return m_isStrictMode; }
+        bool isCacheablePut() const { return m_type == NewProperty || m_type == ExistingProperty; }
+        bool isCacheableSetter() const { return m_type == SetterProperty; }
+        bool isCacheableCustom() const { return m_type == CustomProperty; }
 
-        bool isCacheable() const { return m_type != Invalid; }
-        size_t cachedOffset() const {
-            ASSERT(isCacheable());
+        PropertyOffset cachedOffset() const
+        {
             return m_offset;
         }
-        
-        bool wasTransition() const { return m_wasTransition; }
-        void setWasTransition(bool wasTransition) { m_wasTransition = wasTransition; }
+
     private:
         Type m_type;
         JSObject* m_base;
-        bool m_wasTransition;
-        size_t m_offset;
+        JSValue m_thisValue;
+        PropertyOffset m_offset;
+        bool m_isStrictMode;
+        uint8_t m_context;
+        PutValueFunc m_putFunction;
+
     };
 
 } // namespace JSC