]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - bytecode/PutByIdVariant.h
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / bytecode / PutByIdVariant.h
index eba95e8478ada437e57e467794bb5fdcafc6b1fd..9dfedbd3e6831d939899a30ce3d5b128a4efc354 100644 (file)
 
 #include "IntendedStructureChain.h"
 #include "PropertyOffset.h"
+#include "StructureSet.h"
 
 namespace JSC {
 
+class CallLinkStatus;
+
 class PutByIdVariant {
 public:
     enum Kind {
         NotSet,
         Replace,
-        Transition
+        Transition,
+        Setter
     };
     
     PutByIdVariant()
         : m_kind(NotSet)
-        , m_oldStructure(0)
-        , m_newStructure(0)
+        , m_newStructure(nullptr)
+        , m_alternateBase(nullptr)
         , m_offset(invalidOffset)
     {
     }
     
-    static PutByIdVariant replace(Structure* structure, PropertyOffset offset)
-    {
-        PutByIdVariant result;
-        result.m_kind = Replace;
-        result.m_oldStructure = structure;
-        result.m_offset = offset;
-        return result;
-    }
+    PutByIdVariant(const PutByIdVariant&);
+    PutByIdVariant& operator=(const PutByIdVariant&);
+
+    static PutByIdVariant replace(
+        const StructureSet& structure, PropertyOffset offset);
     
     static PutByIdVariant transition(
-        Structure* oldStructure, Structure* newStructure,
-        PassRefPtr<IntendedStructureChain> structureChain, PropertyOffset offset)
-    {
-        PutByIdVariant result;
-        result.m_kind = Transition;
-        result.m_oldStructure = oldStructure;
-        result.m_newStructure = newStructure;
-        result.m_structureChain = structureChain;
-        result.m_offset = offset;
-        return result;
-    }
+        const StructureSet& oldStructure, Structure* newStructure,
+        const IntendedStructureChain* structureChain, PropertyOffset offset);
+    
+    static PutByIdVariant setter(
+        const StructureSet& structure, PropertyOffset offset,
+        IntendedStructureChain* chain, std::unique_ptr<CallLinkStatus> callLinkStatus);
     
     Kind kind() const { return m_kind; }
     
     bool isSet() const { return kind() != NotSet; }
     bool operator!() const { return !isSet(); }
     
-    Structure* structure() const
+    const StructureSet& structure() const
+    {
+        ASSERT(kind() == Replace || kind() == Setter);
+        return m_oldStructure;
+    }
+    
+    const StructureSet& oldStructure() const
     {
-        ASSERT(kind() == Replace);
+        ASSERT(kind() == Transition || kind() == Replace || kind() == Setter);
         return m_oldStructure;
     }
     
-    Structure* oldStructure() const
+    StructureSet& oldStructure()
     {
-        ASSERT(kind() == Transition || kind() == Replace);
+        ASSERT(kind() == Transition || kind() == Replace || kind() == Setter);
         return m_oldStructure;
     }
     
+    Structure* oldStructureForTransition() const;
+    
     Structure* newStructure() const
     {
         ASSERT(kind() == Transition);
         return m_newStructure;
     }
+
+    bool writesStructures() const;
+    bool reallocatesStorage() const;
+    bool makesCalls() const;
     
-    IntendedStructureChain* structureChain() const
+    const ConstantStructureCheckVector& constantChecks() const
     {
-        ASSERT(kind() == Transition);
-        return m_structureChain.get();
+        return m_constantChecks;
     }
     
     PropertyOffset offset() const
@@ -104,15 +111,35 @@ public:
         return m_offset;
     }
     
+    JSObject* alternateBase() const
+    {
+        ASSERT(kind() == Setter);
+        return m_alternateBase;
+    }
+    
+    StructureSet baseStructure() const;
+    
+    CallLinkStatus* callLinkStatus() const
+    {
+        ASSERT(kind() == Setter);
+        return m_callLinkStatus.get();
+    }
+
+    bool attemptToMerge(const PutByIdVariant& other);
+    
     void dump(PrintStream&) const;
     void dumpInContext(PrintStream&, DumpContext*) const;
 
 private:
+    bool attemptToMergeTransitionWithReplace(const PutByIdVariant& replace);
+    
     Kind m_kind;
-    Structure* m_oldStructure;
+    StructureSet m_oldStructure;
     Structure* m_newStructure;
-    RefPtr<IntendedStructureChain> m_structureChain;
+    ConstantStructureCheckVector m_constantChecks;
+    JSObject* m_alternateBase;
     PropertyOffset m_offset;
+    std::unique_ptr<CallLinkStatus> m_callLinkStatus;
 };
 
 } // namespace JSC