Title: [94814] trunk/Source
Revision
94814
Author
oli...@apple.com
Date
2011-09-08 15:52:04 -0700 (Thu, 08 Sep 2011)

Log Message

Use bump allocator for initial property storage
https://bugs.webkit.org/show_bug.cgi?id=67494

Reviewed by Geoffrey Garen.

../../../../Volumes/Data/git/WebKit/OpenSource/Source/_javascript_Core:

Use a bump allocator for initial allocation of property storage,
and promote to fastMalloc memory only if it survives a GC pass.

Comes out as a 1% win on v8, and is a useful step on the way to
GC allocation of all property storage.

* _javascript_Core.exp:
* _javascript_Core.vcproj/_javascript_Core/_javascript_Core.def:
* _javascript_Core.xcodeproj/project.pbxproj:
* heap/Heap.cpp:
(JSC::Heap::collect):
* heap/Heap.h:
(JSC::Heap::allocatePropertyStorage):
(JSC::Heap::inPropertyStorageNursery):
* heap/MarkedBlock.h:
* heap/NewSpace.cpp:
(JSC::NewSpace::NewSpace):
* heap/NewSpace.h:
(JSC::NewSpace::resetPropertyStorageNursery):
(JSC::NewSpace::allocatePropertyStorage):
(JSC::NewSpace::inPropertyStorageNursery):
* jit/JITStubs.cpp:
(JSC::DEFINE_STUB_FUNCTION):
* runtime/JSObject.cpp:
(JSC::JSObject::allocatePropertyStorage):
* runtime/JSObject.h:
(JSC::JSObject::isUsingInlineStorage):
(JSC::JSObject::JSObject):
(JSC::JSObject::propertyStorage):
(JSC::JSObject::~JSObject):
(JSC::JSObject::putDirectInternal):
(JSC::JSObject::putDirectWithoutTransition):
(JSC::JSObject::putDirectFunctionWithoutTransition):
(JSC::JSObject::transitionTo):
(JSC::JSObject::visitChildrenDirect):
* runtime/StorageBarrier.h: Added.
(JSC::StorageBarrier::StorageBarrier):
(JSC::StorageBarrier::set):
(JSC::StorageBarrier::operator->):
(JSC::StorageBarrier::operator*):
(JSC::StorageBarrier::operator[]):
(JSC::StorageBarrier::get):

../../../../Volumes/Data/git/WebKit/OpenSource/Source/WebCore:

Add a forwarding header.

* ForwardingHeaders/runtime/StorageBarrier.h: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (94813 => 94814)


--- trunk/Source/_javascript_Core/ChangeLog	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/ChangeLog	2011-09-08 22:52:04 UTC (rev 94814)
@@ -1,3 +1,53 @@
+2011-09-08  Oliver Hunt  <oli...@apple.com>
+
+        Use bump allocator for initial property storage
+        https://bugs.webkit.org/show_bug.cgi?id=67494
+
+        Reviewed by Geoffrey Garen.
+
+        Use a bump allocator for initial allocation of property storage,
+        and promote to fastMalloc memory only if it survives a GC pass.
+
+        Comes out as a 1% win on v8, and is a useful step on the way to
+        GC allocation of all property storage.
+
+        * _javascript_Core.exp:
+        * _javascript_Core.vcproj/_javascript_Core/_javascript_Core.def:
+        * _javascript_Core.xcodeproj/project.pbxproj:
+        * heap/Heap.cpp:
+        (JSC::Heap::collect):
+        * heap/Heap.h:
+        (JSC::Heap::allocatePropertyStorage):
+        (JSC::Heap::inPropertyStorageNursery):
+        * heap/MarkedBlock.h:
+        * heap/NewSpace.cpp:
+        (JSC::NewSpace::NewSpace):
+        * heap/NewSpace.h:
+        (JSC::NewSpace::resetPropertyStorageNursery):
+        (JSC::NewSpace::allocatePropertyStorage):
+        (JSC::NewSpace::inPropertyStorageNursery):
+        * jit/JITStubs.cpp:
+        (JSC::DEFINE_STUB_FUNCTION):
+        * runtime/JSObject.cpp:
+        (JSC::JSObject::allocatePropertyStorage):
+        * runtime/JSObject.h:
+        (JSC::JSObject::isUsingInlineStorage):
+        (JSC::JSObject::JSObject):
+        (JSC::JSObject::propertyStorage):
+        (JSC::JSObject::~JSObject):
+        (JSC::JSObject::putDirectInternal):
+        (JSC::JSObject::putDirectWithoutTransition):
+        (JSC::JSObject::putDirectFunctionWithoutTransition):
+        (JSC::JSObject::transitionTo):
+        (JSC::JSObject::visitChildrenDirect):
+        * runtime/StorageBarrier.h: Added.
+        (JSC::StorageBarrier::StorageBarrier):
+        (JSC::StorageBarrier::set):
+        (JSC::StorageBarrier::operator->):
+        (JSC::StorageBarrier::operator*):
+        (JSC::StorageBarrier::operator[]):
+        (JSC::StorageBarrier::get):
+
 2011-09-08  Sam Weinig  <s...@webkit.org>
 
         Remove the Completion object from JSC, I have never liked it

Modified: trunk/Source/_javascript_Core/GNUmakefile.list.am (94813 => 94814)


--- trunk/Source/_javascript_Core/GNUmakefile.list.am	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/GNUmakefile.list.am	2011-09-08 22:52:04 UTC (rev 94814)
@@ -417,6 +417,7 @@
 	Source/_javascript_Core/runtime/ScopeChainMark.h \
 	Source/_javascript_Core/runtime/SmallStrings.cpp \
 	Source/_javascript_Core/runtime/SmallStrings.h \
+	Source/_javascript_Core/runtime/StorageBarrier.h \
 	Source/_javascript_Core/runtime/StrictEvalActivation.cpp \
 	Source/_javascript_Core/runtime/StrictEvalActivation.h \
 	Source/_javascript_Core/runtime/StringConstructor.cpp \

Modified: trunk/Source/_javascript_Core/_javascript_Core.exp (94813 => 94814)


--- trunk/Source/_javascript_Core/_javascript_Core.exp	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/_javascript_Core.exp	2011-09-08 22:52:04 UTC (rev 94814)
@@ -215,6 +215,7 @@
 __ZN3JSC22globalMemoryStatisticsEv
 __ZN3JSC22objectConstructorTableE
 __ZN3JSC23AbstractSamplingCounter4dumpEv
+__ZN3JSC23AbstractSamplingCounter30s_abstractSamplingCounterChainE
 __ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateE
 __ZN3JSC23setUpStaticFunctionSlotEPNS_9ExecStateEPKNS_9HashEntryEPNS_8JSObjectERKNS_10IdentifierERNS_12PropertySlotE
 __ZN3JSC24DynamicGlobalObjectScopeC1ERNS_12JSGlobalDataEPNS_14JSGlobalObjectE
@@ -320,7 +321,7 @@
 __ZN3JSC8JSObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE
 __ZN3JSC8JSObject21getPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE
 __ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_16WriteBarrierBaseINS_7UnknownEEE
-__ZN3JSC8JSObject23allocatePropertyStorageEmm
+__ZN3JSC8JSObject23allocatePropertyStorageERNS_12JSGlobalDataEmm
 __ZN3JSC8JSObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE
 __ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE
 __ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_7JSValueE

Modified: trunk/Source/_javascript_Core/_javascript_Core.gypi (94813 => 94814)


--- trunk/Source/_javascript_Core/_javascript_Core.gypi	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/_javascript_Core.gypi	2011-09-08 22:52:04 UTC (rev 94814)
@@ -114,6 +114,7 @@
             'runtime/RopeImpl.h',
             'runtime/ScopeChain.h',
             'runtime/SmallStrings.h',
+            'runtime/StorageBarrier.h',
             'runtime/StringObject.h',
             'runtime/StringObjectThatMasqueradesAsUndefined.h',
             'runtime/StringPrototype.h',

Modified: trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def (94813 => 94814)


--- trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def	2011-09-08 22:52:04 UTC (rev 94814)
@@ -59,7 +59,7 @@
     ?addSlowCase@Identifier@JSC@@CA?AV?$PassRefPtr@VStringImpl@WTF@@@WTF@@PAVExecState@2@PAVStringImpl@4@@Z
     ?addStaticGlobals@JSGlobalObject@JSC@@IAEXPAUGlobalPropertyInfo@12@H@Z
     ?allocate@Heap@JSC@@QAEPAXAAUSizeClass@NewSpace@2@@Z
-    ?allocatePropertyStorage@JSObject@JSC@@QAEXII@Z
+    ?allocatePropertyStorage@JSObject@JSC@@QAEXAAVJSGlobalData@2@II@Z
     ?allocateSlowCase@Heap@JSC@@AAEPAXAAUSizeClass@NewSpace@2@@Z
     ?append@StringBuilder@WTF@@QAEXPBDI@Z
     ?append@StringBuilder@WTF@@QAEXPB_WI@Z

Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (94813 => 94814)


--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2011-09-08 22:52:04 UTC (rev 94814)
@@ -416,6 +416,7 @@
 		A766B44F0EE8DCD1009518CA /* ExecutableAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = A7B48DB50EE74CFC00DCBDB6 /* ExecutableAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		A76C51761182748D00715B05 /* JSInterfaceJIT.h in Headers */ = {isa = PBXBuildFile; fileRef = A76C51741182748D00715B05 /* JSInterfaceJIT.h */; };
 		A76F54A313B28AAB00EF2BCE /* JITWriteBarrier.h in Headers */ = {isa = PBXBuildFile; fileRef = A76F54A213B28AAB00EF2BCE /* JITWriteBarrier.h */; };
+		A781E359141970C700094D90 /* StorageBarrier.h in Headers */ = {isa = PBXBuildFile; fileRef = A781E358141970C700094D90 /* StorageBarrier.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		A784A26111D16622005776AC /* ASTBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A7EE7411B98B8D0065A14F /* ASTBuilder.h */; };
 		A784A26211D16622005776AC /* JSParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7A7EE7511B98B8D0065A14F /* JSParser.cpp */; };
 		A784A26311D16622005776AC /* JSParser.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A7EE7611B98B8D0065A14F /* JSParser.h */; };
@@ -1182,6 +1183,7 @@
 		A75706DD118A2BCF0057F88F /* JITArithmetic32_64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JITArithmetic32_64.cpp; sourceTree = "<group>"; };
 		A76C51741182748D00715B05 /* JSInterfaceJIT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSInterfaceJIT.h; sourceTree = "<group>"; };
 		A76F54A213B28AAB00EF2BCE /* JITWriteBarrier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITWriteBarrier.h; sourceTree = "<group>"; };
+		A781E358141970C700094D90 /* StorageBarrier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageBarrier.h; sourceTree = "<group>"; };
 		A791EF260F11E07900AE1F68 /* JSByteArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSByteArray.h; sourceTree = "<group>"; };
 		A791EF270F11E07900AE1F68 /* JSByteArray.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSByteArray.cpp; sourceTree = "<group>"; };
 		A79EDB0811531CD60019E912 /* JSObjectRefPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSObjectRefPrivate.h; sourceTree = "<group>"; };
@@ -2104,6 +2106,7 @@
 				7E2C6C980D31C6B6002D44E2 /* ScopeChainMark.h */,
 				93303FE80E6A72B500786E6A /* SmallStrings.cpp */,
 				93303FEA0E6A72C000786E6A /* SmallStrings.h */,
+				A781E358141970C700094D90 /* StorageBarrier.h */,
 				A730B6111250068F009D25B1 /* StrictEvalActivation.cpp */,
 				A730B6101250068F009D25B1 /* StrictEvalActivation.h */,
 				BC18C3C00E16EE3300B34460 /* StringConstructor.cpp */,
@@ -2748,6 +2751,7 @@
 				866739D313BFDE710023D87C /* Uint16WithFraction.h in Headers */,
 				BC66BAE413F492CC00C23FAE /* Compiler.h in Headers */,
 				A7BC0C82140608B000B1BB71 /* CheckedArithmetic.h in Headers */,
+				A781E359141970C700094D90 /* StorageBarrier.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: trunk/Source/_javascript_Core/heap/Heap.cpp (94813 => 94814)


--- trunk/Source/_javascript_Core/heap/Heap.cpp	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/heap/Heap.cpp	2011-09-08 22:52:04 UTC (rev 94814)
@@ -690,7 +690,7 @@
     // new bytes allocated) proportion, and seems to work well in benchmarks.
     size_t proportionalBytes = 2 * size();
     m_newSpace.setHighWaterMark(max(proportionalBytes, m_minBytesPerCycle));
-
+    m_newSpace.resetPropertyStorageNursery();
     _javascript_CORE_GC_END();
 
     (*m_activityCallback)();

Modified: trunk/Source/_javascript_Core/heap/Heap.h (94813 => 94814)


--- trunk/Source/_javascript_Core/heap/Heap.h	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/heap/Heap.h	2011-09-08 22:52:04 UTC (rev 94814)
@@ -91,6 +91,9 @@
         void notifyIsSafeToCollect() { m_isSafeToCollect = true; }
         void collectAllGarbage();
 
+        inline void* allocatePropertyStorage(size_t);
+        inline bool inPropertyStorageNursery(void*);
+
         void reportExtraMemoryCost(size_t cost);
 
         void protect(JSValue);
@@ -163,7 +166,7 @@
         RegisterFile& registerFile();
 
         static void writeBarrierSlowCase(const JSCell*, JSCell*);
-        
+
 #if ENABLE(LAZY_BLOCK_FREEING)
         void waitForRelativeTimeWhileHoldingLock(double relative);
         void waitForRelativeTime(double relative);
@@ -359,6 +362,22 @@
         return allocate(sizeClass);
     }
 
+    inline void* Heap::allocatePropertyStorage(size_t bytes)
+    {
+        ASSERT(!(bytes % sizeof(JSValue)));
+        if (bytes >= NewSpace::PropertyStorageNurserySize)
+            return 0;
+        if (void* result = m_newSpace.allocatePropertyStorage(bytes))
+            return result;
+        collect(DoNotSweep);
+        return m_newSpace.allocatePropertyStorage(bytes);
+    }
+    
+    inline bool Heap::inPropertyStorageNursery(void* ptr)
+    {
+        return m_newSpace.inPropertyStorageNursery(ptr);
+    }
+
 } // namespace JSC
 
 #endif // Heap_h

Modified: trunk/Source/_javascript_Core/heap/MarkedBlock.h (94813 => 94814)


--- trunk/Source/_javascript_Core/heap/MarkedBlock.h	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/heap/MarkedBlock.h	2011-09-08 22:52:04 UTC (rev 94814)
@@ -48,6 +48,7 @@
     typedef uintptr_t Bits;
 
     static const size_t KB = 1024;
+    static const size_t MB = 1024 * 1024;
     
     // A marked block is a page-aligned container for heap-allocated objects.
     // Objects are allocated within cells of the marked block. For a given

Modified: trunk/Source/_javascript_Core/heap/NewSpace.cpp (94813 => 94814)


--- trunk/Source/_javascript_Core/heap/NewSpace.cpp	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/heap/NewSpace.cpp	2011-09-08 22:52:04 UTC (rev 94814)
@@ -32,7 +32,9 @@
 class Structure;
 
 NewSpace::NewSpace(Heap* heap)
-    : m_waterMark(0)
+    : m_propertyStorageNursery(static_cast<char*>(fastMalloc(PropertyStorageNurserySize)))
+    , m_propertyStorageAllocationPoint(m_propertyStorageNursery)
+    , m_waterMark(0)
     , m_highWaterMark(0)
     , m_heap(heap)
 {

Modified: trunk/Source/_javascript_Core/heap/NewSpace.h (94813 => 94814)


--- trunk/Source/_javascript_Core/heap/NewSpace.h	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/heap/NewSpace.h	2011-09-08 22:52:04 UTC (rev 94814)
@@ -46,6 +46,7 @@
         WTF_MAKE_NONCOPYABLE(NewSpace);
     public:
         static const size_t maxCellSize = 1024;
+        static const size_t PropertyStorageNurserySize = 4 * MB;
 
         struct SizeClass {
             SizeClass();
@@ -63,6 +64,10 @@
 
         SizeClass& sizeClassFor(size_t);
         void* allocate(SizeClass&);
+        inline void* allocatePropertyStorage(size_t);
+        inline bool inPropertyStorageNursery(void* ptr);
+        inline void resetPropertyStorageNursery();
+        
         void resetAllocator();
 
         void addBlock(SizeClass&, MarkedBlock*);
@@ -91,6 +96,8 @@
 
         SizeClass m_preciseSizeClasses[preciseCount];
         SizeClass m_impreciseSizeClasses[impreciseCount];
+        char* m_propertyStorageNursery;
+        char* m_propertyStorageAllocationPoint;
         size_t m_waterMark;
         size_t m_highWaterMark;
         Heap* m_heap;
@@ -160,6 +167,30 @@
         return firstFreeCell;
     }
 
+    inline void NewSpace::resetPropertyStorageNursery()
+    {
+        m_propertyStorageAllocationPoint = m_propertyStorageNursery;
+    }
+    
+    inline void* NewSpace::allocatePropertyStorage(size_t size)
+    {
+        char* result = m_propertyStorageAllocationPoint;
+        if (size > PropertyStorageNurserySize)
+            CRASH();
+        m_propertyStorageAllocationPoint += size;
+        if (static_cast<size_t>(m_propertyStorageAllocationPoint - m_propertyStorageNursery) > PropertyStorageNurserySize) {
+            m_propertyStorageAllocationPoint = result;
+            return 0;
+        }
+        return result;
+    }
+
+    inline bool NewSpace::inPropertyStorageNursery(void* ptr)
+    {
+        char* addr = static_cast<char*>(ptr);
+        return static_cast<size_t>(addr - m_propertyStorageNursery) < PropertyStorageNurserySize;
+    }
+    
     template <typename Functor> inline typename Functor::ReturnType NewSpace::forEachBlock(Functor& functor)
     {
         for (size_t i = 0; i < preciseCount; ++i) {

Modified: trunk/Source/_javascript_Core/jit/JITStubs.cpp (94813 => 94814)


--- trunk/Source/_javascript_Core/jit/JITStubs.cpp	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/jit/JITStubs.cpp	2011-09-08 22:52:04 UTC (rev 94814)
@@ -1481,7 +1481,7 @@
 
     ASSERT(baseValue.isObject());
     JSObject* base = asObject(baseValue);
-    base->allocatePropertyStorage(oldSize, newSize);
+    base->allocatePropertyStorage(*stackFrame.globalData, oldSize, newSize);
 
     return base;
 }

Modified: trunk/Source/_javascript_Core/runtime/JSObject.cpp (94813 => 94814)


--- trunk/Source/_javascript_Core/runtime/JSObject.cpp	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/runtime/JSObject.cpp	2011-09-08 22:52:04 UTC (rev 94814)
@@ -594,24 +594,34 @@
     return m_inheritorID.get();
 }
 
-void JSObject::allocatePropertyStorage(size_t oldSize, size_t newSize)
+void JSObject::allocatePropertyStorage(JSGlobalData& globalData, size_t oldSize, size_t newSize)
 {
     ASSERT(newSize > oldSize);
 
     // It's important that this function not rely on m_structure, since
     // we might be in the middle of a transition.
-    bool wasInline = (oldSize < JSObject::baseExternalStorageCapacity);
+    PropertyStorage newPropertyStorage = 0;
+    if (globalData.heap.inPropertyStorageNursery(m_propertyStorage.get())) {
+        newPropertyStorage = static_cast<PropertyStorage>(globalData.heap.allocatePropertyStorage(newSize * sizeof(WriteBarrierBase<Unknown>)));
+        if (!newPropertyStorage || !globalData.heap.inPropertyStorageNursery(m_propertyStorage.get())) {
+            // If allocation failed because it's too big, or it triggered a GC
+            // that promoted us to old space, we need to allocate our property
+            // storage in old space.
+            newPropertyStorage = new WriteBarrierBase<Unknown>[newSize];
+        }
+    } else
+        newPropertyStorage = new WriteBarrierBase<Unknown>[newSize];
 
-    PropertyStorage oldPropertyStorage = m_propertyStorage;
-    PropertyStorage newPropertyStorage = new WriteBarrierBase<Unknown>[newSize];
+    PropertyStorage oldPropertyStorage = m_propertyStorage.get();
+    ASSERT(newPropertyStorage);
 
     for (unsigned i = 0; i < oldSize; ++i)
        newPropertyStorage[i] = oldPropertyStorage[i];
 
-    if (!wasInline)
+    if (!isUsingInlineStorage() && !globalData.heap.inPropertyStorageNursery(m_propertyStorage.get()))
         delete [] oldPropertyStorage;
 
-    m_propertyStorage = newPropertyStorage;
+    m_propertyStorage.set(globalData, this, newPropertyStorage);
 }
 
 bool JSObject::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)

Modified: trunk/Source/_javascript_Core/runtime/JSObject.h (94813 => 94814)


--- trunk/Source/_javascript_Core/runtime/JSObject.h	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/_javascript_Core/runtime/JSObject.h	2011-09-08 22:52:04 UTC (rev 94814)
@@ -31,6 +31,7 @@
 #include "PropertySlot.h"
 #include "PutPropertySlot.h"
 #include "ScopeChain.h"
+#include "StorageBarrier.h"
 #include "Structure.h"
 #include "JSGlobalData.h"
 #include "JSString.h"
@@ -68,9 +69,6 @@
         Setter       = 1 << 6   // property is a setter
     };
 
-    typedef WriteBarrierBase<Unknown>* PropertyStorage;
-    typedef const WriteBarrierBase<Unknown>* ConstPropertyStorage;
-
     class JSObject : public JSCell {
         friend class BatchedTransitionOptimizer;
         friend class JIT;
@@ -218,8 +216,8 @@
         bool isFrozen(JSGlobalData& globalData) { return m_structure->isFrozen(globalData); }
         bool isExtensible() { return m_structure->isExtensible(); }
 
-        void allocatePropertyStorage(size_t oldSize, size_t newSize);
-        bool isUsingInlineStorage() const { return static_cast<const void*>(m_propertyStorage) == static_cast<const void*>(this + 1); }
+        void allocatePropertyStorage(JSGlobalData&, size_t oldSize, size_t newSize);
+        bool isUsingInlineStorage() const { return static_cast<const void*>(m_propertyStorage.get()) == static_cast<const void*>(this + 1); }
 
         void* addressOfPropertyAtOffset(size_t offset)
         {
@@ -291,7 +289,7 @@
         JSObject(JSGlobalData&, Structure*, PropertyStorage inlineStorage);
         JSObject(VPtrStealingHackType, PropertyStorage inlineStorage)
             : JSCell(VPtrStealingHack)
-            , m_propertyStorage(inlineStorage)
+            , m_propertyStorage(inlineStorage, StorageBarrier::Unchecked)
         {
         }
 
@@ -305,8 +303,8 @@
         void isObject();
         void isString();
         
-        ConstPropertyStorage propertyStorage() const { return m_propertyStorage; }
-        PropertyStorage propertyStorage() { return m_propertyStorage; }
+        ConstPropertyStorage propertyStorage() const { return m_propertyStorage.get(); }
+        PropertyStorage propertyStorage() { return m_propertyStorage.get(); }
 
         const WriteBarrierBase<Unknown>* locationForOffset(size_t offset) const
         {
@@ -327,7 +325,7 @@
         const HashEntry* findPropertyHashEntry(ExecState*, const Identifier& propertyName) const;
         Structure* createInheritorID(JSGlobalData&);
 
-        PropertyStorage m_propertyStorage;
+        StorageBarrier m_propertyStorage;
         WriteBarrier<Structure> m_inheritorID;
     };
 
@@ -461,14 +459,14 @@
 
 inline JSObject::JSObject(JSGlobalData& globalData, Structure* structure, PropertyStorage inlineStorage)
     : JSCell(globalData, structure)
-    , m_propertyStorage(inlineStorage)
+    , m_propertyStorage(globalData, this, inlineStorage)
 {
 }
 
 inline JSObject::~JSObject()
 {
-    if (!isUsingInlineStorage())
-        delete [] m_propertyStorage;
+    if (!isUsingInlineStorage() && !Heap::heap(this)->inPropertyStorageNursery(m_propertyStorage.get()))
+        delete [] m_propertyStorage.get();
 }
 
 inline JSValue JSObject::prototype() const
@@ -661,7 +659,7 @@
         size_t currentCapacity = m_structure->propertyStorageCapacity();
         offset = m_structure->addPropertyWithoutTransition(globalData, propertyName, attributes, specificFunction);
         if (currentCapacity != m_structure->propertyStorageCapacity())
-            allocatePropertyStorage(currentCapacity, m_structure->propertyStorageCapacity());
+            allocatePropertyStorage(globalData, currentCapacity, m_structure->propertyStorageCapacity());
 
         ASSERT(offset < m_structure->propertyStorageCapacity());
         putDirectOffset(globalData, offset, value);
@@ -675,7 +673,7 @@
     size_t currentCapacity = m_structure->propertyStorageCapacity();
     if (Structure* structure = Structure::addPropertyTransitionToExistingStructure(m_structure.get(), propertyName, attributes, specificFunction, offset)) {    
         if (currentCapacity != structure->propertyStorageCapacity())
-            allocatePropertyStorage(currentCapacity, structure->propertyStorageCapacity());
+            allocatePropertyStorage(globalData, currentCapacity, structure->propertyStorageCapacity());
 
         ASSERT(offset < structure->propertyStorageCapacity());
         setStructure(globalData, structure);
@@ -725,7 +723,7 @@
     Structure* structure = Structure::addPropertyTransition(globalData, m_structure.get(), propertyName, attributes, specificFunction, offset);
 
     if (currentCapacity != structure->propertyStorageCapacity())
-        allocatePropertyStorage(currentCapacity, structure->propertyStorageCapacity());
+        allocatePropertyStorage(globalData, currentCapacity, structure->propertyStorageCapacity());
 
     ASSERT(offset < structure->propertyStorageCapacity());
     setStructure(globalData, structure);
@@ -786,7 +784,7 @@
     size_t currentCapacity = m_structure->propertyStorageCapacity();
     size_t offset = m_structure->addPropertyWithoutTransition(globalData, propertyName, attributes, 0);
     if (currentCapacity != m_structure->propertyStorageCapacity())
-        allocatePropertyStorage(currentCapacity, m_structure->propertyStorageCapacity());
+        allocatePropertyStorage(globalData, currentCapacity, m_structure->propertyStorageCapacity());
     putDirectOffset(globalData, offset, value);
 }
 
@@ -795,14 +793,14 @@
     size_t currentCapacity = m_structure->propertyStorageCapacity();
     size_t offset = m_structure->addPropertyWithoutTransition(globalData, propertyName, attributes, value);
     if (currentCapacity != m_structure->propertyStorageCapacity())
-        allocatePropertyStorage(currentCapacity, m_structure->propertyStorageCapacity());
+        allocatePropertyStorage(globalData, currentCapacity, m_structure->propertyStorageCapacity());
     putDirectOffset(globalData, offset, value);
 }
 
 inline void JSObject::transitionTo(JSGlobalData& globalData, Structure* newStructure)
 {
     if (m_structure->propertyStorageCapacity() != newStructure->propertyStorageCapacity())
-        allocatePropertyStorage(m_structure->propertyStorageCapacity(), newStructure->propertyStorageCapacity());
+        allocatePropertyStorage(globalData, m_structure->propertyStorageCapacity(), newStructure->propertyStorageCapacity());
     setStructure(globalData, newStructure);
 }
 
@@ -893,6 +891,12 @@
     JSCell::visitChildren(visitor);
 
     PropertyStorage storage = propertyStorage();
+    if (Heap::heap(this)->inPropertyStorageNursery(storage)) {
+        m_propertyStorage.set(new WriteBarrierBase<Unknown>[structure()->propertyStorageCapacity()], StorageBarrier::Unchecked);
+        if (structure()->propertyStorageCapacity() > m_structure->propertyStorageSize())
+            ASSERT(!storage[m_structure->propertyStorageSize()]);
+        memcpy(m_propertyStorage.get(), storage, m_structure->propertyStorageSize() * sizeof(WriteBarrierBase<Unknown>));
+    }
     size_t storageSize = m_structure->propertyStorageSize();
     visitor.appendValues(storage, storageSize);
     if (m_inheritorID)

Added: trunk/Source/_javascript_Core/runtime/StorageBarrier.h (0 => 94814)


--- trunk/Source/_javascript_Core/runtime/StorageBarrier.h	                        (rev 0)
+++ trunk/Source/_javascript_Core/runtime/StorageBarrier.h	2011-09-08 22:52:04 UTC (rev 94814)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2011 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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 PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef StorageBarrier_h
+#define StorageBarrier_h
+
+#include "JSGlobalData.h"
+#include "WriteBarrier.h"
+
+namespace JSC {
+
+typedef WriteBarrierBase<Unknown>* PropertyStorage;
+typedef const WriteBarrierBase<Unknown>* ConstPropertyStorage;
+
+class StorageBarrier {
+public:
+    enum UncheckedTag { Unchecked };
+    StorageBarrier(JSGlobalData& globalData, JSCell* owner, PropertyStorage storage)
+    {
+        set(globalData, owner, storage);
+    }
+    
+    StorageBarrier(PropertyStorage storage, UncheckedTag)
+    {
+        set(storage, Unchecked);
+    }
+    
+    void set(JSGlobalData& globalData, JSCell* owner, PropertyStorage newStorage)
+    {
+        if (!globalData.heap.inPropertyStorageNursery(m_storage))
+            globalData.heap.writeBarrier(owner, JSValue());
+        m_storage = newStorage;
+    }
+    
+    void set(PropertyStorage newStorage, UncheckedTag)
+    {
+        m_storage = newStorage;
+    }
+    
+    WriteBarrierBase<Unknown>* operator->() const { return m_storage; }
+    WriteBarrierBase<Unknown>* operator->() { return m_storage; }
+    WriteBarrierBase<Unknown> operator*() const { return *m_storage; }
+    WriteBarrierBase<Unknown> operator*() { return *m_storage; }
+    const WriteBarrierBase<Unknown>& operator[](size_t i) const { return m_storage[i]; }
+    WriteBarrierBase<Unknown>& operator[](size_t i) { return m_storage[i]; }
+    
+    ConstPropertyStorage get() const { return m_storage; }
+    PropertyStorage get() { return m_storage; }
+    
+private:
+    PropertyStorage m_storage;
+};
+
+}
+
+#endif

Modified: trunk/Source/WebCore/ChangeLog (94813 => 94814)


--- trunk/Source/WebCore/ChangeLog	2011-09-08 22:45:23 UTC (rev 94813)
+++ trunk/Source/WebCore/ChangeLog	2011-09-08 22:52:04 UTC (rev 94814)
@@ -1,3 +1,14 @@
+2011-09-08  Oliver Hunt  <oli...@apple.com>
+
+        Use bump allocator for initial property storage
+        https://bugs.webkit.org/show_bug.cgi?id=67494
+
+        Reviewed by Geoffrey Garen.
+
+        Add a forwarding header.
+
+        * ForwardingHeaders/runtime/StorageBarrier.h: Added.
+
 2011-09-08  Roland Steiner  <rolandstei...@chromium.org>
 
         Unreviewed, rolling out r94809.

Added: trunk/Source/WebCore/ForwardingHeaders/runtime/StorageBarrier.h (0 => 94814)


--- trunk/Source/WebCore/ForwardingHeaders/runtime/StorageBarrier.h	                        (rev 0)
+++ trunk/Source/WebCore/ForwardingHeaders/runtime/StorageBarrier.h	2011-09-08 22:52:04 UTC (rev 94814)
@@ -0,0 +1,4 @@
+#ifndef WebCore_FWD_StorageBarrier_h
+#define WebCore_FWD_StorageBarrier_h
+#include <_javascript_Core/StorageBarrier.h>
+#endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to