Changeset 144767 in webkit
- Timestamp:
- Mar 5, 2013 9:26:48 AM (11 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 1 deleted
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/CMakeLists.txt
r144708 r144767 281 281 runtime/PropertyNameArray.cpp 282 282 runtime/PropertySlot.cpp 283 runtime/PropertyTable.cpp284 283 runtime/PrototypeMap.cpp 285 284 runtime/RegExp.cpp -
trunk/Source/JavaScriptCore/ChangeLog
r144764 r144767 1 2013-03-05 Sheriff Bot <webkit.review.bot@gmail.com> 2 3 Unreviewed, rolling out r144708. 4 http://trac.webkit.org/changeset/144708 5 https://bugs.webkit.org/show_bug.cgi?id=111447 6 7 random assertion crashes in inspector tests on qt+mac bots 8 (Requested by kling on #webkit). 9 10 * CMakeLists.txt: 11 * GNUmakefile.list.am: 12 * JavaScriptCore.gypi: 13 * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: 14 * JavaScriptCore.xcodeproj/project.pbxproj: 15 * Target.pri: 16 * runtime/JSGlobalData.cpp: 17 (JSC::JSGlobalData::JSGlobalData): 18 * runtime/JSGlobalData.h: 19 (JSGlobalData): 20 * runtime/PropertyMapHashTable.h: 21 (PropertyTable): 22 (JSC::PropertyTable::PropertyTable): 23 (JSC): 24 (JSC::PropertyTable::~PropertyTable): 25 (JSC::PropertyTable::copy): 26 * runtime/PropertyTable.cpp: Removed. 27 * runtime/Structure.cpp: 28 (JSC::Structure::dumpStatistics): 29 (JSC::Structure::materializePropertyMap): 30 (JSC::Structure::despecifyDictionaryFunction): 31 (JSC::Structure::addPropertyTransition): 32 (JSC::Structure::changePrototypeTransition): 33 (JSC::Structure::despecifyFunctionTransition): 34 (JSC::Structure::attributeChangeTransition): 35 (JSC::Structure::toDictionaryTransition): 36 (JSC::Structure::sealTransition): 37 (JSC::Structure::freezeTransition): 38 (JSC::Structure::preventExtensionsTransition): 39 (JSC::Structure::nonPropertyTransition): 40 (JSC::Structure::isSealed): 41 (JSC::Structure::isFrozen): 42 (JSC::Structure::flattenDictionaryStructure): 43 (JSC::Structure::pin): 44 (JSC::Structure::copyPropertyTable): 45 (JSC::Structure::copyPropertyTableForPinning): 46 (JSC::Structure::get): 47 (JSC::Structure::despecifyFunction): 48 (JSC::Structure::despecifyAllFunctions): 49 (JSC::Structure::putSpecificValue): 50 (JSC::Structure::remove): 51 (JSC::Structure::createPropertyMap): 52 (JSC::Structure::getPropertyNamesFromStructure): 53 (JSC::Structure::visitChildren): 54 (JSC::Structure::checkConsistency): 55 * runtime/Structure.h: 56 (JSC): 57 (JSC::Structure::putWillGrowOutOfLineStorage): 58 (JSC::Structure::materializePropertyMapIfNecessary): 59 (JSC::Structure::materializePropertyMapIfNecessaryForPinning): 60 (JSC::Structure::checkOffsetConsistency): 61 (Structure): 62 * runtime/StructureInlines.h: 63 (JSC::Structure::get): 64 * runtime/WriteBarrier.h: 65 (JSC::WriteBarrierBase::get): 66 1 67 2013-03-05 David Kilzer <ddkilzer@apple.com> 2 68 -
trunk/Source/JavaScriptCore/GNUmakefile.list.am
r144708 r144767 723 723 Source/JavaScriptCore/runtime/PropertySlot.cpp \ 724 724 Source/JavaScriptCore/runtime/PropertySlot.h \ 725 Source/JavaScriptCore/runtime/PropertyTable.cpp \726 725 Source/JavaScriptCore/runtime/PrototypeMap.cpp \ 727 726 Source/JavaScriptCore/runtime/PrototypeMap.h \ -
trunk/Source/JavaScriptCore/JavaScriptCore.gypi
r144708 r144767 759 759 'runtime/PropertySlot.cpp', 760 760 'runtime/PropertySlot.h', 761 'runtime/PropertyTable.cpp',762 761 'runtime/PropertyStorage.h', 763 762 'runtime/Protect.h', -
trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj
r144708 r144767 306 306 <ClCompile Include="..\runtime\PropertyNameArray.cpp" /> 307 307 <ClCompile Include="..\runtime\PropertySlot.cpp" /> 308 <ClCompile Include="..\runtime\PropertyTable.cpp" />309 308 <ClCompile Include="..\runtime\PrototypeMap.cpp" /> 310 309 <ClCompile Include="..\runtime\RegExp.cpp" /> -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r144708 r144767 704 704 A7FB61001040C38B0017A286 /* PropertyDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = A7FB604B103F5EAB0017A286 /* PropertyDescriptor.h */; settings = {ATTRIBUTES = (Private, ); }; }; 705 705 A8A4748E151A8306004123FF /* libWTF.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A8A4748D151A8306004123FF /* libWTF.a */; }; 706 ADE39FFF16DD144B0003CD4A /* PropertyTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD1CF06816DCAB2D00B97123 /* PropertyTable.cpp */; };707 706 BC02E90D0E1839DB000F9297 /* ErrorConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC02E9050E1839DB000F9297 /* ErrorConstructor.h */; }; 708 707 BC02E90F0E1839DB000F9297 /* ErrorPrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = BC02E9070E1839DB000F9297 /* ErrorPrototype.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 1620 1619 A8E894310CD0602400367179 /* JSCallbackObjectFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCallbackObjectFunctions.h; sourceTree = "<group>"; }; 1621 1620 A8E894330CD0603F00367179 /* JSGlobalObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSGlobalObject.h; sourceTree = "<group>"; }; 1622 AD1CF06816DCAB2D00B97123 /* PropertyTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PropertyTable.cpp; sourceTree = "<group>"; };1623 1621 BC021BF2136900C300FC5467 /* ToolExecutable.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ToolExecutable.xcconfig; sourceTree = "<group>"; }; 1624 1622 BC02E9040E1839DB000F9297 /* ErrorConstructor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorConstructor.cpp; sourceTree = "<group>"; }; … … 2509 2507 65621E6C089E859700760F35 /* PropertySlot.h */, 2510 2508 0FB7F39015ED8E3800F167B2 /* PropertyStorage.h */, 2511 AD1CF06816DCAB2D00B97123 /* PropertyTable.cpp */,2512 2509 65C02FBB0637462A003E7EE6 /* Protect.h */, 2513 2510 14D844A216AA2C7000A65AF0 /* PrototypeMap.cpp */, … … 4027 4024 0FBE0F7616C1DB0F0082C5E8 /* DFGUnificationPhase.cpp in Sources */, 4028 4025 0F493AFA16D0CAD30084508B /* SourceProvider.cpp in Sources */, 4029 ADE39FFF16DD144B0003CD4A /* PropertyTable.cpp in Sources */,4030 4026 ); 4031 4027 runOnlyForDeploymentPostprocessing = 0; -
trunk/Source/JavaScriptCore/Target.pri
r144708 r144767 299 299 runtime/PropertyNameArray.cpp \ 300 300 runtime/PropertySlot.cpp \ 301 runtime/PropertyTable.cpp \302 301 runtime/PrototypeMap.cpp \ 303 302 runtime/RegExpConstructor.cpp \ -
trunk/Source/JavaScriptCore/runtime/JSGlobalData.cpp
r144708 r144767 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()));236 235 smallStrings.initializeCommonStrings(*this); 237 236 -
trunk/Source/JavaScriptCore/runtime/JSGlobalData.h
r144708 r144767 257 257 Strong<Structure> unlinkedEvalCodeBlockStructure; 258 258 Strong<Structure> unlinkedFunctionCodeBlockStructure; 259 Strong<Structure> propertyTableStructure;260 259 261 260 IdentifierTable* identifierTable; -
trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h
r144708 r144767 23 23 24 24 #include "PropertyOffset.h" 25 #include "Structure.h"26 25 #include "WriteBarrier.h" 27 26 #include <wtf/HashTable.h> … … 87 86 }; 88 87 89 class PropertyTable : public JSCell { 88 class PropertyTable { 89 WTF_MAKE_FAST_ALLOCATED; 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 145 132 typedef StringImpl* KeyType; 146 133 typedef PropertyMapEntry ValueType; … … 156 143 157 144 // Constructor is passed an initial capacity, a PropertyTable to copy, or both. 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&);145 explicit PropertyTable(unsigned initialCapacity); 146 PropertyTable(JSGlobalData&, JSCell*, const PropertyTable&); 147 PropertyTable(JSGlobalData&, JSCell*, unsigned initialCapacity, const PropertyTable&); 161 148 ~PropertyTable(); 162 149 … … 195 182 196 183 // Copy this PropertyTable, ensuring the copy has at least the capacity provided. 197 P ropertyTable*copy(JSGlobalData&, JSCell* owner, unsigned newCapacity);184 PassOwnPtr<PropertyTable> copy(JSGlobalData&, JSCell* owner, unsigned newCapacity); 198 185 199 186 #ifndef NDEBUG … … 203 190 204 191 private: 205 PropertyTable(JSGlobalData&, unsigned initialCapacity);206 PropertyTable(JSGlobalData&, JSCell*, const PropertyTable&);207 PropertyTable(JSGlobalData&, JSCell*, unsigned initialCapacity, const PropertyTable&);208 209 192 PropertyTable(const PropertyTable&); 210 193 // Used to insert a value known not to be in the table, and where we know capacity to be available. … … 257 240 }; 258 241 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 259 308 inline PropertyTable::iterator PropertyTable::begin() 260 309 { … … 454 503 } 455 504 456 inline P ropertyTable*PropertyTable::copy(JSGlobalData& globalData, JSCell* owner, unsigned newCapacity)505 inline PassOwnPtr<PropertyTable> PropertyTable::copy(JSGlobalData& globalData, JSCell* owner, unsigned newCapacity) 457 506 { 458 507 ASSERT(newCapacity >= m_keyCount); … … 461 510 // save rehashing all keys. 462 511 if (sizeForCapacity(newCapacity) == m_indexSize) 463 return PropertyTable::clone(globalData, owner, *this);464 return PropertyTable::clone(globalData, owner, newCapacity, *this);512 return adoptPtr(new PropertyTable(globalData, owner, *this)); 513 return adoptPtr(new PropertyTable(globalData, owner, newCapacity, *this)); 465 514 } 466 515 -
trunk/Source/JavaScriptCore/runtime/Structure.cpp
r144708 r144767 132 132 } 133 133 134 if (structure-> propertyTable()) {134 if (structure->m_propertyTable) { 135 135 ++numberWithPropertyMaps; 136 totalPropertyMapsSize += structure-> propertyTable()->sizeInMemory();136 totalPropertyMapsSize += structure->m_propertyTable->sizeInMemory(); 137 137 } 138 138 } … … 235 235 { 236 236 ASSERT(structure()->classInfo() == &s_info); 237 ASSERT(! propertyTable());237 ASSERT(!m_propertyTable); 238 238 239 239 Vector<Structure*, 8> structures; … … 245 245 while ((structure = structure->previousID())) { 246 246 if (structure->m_isPinnedPropertyTable) { 247 ASSERT(structure-> propertyTable());247 ASSERT(structure->m_propertyTable); 248 248 ASSERT(!structure->previousID()); 249 249 250 propertyTable().set(globalData, this, structure->propertyTable()->copy(globalData, 0, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity)));250 m_propertyTable = structure->m_propertyTable->copy(globalData, 0, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity)); 251 251 break; 252 252 } … … 255 255 } 256 256 257 if (! propertyTable())258 createPropertyMap( globalData,numberOfSlotsForLastOffset(m_offset, m_inlineCapacity));257 if (!m_propertyTable) 258 createPropertyMap(numberOfSlotsForLastOffset(m_offset, m_inlineCapacity)); 259 259 260 260 for (ptrdiff_t i = structures.size() - 1; i >= 0; --i) { … … 263 263 continue; 264 264 PropertyMapEntry entry(globalData, this, structure->m_nameInPrevious.get(), structure->m_offset, structure->m_attributesInPrevious, structure->m_specificValueInPrevious.get()); 265 propertyTable()->add(entry, m_offset, PropertyTable::PropertyOffsetMustNotChange);265 m_propertyTable->add(entry, m_offset, PropertyTable::PropertyOffsetMustNotChange); 266 266 } 267 267 … … 288 288 289 289 ASSERT(isDictionary()); 290 ASSERT( propertyTable());291 292 PropertyMapEntry* entry = propertyTable()->find(rep).first;290 ASSERT(m_propertyTable); 291 292 PropertyMapEntry* entry = m_propertyTable->find(rep).first; 293 293 ASSERT(entry); 294 294 entry->specificValue.clear(); … … 374 374 transition->m_specificValueInPrevious.setMayBeNull(globalData, transition, specificValue); 375 375 376 if (structure-> propertyTable()) {376 if (structure->m_propertyTable) { 377 377 structure->checkOffsetConsistency(); 378 378 if (structure->m_isPinnedPropertyTable) 379 transition->propertyTable().set(globalData, transition, structure->propertyTable()->copy(globalData, transition, structure->propertyTable()->size() + 1)); 380 else { 381 transition->propertyTable().set(globalData, transition, structure->propertyTable().get()); 382 structure->propertyTable().clear(); 383 } 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(); 384 382 } else { 385 383 if (structure->previousID()) 386 384 transition->materializePropertyMap(globalData); 387 385 else 388 transition->createPropertyMap( globalData);386 transition->createPropertyMap(); 389 387 } 390 388 transition->m_offset = structure->m_offset; … … 418 416 419 417 structure->materializePropertyMapIfNecessary(globalData); 420 transition-> propertyTable().set(globalData, transition, structure->copyPropertyTableForPinning(globalData, transition));418 transition->m_propertyTable = structure->copyPropertyTableForPinning(globalData, transition); 421 419 transition->m_offset = structure->m_offset; 422 420 transition->pin(); … … 434 432 435 433 structure->materializePropertyMapIfNecessary(globalData); 436 transition-> propertyTable().set(globalData, transition, structure->copyPropertyTableForPinning(globalData, transition));434 transition->m_propertyTable = structure->copyPropertyTableForPinning(globalData, transition); 437 435 transition->m_offset = structure->m_offset; 438 436 transition->pin(); … … 455 453 456 454 structure->materializePropertyMapIfNecessary(globalData); 457 transition-> propertyTable().set(globalData, transition, structure->copyPropertyTableForPinning(globalData, transition));455 transition->m_propertyTable = structure->copyPropertyTableForPinning(globalData, transition); 458 456 transition->m_offset = structure->m_offset; 459 457 transition->pin(); … … 462 460 } 463 461 464 ASSERT(structure-> propertyTable());465 PropertyMapEntry* entry = structure-> propertyTable()->find(propertyName.uid()).first;462 ASSERT(structure->m_propertyTable); 463 PropertyMapEntry* entry = structure->m_propertyTable->find(propertyName.uid()).first; 466 464 ASSERT(entry); 467 465 entry->attributes = attributes; … … 478 476 479 477 structure->materializePropertyMapIfNecessary(globalData); 480 transition-> propertyTable().set(globalData, transition, structure->copyPropertyTableForPinning(globalData, transition));478 transition->m_propertyTable = structure->copyPropertyTableForPinning(globalData, transition); 481 479 transition->m_offset = structure->m_offset; 482 480 transition->m_dictionaryKind = kind; … … 502 500 Structure* transition = preventExtensionsTransition(globalData, structure); 503 501 504 if (transition-> propertyTable()) {505 PropertyTable::iterator end = transition-> propertyTable()->end();506 for (PropertyTable::iterator iter = transition-> propertyTable()->begin(); iter != end; ++iter)502 if (transition->m_propertyTable) { 503 PropertyTable::iterator end = transition->m_propertyTable->end(); 504 for (PropertyTable::iterator iter = transition->m_propertyTable->begin(); iter != end; ++iter) 507 505 iter->attributes |= DontDelete; 508 506 } … … 517 515 Structure* transition = preventExtensionsTransition(globalData, structure); 518 516 519 if (transition-> propertyTable()) {520 PropertyTable::iterator iter = transition-> propertyTable()->begin();521 PropertyTable::iterator end = transition-> propertyTable()->end();517 if (transition->m_propertyTable) { 518 PropertyTable::iterator iter = transition->m_propertyTable->begin(); 519 PropertyTable::iterator end = transition->m_propertyTable->end(); 522 520 if (iter != end) 523 521 transition->m_hasReadOnlyOrGetterSetterPropertiesExcludingProto = true; … … 538 536 539 537 structure->materializePropertyMapIfNecessary(globalData); 540 transition-> propertyTable().set(globalData, transition, structure->copyPropertyTableForPinning(globalData, transition));538 transition->m_propertyTable = structure->copyPropertyTableForPinning(globalData, transition); 541 539 transition->m_offset = structure->m_offset; 542 540 transition->m_preventExtensions = true; … … 575 573 checkOffset(transition->m_offset, transition->inlineCapacity()); 576 574 577 if (structure-> propertyTable()) {575 if (structure->m_propertyTable) { 578 576 structure->checkOffsetConsistency(); 579 577 if (structure->m_isPinnedPropertyTable) 580 transition->propertyTable().set(globalData, transition, structure->propertyTable()->copy(globalData, transition, structure->propertyTable()->size() + 1)); 581 else { 582 transition->propertyTable().set(globalData, transition, structure->propertyTable().get()); 583 structure->propertyTable().clear(); 584 } 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(); 585 581 } else { 586 582 if (structure->previousID()) 587 583 transition->materializePropertyMap(globalData); 588 584 else 589 transition->createPropertyMap( globalData);585 transition->createPropertyMap(); 590 586 } 591 587 … … 602 598 603 599 materializePropertyMapIfNecessary(globalData); 604 if (! propertyTable())600 if (!m_propertyTable) 605 601 return true; 606 602 607 PropertyTable::iterator end = propertyTable()->end();608 for (PropertyTable::iterator iter = propertyTable()->begin(); iter != end; ++iter) {603 PropertyTable::iterator end = m_propertyTable->end(); 604 for (PropertyTable::iterator iter = m_propertyTable->begin(); iter != end; ++iter) { 609 605 if ((iter->attributes & DontDelete) != DontDelete) 610 606 return false; … … 620 616 621 617 materializePropertyMapIfNecessary(globalData); 622 if (! propertyTable())618 if (!m_propertyTable) 623 619 return true; 624 620 625 PropertyTable::iterator end = propertyTable()->end();626 for (PropertyTable::iterator iter = propertyTable()->begin(); iter != end; ++iter) {621 PropertyTable::iterator end = m_propertyTable->end(); 622 for (PropertyTable::iterator iter = m_propertyTable->begin(); iter != end; ++iter) { 627 623 if (!(iter->attributes & DontDelete)) 628 624 return false; … … 638 634 ASSERT(isDictionary()); 639 635 if (isUncacheableDictionary()) { 640 ASSERT( propertyTable());641 642 size_t propertyCount = propertyTable()->size();636 ASSERT(m_propertyTable); 637 638 size_t propertyCount = m_propertyTable->size(); 643 639 644 640 // Holds our values compacted by insertion order. … … 647 643 // Copies out our values from their hashed locations, compacting property table offsets as we go. 648 644 unsigned i = 0; 649 PropertyTable::iterator end = propertyTable()->end();645 PropertyTable::iterator end = m_propertyTable->end(); 650 646 m_offset = invalidOffset; 651 for (PropertyTable::iterator iter = propertyTable()->begin(); iter != end; ++iter, ++i) {647 for (PropertyTable::iterator iter = m_propertyTable->begin(); iter != end; ++iter, ++i) { 652 648 values[i] = object->getDirect(iter->offset); 653 649 m_offset = iter->offset = offsetForPropertyNumber(i, m_inlineCapacity); … … 658 654 object->putDirect(globalData, offsetForPropertyNumber(i, m_inlineCapacity), values[i]); 659 655 660 propertyTable()->clearDeletedOffsets();656 m_propertyTable->clearDeletedOffsets(); 661 657 checkOffsetConsistency(); 662 658 } … … 693 689 void Structure::pin() 694 690 { 695 ASSERT( propertyTable());691 ASSERT(m_propertyTable); 696 692 m_isPinnedPropertyTable = true; 697 693 clearPreviousID(); … … 742 738 #endif 743 739 744 PropertyTable* Structure::copyPropertyTable(JSGlobalData& globalData, Structure* owner) 745 { 746 if (!propertyTable()) 747 return 0; 748 return PropertyTable::clone(globalData, owner, *propertyTable().get()); 749 } 750 751 PropertyTable* Structure::copyPropertyTableForPinning(JSGlobalData& globalData, Structure* owner) 752 { 753 if (propertyTable()) 754 return PropertyTable::clone(globalData, owner, *propertyTable().get()); 755 return PropertyTable::create(globalData, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity)); 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))); 756 748 } 757 749 … … 761 753 762 754 materializePropertyMapIfNecessary(globalData); 763 if (! propertyTable())755 if (!m_propertyTable) 764 756 return invalidOffset; 765 757 766 PropertyMapEntry* entry = propertyTable()->find(propertyName.uid()).first;758 PropertyMapEntry* entry = m_propertyTable->find(propertyName.uid()).first; 767 759 if (!entry) 768 760 return invalidOffset; … … 776 768 { 777 769 materializePropertyMapIfNecessary(globalData); 778 if (! propertyTable())770 if (!m_propertyTable) 779 771 return false; 780 772 781 PropertyMapEntry* entry = propertyTable()->find(propertyName.uid()).first;773 PropertyMapEntry* entry = m_propertyTable->find(propertyName.uid()).first; 782 774 if (!entry) 783 775 return false; … … 791 783 { 792 784 materializePropertyMapIfNecessary(globalData); 793 if (! propertyTable())785 if (!m_propertyTable) 794 786 return; 795 787 796 PropertyTable::iterator end = propertyTable()->end();797 for (PropertyTable::iterator iter = propertyTable()->begin(); iter != end; ++iter)788 PropertyTable::iterator end = m_propertyTable->end(); 789 for (PropertyTable::iterator iter = m_propertyTable->begin(); iter != end; ++iter) 798 790 iter->specificValue.clear(); 799 791 } … … 809 801 StringImpl* rep = propertyName.uid(); 810 802 811 if (! propertyTable())812 createPropertyMap( globalData);813 814 PropertyOffset newOffset = propertyTable()->nextOffset(m_inlineCapacity);815 816 propertyTable()->add(PropertyMapEntry(globalData, this, rep, newOffset, attributes, specificValue), m_offset, PropertyTable::PropertyOffsetMayChange);803 if (!m_propertyTable) 804 createPropertyMap(); 805 806 PropertyOffset newOffset = m_propertyTable->nextOffset(m_inlineCapacity); 807 808 m_propertyTable->add(PropertyMapEntry(globalData, this, rep, newOffset, attributes, specificValue), m_offset, PropertyTable::PropertyOffsetMayChange); 817 809 818 810 checkConsistency(); … … 826 818 StringImpl* rep = propertyName.uid(); 827 819 828 if (! propertyTable())820 if (!m_propertyTable) 829 821 return invalidOffset; 830 822 831 PropertyTable::find_iterator position = propertyTable()->find(rep);823 PropertyTable::find_iterator position = m_propertyTable->find(rep); 832 824 if (!position.first) 833 825 return invalidOffset; … … 835 827 PropertyOffset offset = position.first->offset; 836 828 837 propertyTable()->remove(position);838 propertyTable()->addDeletedOffset(offset);829 m_propertyTable->remove(position); 830 m_propertyTable->addDeletedOffset(offset); 839 831 840 832 checkConsistency(); … … 842 834 } 843 835 844 void Structure::createPropertyMap( JSGlobalData& globalData,unsigned capacity)845 { 846 ASSERT(! propertyTable());836 void Structure::createPropertyMap(unsigned capacity) 837 { 838 ASSERT(!m_propertyTable); 847 839 848 840 checkConsistency(); 849 propertyTable().set(globalData, this, PropertyTable::create(globalData,capacity));841 m_propertyTable = adoptPtr(new PropertyTable(capacity)); 850 842 } 851 843 … … 853 845 { 854 846 materializePropertyMapIfNecessary(globalData); 855 if (! propertyTable())847 if (!m_propertyTable) 856 848 return; 857 849 858 850 bool knownUnique = !propertyNames.size(); 859 851 860 PropertyTable::iterator end = propertyTable()->end();861 for (PropertyTable::iterator iter = propertyTable()->begin(); iter != end; ++iter) {852 PropertyTable::iterator end = m_propertyTable->end(); 853 for (PropertyTable::iterator iter = m_propertyTable->begin(); iter != end; ++iter) { 862 854 ASSERT(m_hasNonEnumerableProperties || !(iter->attributes & DontEnum)); 863 855 if (iter->key->isIdentifier() && (!(iter->attributes & DontEnum) || mode == IncludeDontEnumProperties)) { … … 891 883 visitor.append(&thisObject->m_previousOrRareData); 892 884 visitor.append(&thisObject->m_specificValueInPrevious); 893 894 if (thisObject->m_isPinnedPropertyTable) { 895 ASSERT(thisObject->m_propertyTableUnsafe); 896 visitor.append(&thisObject->m_propertyTableUnsafe); 897 } else if (thisObject->m_propertyTableUnsafe) 898 thisObject->m_propertyTableUnsafe.clear(); 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 } 899 890 } 900 891 … … 987 978 void Structure::checkConsistency() 988 979 { 989 if (! propertyTable())980 if (!m_propertyTable) 990 981 return; 991 982 992 983 if (!m_hasNonEnumerableProperties) { 993 PropertyTable::iterator end = propertyTable()->end();994 for (PropertyTable::iterator iter = propertyTable()->begin(); iter != end; ++iter) {984 PropertyTable::iterator end = m_propertyTable->end(); 985 for (PropertyTable::iterator iter = m_propertyTable->begin(); iter != end; ++iter) { 995 986 ASSERT(!(iter->attributes & DontEnum)); 996 987 } 997 988 } 998 989 999 propertyTable()->checkConsistency();990 m_propertyTable->checkConsistency(); 1000 991 } 1001 992 -
trunk/Source/JavaScriptCore/runtime/Structure.h
r144708 r144767 32 32 #include "JSCell.h" 33 33 #include "JSType.h" 34 #include "PropertyMapHashTable.h" 34 35 #include "PropertyName.h" 35 36 #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> 43 44 #include <wtf/PassRefPtr.h> 44 45 #include <wtf/RefCounted.h> … … 51 52 class PropertyNameArray; 52 53 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(); 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 } 112 130 JS_EXPORT_PRIVATE size_t suggestedNewOutOfLineStorageCapacity(); 113 131 … … 365 383 PropertyOffset remove(PropertyName); 366 384 367 void createPropertyMap( JSGlobalData&,unsigned keyCount = 0);385 void createPropertyMap(unsigned keyCount = 0); 368 386 void checkConsistency(); 369 387 … … 371 389 void despecifyAllFunctions(JSGlobalData&); 372 390 373 WriteBarrier<PropertyTable>& propertyTable(); 374 375 PropertyTable* copyPropertyTable(JSGlobalData&, Structure* owner); 376 PropertyTable* copyPropertyTableForPinning(JSGlobalData&, Structure* owner); 391 PassOwnPtr<PropertyTable> copyPropertyTable(JSGlobalData&, Structure* owner); 392 PassOwnPtr<PropertyTable> copyPropertyTableForPinning(JSGlobalData&, Structure* owner); 377 393 JS_EXPORT_PRIVATE void materializePropertyMap(JSGlobalData&); 378 394 void materializePropertyMapIfNecessary(JSGlobalData& globalData) … … 380 396 ASSERT(structure()->classInfo() == &s_info); 381 397 ASSERT(checkOffsetConsistency()); 382 if (! propertyTable()&& previousID())398 if (!m_propertyTable && previousID()) 383 399 materializePropertyMap(globalData); 384 400 } … … 387 403 ASSERT(structure()->classInfo() == &s_info); 388 404 checkOffsetConsistency(); 389 if (! propertyTable())405 if (!m_propertyTable) 390 406 materializePropertyMap(globalData); 391 407 } … … 430 446 } 431 447 432 bool checkOffsetConsistency() const; 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 } 433 461 434 462 void allocateRareData(JSGlobalData&); … … 455 483 StructureTransitionTable m_transitionTable; 456 484 457 // Should be accessed through propertyTable(). During GC, it may be set to 0 by another thread. 458 WriteBarrier<PropertyTable> m_propertyTableUnsafe; 485 OwnPtr<PropertyTable> m_propertyTable; 459 486 460 487 mutable InlineWatchpointSet m_transitionWatchpointSet; -
trunk/Source/JavaScriptCore/runtime/StructureInlines.h
r144708 r144767 27 27 #define StructureInlines_h 28 28 29 #include "PropertyMapHashTable.h"30 29 #include "Structure.h" 31 30 … … 63 62 ASSERT(structure()->classInfo() == &s_info); 64 63 materializePropertyMapIfNecessary(globalData); 65 if (! propertyTable())64 if (!m_propertyTable) 66 65 return invalidOffset; 67 66 68 PropertyMapEntry* entry = propertyTable()->find(propertyName.uid()).first;67 PropertyMapEntry* entry = m_propertyTable->find(propertyName.uid()).first; 69 68 return entry ? entry->offset : invalidOffset; 70 69 } … … 74 73 ASSERT(structure()->classInfo() == &s_info); 75 74 materializePropertyMapIfNecessary(globalData); 76 if (! propertyTable())75 if (!m_propertyTable) 77 76 return invalidOffset; 78 77 79 PropertyMapEntry* entry = propertyTable()->findWithString(name.impl()).first;78 PropertyMapEntry* entry = m_propertyTable->findWithString(name.impl()).first; 80 79 return entry ? entry->offset : invalidOffset; 81 80 } … … 181 180 } 182 181 183 inline bool Structure::putWillGrowOutOfLineStorage()184 {185 checkOffsetConsistency();186 187 ASSERT(outOfLineCapacity() >= outOfLineSize());188 189 if (!propertyTable()) {190 unsigned currentSize = numberOfOutOfLineSlotsForLastOffset(m_offset);191 ASSERT(outOfLineCapacity() >= currentSize);192 return currentSize == outOfLineCapacity();193 }194 195 ASSERT(totalStorageCapacity() >= propertyTable()->propertyStorageSize());196 if (propertyTable()->hasDeletedOffset())197 return false;198 199 ASSERT(totalStorageCapacity() >= propertyTable()->size());200 return propertyTable()->size() == totalStorageCapacity();201 }202 203 ALWAYS_INLINE WriteBarrier<PropertyTable>& Structure::propertyTable()204 {205 ASSERT(!globalObject() || !globalObject()->globalData().heap.isBusy());206 return m_propertyTableUnsafe;207 }208 209 ALWAYS_INLINE bool Structure::checkOffsetConsistency() const210 {211 PropertyTable* propertyTable = m_propertyTableUnsafe.get();212 213 if (!propertyTable) {214 ASSERT(!m_isPinnedPropertyTable);215 return true;216 }217 218 RELEASE_ASSERT(numberOfSlotsForLastOffset(m_offset, m_inlineCapacity) == propertyTable->propertyStorageSize());219 unsigned totalSize = propertyTable->propertyStorageSize();220 RELEASE_ASSERT((totalSize < inlineCapacity() ? 0 : totalSize - inlineCapacity()) == numberOfOutOfLineSlotsForLastOffset(m_offset));221 222 return true;223 }224 225 182 } // namespace JSC 226 183 -
trunk/Source/JavaScriptCore/runtime/WriteBarrier.h
r144708 r144767 100 100 T* get() const 101 101 { 102 // Copy m_cell to a local to avoid multiple-read issues. (See <http://webkit.org/b/110854>) 103 JSCell* cell = m_cell; 104 if (cell) 105 validateCell(cell); 106 return reinterpret_cast<T*>(static_cast<void*>(cell)); 102 if (m_cell) 103 validateCell(m_cell); 104 return reinterpret_cast<T*>(static_cast<void*>(m_cell)); 107 105 } 108 106
Note: See TracChangeset
for help on using the changeset viewer.