Changeset 144074 in webkit
- Timestamp:
- Feb 26, 2013 10:43:24 AM (11 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 1 added
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/CMakeLists.txt
r144056 r144074 281 281 runtime/PropertyNameArray.cpp 282 282 runtime/PropertySlot.cpp 283 runtime/PropertyTable.cpp 283 284 runtime/PrototypeMap.cpp 284 285 runtime/RegExp.cpp -
trunk/Source/JavaScriptCore/ChangeLog
r144056 r144074 1 2013-02-26 Andreas Kling <akling@apple.com> 2 3 Unused Structure property tables waste 14MB on Membuster. 4 <http://webkit.org/b/110854> 5 <rdar://problem/13292104> 6 7 Reviewed by Filip Pizlo. 8 9 Turn PropertyTable into a GC object and have Structure drop unpinned tables when marking. 10 14 MB progression on Membuster3. 11 12 * CMakeLists.txt: 13 * GNUmakefile.list.am: 14 * JavaScriptCore.gypi: 15 * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: 16 * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: 17 * JavaScriptCore.xcodeproj/project.pbxproj: 18 * Target.pri: 19 20 Added PropertyTable.cpp. 21 22 * runtime/PropertyTable.cpp: Added. 23 (JSC::PropertyTable::create): 24 (JSC::PropertyTable::clone): 25 (JSC::PropertyTable::PropertyTable): 26 (JSC::PropertyTable::destroy): 27 (JSC::PropertyTable::~PropertyTable): 28 (JSC::PropertyTable::visitChildren): 29 30 Moved marking of property table values here from Structure::visitChildren(). 31 32 * runtime/StructureInlines.h: 33 (JSC::Structure::putWillGrowOutOfLineStorage): 34 (JSC::Structure::checkOffsetConsistency): 35 36 Moved these to StructureInlines.h to break header dependency cycle between Structure/PropertyTable. 37 38 * runtime/Structure.cpp: 39 (JSC::Structure::visitChildren): 40 41 Null out m_propertyTable if the table is unpinned. This'll cause the table to get GC'd. 42 43 (JSC::Structure::materializePropertyMap): 44 (JSC::Structure::addPropertyTransition): 45 (JSC::Structure::changePrototypeTransition): 46 (JSC::Structure::despecifyFunctionTransition): 47 (JSC::Structure::attributeChangeTransition): 48 (JSC::Structure::toDictionaryTransition): 49 (JSC::Structure::preventExtensionsTransition): 50 (JSC::Structure::nonPropertyTransition): 51 (JSC::Structure::copyPropertyTable): 52 (JSC::Structure::copyPropertyTableForPinning): 53 (JSC::Structure::putSpecificValue): 54 (JSC::Structure::createPropertyMap): 55 * runtime/Structure.h: 56 (Structure): 57 * runtime/JSGlobalData.cpp: 58 (JSC::JSGlobalData::JSGlobalData): 59 * runtime/JSGlobalData.h: 60 (JSGlobalData): 61 * runtime/PropertyMapHashTable.h: 62 (PropertyTable): 63 (JSC::PropertyTable::createStructure): 64 (JSC::PropertyTable::copy): 65 1 66 2013-02-26 Andreas Kling <akling@apple.com> 2 67 -
trunk/Source/JavaScriptCore/GNUmakefile.list.am
r144056 r144074 723 723 Source/JavaScriptCore/runtime/PropertySlot.cpp \ 724 724 Source/JavaScriptCore/runtime/PropertySlot.h \ 725 Source/JavaScriptCore/runtime/PropertyTable.cpp \ 725 726 Source/JavaScriptCore/runtime/PrototypeMap.cpp \ 726 727 Source/JavaScriptCore/runtime/PrototypeMap.h \ -
trunk/Source/JavaScriptCore/JavaScriptCore.gypi
r144056 r144074 760 760 'runtime/PropertySlot.cpp', 761 761 'runtime/PropertySlot.h', 762 'runtime/PropertyTable.cpp', 762 763 'runtime/PropertyStorage.h', 763 764 'runtime/Protect.h', -
trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj
r144056 r144074 1175 1175 </File> 1176 1176 <File 1177 RelativePath="..\..\runtime\PropertyTable.cpp" 1178 > 1179 </File> 1180 <File 1177 1181 RelativePath="..\..\runtime\PrototypeMap.cpp" 1178 1182 > -
trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj
r144056 r144074 306 306 <ClCompile Include="..\runtime\PropertyNameArray.cpp" /> 307 307 <ClCompile Include="..\runtime\PropertySlot.cpp" /> 308 <ClCompile Include="..\runtime\PropertyTable.cpp" /> 308 309 <ClCompile Include="..\runtime\PrototypeMap.cpp" /> 309 310 <ClCompile Include="..\runtime\RegExp.cpp" /> -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r144056 r144074 706 706 A7FB61001040C38B0017A286 /* PropertyDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = A7FB604B103F5EAB0017A286 /* PropertyDescriptor.h */; settings = {ATTRIBUTES = (Private, ); }; }; 707 707 A8A4748E151A8306004123FF /* libWTF.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A8A4748D151A8306004123FF /* libWTF.a */; }; 708 ADE39FFF16DD144B0003CD4A /* PropertyTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD1CF06816DCAB2D00B97123 /* PropertyTable.cpp */; }; 708 709 BC02E90D0E1839DB000F9297 /* ErrorConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC02E9050E1839DB000F9297 /* ErrorConstructor.h */; }; 709 710 BC02E90F0E1839DB000F9297 /* ErrorPrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = BC02E9070E1839DB000F9297 /* ErrorPrototype.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 1623 1624 A8E894310CD0602400367179 /* JSCallbackObjectFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCallbackObjectFunctions.h; sourceTree = "<group>"; }; 1624 1625 A8E894330CD0603F00367179 /* JSGlobalObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSGlobalObject.h; sourceTree = "<group>"; }; 1626 AD1CF06816DCAB2D00B97123 /* PropertyTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PropertyTable.cpp; sourceTree = "<group>"; }; 1625 1627 BC021BF2136900C300FC5467 /* ToolExecutable.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ToolExecutable.xcconfig; sourceTree = "<group>"; }; 1626 1628 BC02E9040E1839DB000F9297 /* ErrorConstructor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorConstructor.cpp; sourceTree = "<group>"; }; … … 2513 2515 65621E6C089E859700760F35 /* PropertySlot.h */, 2514 2516 0FB7F39015ED8E3800F167B2 /* PropertyStorage.h */, 2517 AD1CF06816DCAB2D00B97123 /* PropertyTable.cpp */, 2515 2518 65C02FBB0637462A003E7EE6 /* Protect.h */, 2516 2519 14D844A216AA2C7000A65AF0 /* PrototypeMap.cpp */, … … 4032 4035 0FBE0F7616C1DB0F0082C5E8 /* DFGUnificationPhase.cpp in Sources */, 4033 4036 0F493AFA16D0CAD30084508B /* SourceProvider.cpp in Sources */, 4037 ADE39FFF16DD144B0003CD4A /* PropertyTable.cpp in Sources */, 4034 4038 ); 4035 4039 runOnlyForDeploymentPostprocessing = 0; -
trunk/Source/JavaScriptCore/Target.pri
r144056 r144074 299 299 runtime/PropertyNameArray.cpp \ 300 300 runtime/PropertySlot.cpp \ 301 runtime/PropertyTable.cpp \ 301 302 runtime/PrototypeMap.cpp \ 302 303 runtime/RegExpConstructor.cpp \ -
trunk/Source/JavaScriptCore/runtime/JSGlobalData.cpp
r144056 r144074 233 233 unlinkedEvalCodeBlockStructure.set(*this, UnlinkedEvalCodeBlock::createStructure(*this, 0, jsNull())); 234 234 unlinkedFunctionCodeBlockStructure.set(*this, UnlinkedFunctionCodeBlock::createStructure(*this, 0, jsNull())); 235 propertyTableStructure.set(*this, PropertyTable::createStructure(*this, 0, jsNull())); 235 236 smallStrings.initializeCommonStrings(*this); 236 237 -
trunk/Source/JavaScriptCore/runtime/JSGlobalData.h
r144056 r144074 257 257 Strong<Structure> unlinkedEvalCodeBlockStructure; 258 258 Strong<Structure> unlinkedFunctionCodeBlockStructure; 259 Strong<Structure> propertyTableStructure; 259 260 260 261 IdentifierTable* identifierTable; -
trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h
r144056 r144074 23 23 24 24 #include "PropertyOffset.h" 25 #include "Structure.h" 25 26 #include "WriteBarrier.h" 26 27 #include <wtf/HashTable.h> … … 86 87 }; 87 88 88 class PropertyTable { 89 WTF_MAKE_FAST_ALLOCATED; 89 class PropertyTable : public JSCell { 90 90 91 91 // This is the implementation for 'iterator' and 'const_iterator', … … 130 130 131 131 public: 132 static const bool needsDestruction = true; 133 static const bool hasImmortalStructure = true; 134 static void destroy(JSCell*); 135 136 static JS_EXPORTDATA const ClassInfo s_info; 137 138 static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype) 139 { 140 return Structure::create(globalData, globalObject, prototype, TypeInfo(CompoundType, OverridesVisitChildren), &s_info); 141 } 142 143 static void visitChildren(JSCell*, SlotVisitor&); 144 132 145 typedef StringImpl* KeyType; 133 146 typedef PropertyMapEntry ValueType; … … 143 156 144 157 // Constructor is passed an initial capacity, a PropertyTable to copy, or both. 145 explicit PropertyTable(unsigned initialCapacity);146 PropertyTable(JSGlobalData&, JSCell*, const PropertyTable&);147 PropertyTable(JSGlobalData&, JSCell*, unsigned initialCapacity, const PropertyTable&);158 static PropertyTable* create(JSGlobalData&, unsigned initialCapacity); 159 static PropertyTable* clone(JSGlobalData&, JSCell* owner, const PropertyTable&); 160 static PropertyTable* clone(JSGlobalData&, JSCell* owner, unsigned initialCapacity, const PropertyTable&); 148 161 ~PropertyTable(); 149 162 … … 182 195 183 196 // Copy this PropertyTable, ensuring the copy has at least the capacity provided. 184 P assOwnPtr<PropertyTable>copy(JSGlobalData&, JSCell* owner, unsigned newCapacity);197 PropertyTable* copy(JSGlobalData&, JSCell* owner, unsigned newCapacity); 185 198 186 199 #ifndef NDEBUG … … 190 203 191 204 private: 205 PropertyTable(JSGlobalData&, unsigned initialCapacity); 206 PropertyTable(JSGlobalData&, JSCell*, const PropertyTable&); 207 PropertyTable(JSGlobalData&, JSCell*, unsigned initialCapacity, const PropertyTable&); 208 192 209 PropertyTable(const PropertyTable&); 193 210 // Used to insert a value known not to be in the table, and where we know capacity to be available. … … 240 257 }; 241 258 242 inline PropertyTable::PropertyTable(unsigned initialCapacity)243 : m_indexSize(sizeForCapacity(initialCapacity))244 , m_indexMask(m_indexSize - 1)245 , m_index(static_cast<unsigned*>(fastZeroedMalloc(dataSize())))246 , m_keyCount(0)247 , m_deletedCount(0)248 {249 ASSERT(isPowerOf2(m_indexSize));250 }251 252 inline PropertyTable::PropertyTable(JSGlobalData&, JSCell* owner, const PropertyTable& other)253 : m_indexSize(other.m_indexSize)254 , m_indexMask(other.m_indexMask)255 , m_index(static_cast<unsigned*>(fastMalloc(dataSize())))256 , m_keyCount(other.m_keyCount)257 , m_deletedCount(other.m_deletedCount)258 {259 ASSERT(isPowerOf2(m_indexSize));260 261 memcpy(m_index, other.m_index, dataSize());262 263 iterator end = this->end();264 for (iterator iter = begin(); iter != end; ++iter) {265 iter->key->ref();266 Heap::writeBarrier(owner, iter->specificValue.get());267 }268 269 // Copy the m_deletedOffsets vector.270 Vector<PropertyOffset>* otherDeletedOffsets = other.m_deletedOffsets.get();271 if (otherDeletedOffsets)272 m_deletedOffsets = adoptPtr(new Vector<PropertyOffset>(*otherDeletedOffsets));273 }274 275 inline PropertyTable::PropertyTable(JSGlobalData&, JSCell* owner, unsigned initialCapacity, const PropertyTable& other)276 : m_indexSize(sizeForCapacity(initialCapacity))277 , m_indexMask(m_indexSize - 1)278 , m_index(static_cast<unsigned*>(fastZeroedMalloc(dataSize())))279 , m_keyCount(0)280 , m_deletedCount(0)281 {282 ASSERT(isPowerOf2(m_indexSize));283 ASSERT(initialCapacity >= other.m_keyCount);284 285 const_iterator end = other.end();286 for (const_iterator iter = other.begin(); iter != end; ++iter) {287 ASSERT(canInsert());288 reinsert(*iter);289 iter->key->ref();290 Heap::writeBarrier(owner, iter->specificValue.get());291 }292 293 // Copy the m_deletedOffsets vector.294 Vector<PropertyOffset>* otherDeletedOffsets = other.m_deletedOffsets.get();295 if (otherDeletedOffsets)296 m_deletedOffsets = adoptPtr(new Vector<PropertyOffset>(*otherDeletedOffsets));297 }298 299 inline PropertyTable::~PropertyTable()300 {301 iterator end = this->end();302 for (iterator iter = begin(); iter != end; ++iter)303 iter->key->deref();304 305 fastFree(m_index);306 }307 308 259 inline PropertyTable::iterator PropertyTable::begin() 309 260 { … … 503 454 } 504 455 505 inline P assOwnPtr<PropertyTable>PropertyTable::copy(JSGlobalData& globalData, JSCell* owner, unsigned newCapacity)456 inline PropertyTable* PropertyTable::copy(JSGlobalData& globalData, JSCell* owner, unsigned newCapacity) 506 457 { 507 458 ASSERT(newCapacity >= m_keyCount); … … 510 461 // save rehashing all keys. 511 462 if (sizeForCapacity(newCapacity) == m_indexSize) 512 return adoptPtr(new PropertyTable(globalData, owner, *this));513 return adoptPtr(new PropertyTable(globalData, owner, newCapacity, *this));463 return PropertyTable::clone(globalData, owner, *this); 464 return PropertyTable::clone(globalData, owner, newCapacity, *this); 514 465 } 515 466 -
trunk/Source/JavaScriptCore/runtime/Structure.cpp
r144056 r144074 248 248 ASSERT(!structure->previousID()); 249 249 250 m_propertyTable = structure->m_propertyTable->copy(globalData, 0, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity));250 m_propertyTable.set(globalData, this, structure->m_propertyTable->copy(globalData, 0, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity))); 251 251 break; 252 252 } … … 256 256 257 257 if (!m_propertyTable) 258 createPropertyMap( numberOfSlotsForLastOffset(m_offset, m_inlineCapacity));258 createPropertyMap(globalData, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity)); 259 259 260 260 for (ptrdiff_t i = structures.size() - 1; i >= 0; --i) { … … 377 377 structure->checkOffsetConsistency(); 378 378 if (structure->m_isPinnedPropertyTable) 379 transition->m_propertyTable = structure->m_propertyTable->copy(globalData, transition, structure->m_propertyTable->size() + 1); 380 else 381 transition->m_propertyTable = structure->m_propertyTable.release(); 379 transition->m_propertyTable.set(globalData, transition, structure->m_propertyTable->copy(globalData, transition, structure->m_propertyTable->size() + 1)); 380 else { 381 transition->m_propertyTable.set(globalData, transition, structure->m_propertyTable.get()); 382 structure->m_propertyTable.clear(); 383 } 382 384 } else { 383 385 if (structure->previousID()) 384 386 transition->materializePropertyMap(globalData); 385 387 else 386 transition->createPropertyMap( );388 transition->createPropertyMap(globalData); 387 389 } 388 390 transition->m_offset = structure->m_offset; … … 416 418 417 419 structure->materializePropertyMapIfNecessary(globalData); 418 transition->m_propertyTable = structure->copyPropertyTableForPinning(globalData, transition);420 transition->m_propertyTable.set(globalData, transition, structure->copyPropertyTableForPinning(globalData, transition)); 419 421 transition->m_offset = structure->m_offset; 420 422 transition->pin(); … … 432 434 433 435 structure->materializePropertyMapIfNecessary(globalData); 434 transition->m_propertyTable = structure->copyPropertyTableForPinning(globalData, transition);436 transition->m_propertyTable.set(globalData, transition, structure->copyPropertyTableForPinning(globalData, transition)); 435 437 transition->m_offset = structure->m_offset; 436 438 transition->pin(); … … 453 455 454 456 structure->materializePropertyMapIfNecessary(globalData); 455 transition->m_propertyTable = structure->copyPropertyTableForPinning(globalData, transition);457 transition->m_propertyTable.set(globalData, transition, structure->copyPropertyTableForPinning(globalData, transition)); 456 458 transition->m_offset = structure->m_offset; 457 459 transition->pin(); … … 476 478 477 479 structure->materializePropertyMapIfNecessary(globalData); 478 transition->m_propertyTable = structure->copyPropertyTableForPinning(globalData, transition);480 transition->m_propertyTable.set(globalData, transition, structure->copyPropertyTableForPinning(globalData, transition)); 479 481 transition->m_offset = structure->m_offset; 480 482 transition->m_dictionaryKind = kind; … … 536 538 537 539 structure->materializePropertyMapIfNecessary(globalData); 538 transition->m_propertyTable = structure->copyPropertyTableForPinning(globalData, transition);540 transition->m_propertyTable.set(globalData, transition, structure->copyPropertyTableForPinning(globalData, transition)); 539 541 transition->m_offset = structure->m_offset; 540 542 transition->m_preventExtensions = true; … … 576 578 structure->checkOffsetConsistency(); 577 579 if (structure->m_isPinnedPropertyTable) 578 transition->m_propertyTable = structure->m_propertyTable->copy(globalData, transition, structure->m_propertyTable->size() + 1); 579 else 580 transition->m_propertyTable = structure->m_propertyTable.release(); 580 transition->m_propertyTable.set(globalData, transition, structure->m_propertyTable->copy(globalData, transition, structure->m_propertyTable->size() + 1)); 581 else { 582 transition->m_propertyTable.set(globalData, transition, structure->m_propertyTable.get()); 583 structure->m_propertyTable.clear(); 584 } 581 585 } else { 582 586 if (structure->previousID()) 583 587 transition->materializePropertyMap(globalData); 584 588 else 585 transition->createPropertyMap( );589 transition->createPropertyMap(globalData); 586 590 } 587 591 … … 738 742 #endif 739 743 740 PassOwnPtr<PropertyTable> Structure::copyPropertyTable(JSGlobalData& globalData, Structure* owner) 741 { 742 return adoptPtr(m_propertyTable ? new PropertyTable(globalData, owner, *m_propertyTable) : 0); 743 } 744 745 PassOwnPtr<PropertyTable> Structure::copyPropertyTableForPinning(JSGlobalData& globalData, Structure* owner) 746 { 747 return adoptPtr(m_propertyTable ? new PropertyTable(globalData, owner, *m_propertyTable) : new PropertyTable(numberOfSlotsForLastOffset(m_offset, m_inlineCapacity))); 744 PropertyTable* Structure::copyPropertyTable(JSGlobalData& globalData, Structure* owner) 745 { 746 if (!m_propertyTable) 747 return 0; 748 return PropertyTable::clone(globalData, owner, *m_propertyTable.get()); 749 } 750 751 PropertyTable* Structure::copyPropertyTableForPinning(JSGlobalData& globalData, Structure* owner) 752 { 753 if (m_propertyTable) 754 return PropertyTable::clone(globalData, owner, *m_propertyTable.get()); 755 return PropertyTable::create(globalData, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity)); 748 756 } 749 757 … … 802 810 803 811 if (!m_propertyTable) 804 createPropertyMap( );812 createPropertyMap(globalData); 805 813 806 814 PropertyOffset newOffset = m_propertyTable->nextOffset(m_inlineCapacity); … … 834 842 } 835 843 836 void Structure::createPropertyMap( unsigned capacity)844 void Structure::createPropertyMap(JSGlobalData& globalData, unsigned capacity) 837 845 { 838 846 ASSERT(!m_propertyTable); 839 847 840 848 checkConsistency(); 841 m_propertyTable = adoptPtr(new PropertyTable(capacity));849 m_propertyTable.set(globalData, this, PropertyTable::create(globalData, capacity)); 842 850 } 843 851 … … 883 891 visitor.append(&thisObject->m_previousOrRareData); 884 892 visitor.append(&thisObject->m_specificValueInPrevious); 885 if (thisObject->m_propertyTable) { 886 PropertyTable::iterator end = thisObject->m_propertyTable->end(); 887 for (PropertyTable::iterator ptr = thisObject->m_propertyTable->begin(); ptr != end; ++ptr) 888 visitor.append(&ptr->specificValue); 889 } 893 894 if (thisObject->m_isPinnedPropertyTable) { 895 ASSERT(thisObject->m_propertyTable); 896 visitor.append(&thisObject->m_propertyTable); 897 } else if (thisObject->m_propertyTable) 898 thisObject->m_propertyTable.clear(); 890 899 } 891 900 -
trunk/Source/JavaScriptCore/runtime/Structure.h
r144056 r144074 32 32 #include "JSCell.h" 33 33 #include "JSType.h" 34 #include "PropertyMapHashTable.h"35 34 #include "PropertyName.h" 36 35 #include "PropertyNameArray.h" 36 #include "PropertyOffset.h" 37 37 #include "Protect.h" 38 38 #include "StructureRareData.h" … … 41 41 #include "Watchpoint.h" 42 42 #include "Weak.h" 43 #include <wtf/PassOwnPtr.h>44 43 #include <wtf/PassRefPtr.h> 45 44 #include <wtf/RefCounted.h> … … 52 51 class PropertyNameArray; 53 52 class PropertyNameArrayData; 53 class PropertyTable; 54 54 class StructureChain; 55 55 class SlotVisitor; … … 109 109 bool isExtensible() const { return !m_preventExtensions; } 110 110 bool didTransition() const { return m_didTransition; } 111 bool putWillGrowOutOfLineStorage() 112 { 113 checkOffsetConsistency(); 114 115 ASSERT(outOfLineCapacity() >= outOfLineSize()); 116 117 if (!m_propertyTable) { 118 unsigned currentSize = numberOfOutOfLineSlotsForLastOffset(m_offset); 119 ASSERT(outOfLineCapacity() >= currentSize); 120 return currentSize == outOfLineCapacity(); 121 } 122 123 ASSERT(totalStorageCapacity() >= m_propertyTable->propertyStorageSize()); 124 if (m_propertyTable->hasDeletedOffset()) 125 return false; 126 127 ASSERT(totalStorageCapacity() >= m_propertyTable->size()); 128 return m_propertyTable->size() == totalStorageCapacity(); 129 } 111 bool putWillGrowOutOfLineStorage(); 130 112 JS_EXPORT_PRIVATE size_t suggestedNewOutOfLineStorageCapacity(); 131 113 … … 383 365 PropertyOffset remove(PropertyName); 384 366 385 void createPropertyMap( unsigned keyCount = 0);367 void createPropertyMap(JSGlobalData&, unsigned keyCount = 0); 386 368 void checkConsistency(); 387 369 … … 389 371 void despecifyAllFunctions(JSGlobalData&); 390 372 391 P assOwnPtr<PropertyTable>copyPropertyTable(JSGlobalData&, Structure* owner);392 P assOwnPtr<PropertyTable>copyPropertyTableForPinning(JSGlobalData&, Structure* owner);373 PropertyTable* copyPropertyTable(JSGlobalData&, Structure* owner); 374 PropertyTable* copyPropertyTableForPinning(JSGlobalData&, Structure* owner); 393 375 JS_EXPORT_PRIVATE void materializePropertyMap(JSGlobalData&); 394 376 void materializePropertyMapIfNecessary(JSGlobalData& globalData) … … 446 428 } 447 429 448 ALWAYS_INLINE bool checkOffsetConsistency() const 449 { 450 if (!m_propertyTable) { 451 ASSERT(!m_isPinnedPropertyTable); 452 return true; 453 } 454 455 RELEASE_ASSERT(numberOfSlotsForLastOffset(m_offset, m_inlineCapacity) == m_propertyTable->propertyStorageSize()); 456 unsigned totalSize = m_propertyTable->propertyStorageSize(); 457 RELEASE_ASSERT((totalSize < inlineCapacity() ? 0 : totalSize - inlineCapacity()) == numberOfOutOfLineSlotsForLastOffset(m_offset)); 458 459 return true; 460 } 430 bool checkOffsetConsistency() const; 461 431 462 432 void allocateRareData(JSGlobalData&); … … 483 453 StructureTransitionTable m_transitionTable; 484 454 485 OwnPtr<PropertyTable> m_propertyTable;455 WriteBarrier<PropertyTable> m_propertyTable; 486 456 487 457 mutable InlineWatchpointSet m_transitionWatchpointSet; -
trunk/Source/JavaScriptCore/runtime/StructureInlines.h
r144056 r144074 27 27 #define StructureInlines_h 28 28 29 #include "PropertyMapHashTable.h" 29 30 #include "Structure.h" 30 31 … … 180 181 } 181 182 183 inline bool Structure::putWillGrowOutOfLineStorage() 184 { 185 checkOffsetConsistency(); 186 187 ASSERT(outOfLineCapacity() >= outOfLineSize()); 188 189 if (!m_propertyTable) { 190 unsigned currentSize = numberOfOutOfLineSlotsForLastOffset(m_offset); 191 ASSERT(outOfLineCapacity() >= currentSize); 192 return currentSize == outOfLineCapacity(); 193 } 194 195 ASSERT(totalStorageCapacity() >= m_propertyTable->propertyStorageSize()); 196 if (m_propertyTable->hasDeletedOffset()) 197 return false; 198 199 ASSERT(totalStorageCapacity() >= m_propertyTable->size()); 200 return m_propertyTable->size() == totalStorageCapacity(); 201 } 202 203 ALWAYS_INLINE bool Structure::checkOffsetConsistency() const 204 { 205 if (!m_propertyTable) { 206 ASSERT(!m_isPinnedPropertyTable); 207 return true; 208 } 209 210 RELEASE_ASSERT(numberOfSlotsForLastOffset(m_offset, m_inlineCapacity) == m_propertyTable->propertyStorageSize()); 211 unsigned totalSize = m_propertyTable->propertyStorageSize(); 212 RELEASE_ASSERT((totalSize < inlineCapacity() ? 0 : totalSize - inlineCapacity()) == numberOfOutOfLineSlotsForLastOffset(m_offset)); 213 214 return true; 215 } 216 182 217 } // namespace JSC 183 218
Note: See TracChangeset
for help on using the changeset viewer.