We should support CreateThis in the FTL
[WebKit-https.git] / Source / JavaScriptCore / runtime / PutPropertySlot.h
index 4b0b394..be4daf7 100644 (file)
@@ -1,6 +1,5 @@
-// -*- mode: c++; c-basic-offset: 4 -*-
 /*
- * Copyright (C) 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2008-2018 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  *    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
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
-#ifndef PutPropertySlot_h
-#define PutPropertySlot_h
+#pragma once
 
+#include "JSCJSValue.h"
+#include "PropertySlot.h"
 #include <wtf/Assertions.h>
 
 namespace JSC {
     
-    class JSObject;
-    class JSFunction;
+class JSObject;
+class JSFunction;
     
-    class PutPropertySlot {
-    public:
-        enum Type { Uncachable, ExistingProperty, NewProperty };
-
-        PutPropertySlot(bool isStrictMode = false)
-            : m_type(Uncachable)
-            , m_base(0)
-            , m_isStrictMode(isStrictMode)
-        {
-        }
-
-        void setExistingProperty(JSObject* base, size_t offset)
-        {
-            m_type = ExistingProperty;
-            m_base = base;
-            m_offset = offset;
-        }
-
-        void setNewProperty(JSObject* base, size_t offset)
-        {
-            m_type = NewProperty;
-            m_base = base;
-            m_offset = offset;
-        }
-
-        Type type() const { return m_type; }
-        JSObject* base() const { return m_base; }
-
-        bool isStrictMode() const { return m_isStrictMode; }
-        bool isCacheable() const { return m_type != Uncachable; }
-        size_t cachedOffset() const {
-            ASSERT(isCacheable());
-            return m_offset;
-        }
-    private:
-        Type m_type;
-        JSObject* m_base;
-        size_t m_offset;
-        bool m_isStrictMode;
-    };
+class PutPropertySlot {
+public:
+    enum Type { Uncachable, ExistingProperty, NewProperty, SetterProperty, CustomValue, CustomAccessor };
+    enum Context { UnknownContext, PutById, PutByIdEval };
+    typedef bool (*PutValueFunc)(ExecState*, EncodedJSValue thisObject, EncodedJSValue value);
 
-} // namespace JSC
+    PutPropertySlot(JSValue thisValue, bool isStrictMode = false, Context context = UnknownContext, bool isInitialization = false)
+        : m_type(Uncachable)
+        , m_base(0)
+        , m_thisValue(thisValue)
+        , m_offset(invalidOffset)
+        , m_isStrictMode(isStrictMode)
+        , m_isInitialization(isInitialization)
+        , m_context(context)
+        , m_cacheability(CachingAllowed)
+    {
+    }
+
+    void setExistingProperty(JSObject* base, PropertyOffset offset)
+    {
+        m_type = ExistingProperty;
+        m_base = base;
+        m_offset = offset;
+    }
+
+    void setNewProperty(JSObject* base, PropertyOffset offset)
+    {
+        m_type = NewProperty;
+        m_base = base;
+        m_offset = offset;
+    }
+
+    void setCustomValue(JSObject* base, FunctionPtr<OperationPtrTag> function)
+    {
+        m_type = CustomValue;
+        m_base = base;
+        m_putFunction = function;
+    }
+
+    void setCustomAccessor(JSObject* base, FunctionPtr<OperationPtrTag> function)
+    {
+        m_type = CustomAccessor;
+        m_base = base;
+        m_putFunction = function;
+    }
+
+    void setCacheableSetter(JSObject* base, PropertyOffset offset)
+    {
+        m_type = SetterProperty;
+        m_base = base;
+        m_offset = offset;
+    }
+
+    void setThisValue(JSValue thisValue)
+    {
+        m_thisValue = thisValue;
+    }
+
+    void setStrictMode(bool value)
+    {
+        m_isStrictMode = value;
+    }
+
+    FunctionPtr<OperationPtrTag> customSetter() const
+    {
+        ASSERT(isCacheableCustom());
+        return m_putFunction;
+    }
 
-#endif // PutPropertySlot_h
+    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 isCacheable() && (m_type == NewProperty || m_type == ExistingProperty); }
+    bool isCacheableSetter() const { return isCacheable() && m_type == SetterProperty; }
+    bool isCacheableCustom() const { return isCacheable() && (m_type == CustomValue || m_type == CustomAccessor); }
+    bool isCustomAccessor() const { return isCacheable() && m_type == CustomAccessor; }
+    bool isInitialization() const { return m_isInitialization; }
+
+    PropertyOffset cachedOffset() const
+    {
+        return m_offset;
+    }
+
+    void disableCaching()
+    {
+        m_cacheability = CachingDisallowed;
+    }
+
+private:
+    bool isCacheable() const { return m_cacheability == CachingAllowed; }
+
+    Type m_type;
+    JSObject* m_base;
+    JSValue m_thisValue;
+    PropertyOffset m_offset;
+    bool m_isStrictMode;
+    bool m_isInitialization;
+    uint8_t m_context;
+    CacheabilityType m_cacheability;
+    FunctionPtr<OperationPtrTag> m_putFunction;
+};
+
+} // namespace JSC