]> 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 0f694e33bb56a52dea3215ff9352e96e76c224e2..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
@@ -27,6 +27,8 @@
 #ifndef PutPropertySlot_h
 #define PutPropertySlot_h
 
+#include "JSCJSValue.h"
+
 #include <wtf/Assertions.h>
 
 namespace JSC {
@@ -36,12 +38,17 @@ namespace JSC {
     
     class PutPropertySlot {
     public:
-        enum Type { Uncachable, 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(bool isStrictMode = false)
+        PutPropertySlot(JSValue thisValue, bool isStrictMode = false, Context context = UnknownContext)
             : m_type(Uncachable)
             , m_base(0)
+            , m_thisValue(thisValue)
             , m_isStrictMode(isStrictMode)
+            , m_context(context)
+            , m_putFunction(nullptr)
         {
         }
 
@@ -59,22 +66,47 @@ namespace JSC {
             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 isCacheable() const { return m_type != Uncachable; }
+        bool isCacheablePut() const { return m_type == NewProperty || m_type == ExistingProperty; }
+        bool isCacheableSetter() const { return m_type == SetterProperty; }
+        bool isCacheableCustom() const { return m_type == CustomProperty; }
+
         PropertyOffset cachedOffset() const
         {
-            ASSERT(isCacheable());
             return m_offset;
         }
 
     private:
         Type m_type;
         JSObject* m_base;
+        JSValue m_thisValue;
         PropertyOffset m_offset;
         bool m_isStrictMode;
+        uint8_t m_context;
+        PutValueFunc m_putFunction;
+
     };
 
 } // namespace JSC