]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - bytecode/PolymorphicPutByIdList.h
JavaScriptCore-7600.1.4.13.1.tar.gz
[apple/javascriptcore.git] / bytecode / PolymorphicPutByIdList.h
index 6e88e706225ed64d1e682f4b949c34b81a974f57..15d7bde31c9d1eb2a3a5ec1a3db1394f49e4c34a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012, 2014 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #ifndef PolymorphicPutByIdList_h
 #define PolymorphicPutByIdList_h
 
-#include <wtf/Platform.h>
-
 #if ENABLE(JIT)
 
 #include "CodeOrigin.h"
 #include "MacroAssembler.h"
 #include "Opcode.h"
 #include "PutKind.h"
+#include "PutPropertySlot.h"
 #include "Structure.h"
 #include <wtf/Vector.h>
 
 namespace JSC {
 
+class CodeBlock;
 struct StructureStubInfo;
 
 class PutByIdAccess {
@@ -46,7 +46,9 @@ public:
     enum AccessType {
         Invalid,
         Transition,
-        Replace
+        Replace,
+        Setter,
+        CustomSetter
     };
     
     PutByIdAccess()
@@ -67,10 +69,11 @@ public:
         result.m_oldStructure.set(vm, owner, oldStructure);
         result.m_newStructure.set(vm, owner, newStructure);
         result.m_chain.set(vm, owner, chain);
+        result.m_customSetter = 0;
         result.m_stubRoutine = stubRoutine;
         return result;
     }
-    
+
     static PutByIdAccess replace(
         VM& vm,
         JSCell* owner,
@@ -80,13 +83,33 @@ public:
         PutByIdAccess result;
         result.m_type = Replace;
         result.m_oldStructure.set(vm, owner, structure);
+        result.m_customSetter = 0;
+        result.m_stubRoutine = stubRoutine;
+        return result;
+    }
+
+
+    static PutByIdAccess setter(
+        VM& vm,
+        JSCell* owner,
+        AccessType accessType,
+        Structure* structure,
+        StructureChain* chain,
+        PutPropertySlot::PutValueFunc customSetter,
+        PassRefPtr<JITStubRoutine> stubRoutine)
+    {
+        RELEASE_ASSERT(accessType == Setter || accessType == CustomSetter);
+        PutByIdAccess result;
+        result.m_oldStructure.set(vm, owner, structure);
+        result.m_type = accessType;
+        if (chain)
+            result.m_chain.set(vm, owner, chain);
+        result.m_customSetter = customSetter;
         result.m_stubRoutine = stubRoutine;
         return result;
     }
     
-    static PutByIdAccess fromStructureStubInfo(
-        StructureStubInfo&,
-        MacroAssemblerCodePtr initialSlowPath);
+    static PutByIdAccess fromStructureStubInfo(StructureStubInfo&);
     
     bool isSet() const { return m_type != Invalid; }
     bool operator!() const { return !isSet(); }
@@ -95,12 +118,14 @@ public:
     
     bool isTransition() const { return m_type == Transition; }
     bool isReplace() const { return m_type == Replace; }
+    bool isSetter() const { return m_type == Setter; }
+    bool isCustom() const { return m_type == CustomSetter; }
     
     Structure* oldStructure() const
     {
         // Using this instead of isSet() to make this assertion robust against the possibility
         // of additional access types being added.
-        ASSERT(isTransition() || isReplace());
+        ASSERT(isTransition() || isReplace() || isSetter() || isCustom());
         
         return m_oldStructure.get();
     }
@@ -119,43 +144,41 @@ public:
     
     StructureChain* chain() const
     {
-        ASSERT(isTransition());
+        ASSERT(isTransition() || isSetter() || isCustom());
         return m_chain.get();
     }
     
-    PassRefPtr<JITStubRoutine> stubRoutine() const
+    JITStubRoutine* stubRoutine() const
     {
-        ASSERT(isTransition() || isReplace());
-        return m_stubRoutine;
+        ASSERT(isTransition() || isReplace() || isSetter() || isCustom());
+        return m_stubRoutine.get();
     }
-    
-    bool visitWeak() const;
+
+    PutPropertySlot::PutValueFunc customSetter() const
+    {
+        ASSERT(isCustom());
+        return m_customSetter;
+    }
+
+    bool visitWeak(RepatchBuffer&) const;
     
 private:
+    friend class CodeBlock;
+    
     AccessType m_type;
     WriteBarrier<Structure> m_oldStructure;
     WriteBarrier<Structure> m_newStructure;
     WriteBarrier<StructureChain> m_chain;
+    PutPropertySlot::PutValueFunc m_customSetter;
     RefPtr<JITStubRoutine> m_stubRoutine;
 };
 
 class PolymorphicPutByIdList {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    // Initialize from a stub info; this will place one element in the list and it will
-    // be created by converting the stub info's put by id access information into our
-    // PutByIdAccess.
-    PolymorphicPutByIdList(
-        PutKind,
-        StructureStubInfo&,
-        MacroAssemblerCodePtr initialSlowPath);
-
     // Either creates a new polymorphic put list, or returns the one that is already
     // in place.
-    static PolymorphicPutByIdList* from(
-        PutKind,
-        StructureStubInfo&,
-        MacroAssemblerCodePtr initialSlowPath);
+    static PolymorphicPutByIdList* from(PutKind, StructureStubInfo&);
     
     ~PolymorphicPutByIdList();
     
@@ -175,9 +198,16 @@ public:
     
     PutKind kind() const { return m_kind; }
     
-    bool visitWeak() const;
+    bool visitWeak(RepatchBuffer&) const;
     
 private:
+    friend class CodeBlock;
+    
+    // Initialize from a stub info; this will place one element in the list and it will
+    // be created by converting the stub info's put by id access information into our
+    // PutByIdAccess.
+    PolymorphicPutByIdList(PutKind, StructureStubInfo&);
+
     Vector<PutByIdAccess, 2> m_list;
     PutKind m_kind;
 };