Changeset 49323 in webkit for trunk/JavaScriptCore/runtime
- Timestamp:
- Oct 8, 2009, 3:02:53 PM (16 years ago)
- Location:
- trunk/JavaScriptCore/runtime
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/JSCell.h
r48068 r49323 343 343 } 344 344 345 inline void Structure::markAggregate(MarkStack& markStack)346 {347 markStack.append(m_prototype);348 }349 350 345 inline Heap* Heap::heap(JSValue v) 351 346 { -
trunk/JavaScriptCore/runtime/JSGlobalObject.cpp
r48883 r49323 90 90 { 91 91 if (s) 92 s->markAggregate(markStack);92 markIfNeeded(markStack, s->storedPrototype()); 93 93 } 94 94 … … 395 395 396 396 markIfNeeded(markStack, d()->errorStructure); 397 markIfNeeded(markStack, d()->argumentsStructure); 398 markIfNeeded(markStack, d()->arrayStructure); 399 markIfNeeded(markStack, d()->booleanObjectStructure); 400 markIfNeeded(markStack, d()->callbackConstructorStructure); 401 markIfNeeded(markStack, d()->callbackFunctionStructure); 402 markIfNeeded(markStack, d()->callbackObjectStructure); 403 markIfNeeded(markStack, d()->dateStructure); 404 markIfNeeded(markStack, d()->emptyObjectStructure); 405 markIfNeeded(markStack, d()->errorStructure); 406 markIfNeeded(markStack, d()->functionStructure); 407 markIfNeeded(markStack, d()->numberObjectStructure); 408 markIfNeeded(markStack, d()->prototypeFunctionStructure); 409 markIfNeeded(markStack, d()->regExpMatchesArrayStructure); 410 markIfNeeded(markStack, d()->regExpStructure); 411 markIfNeeded(markStack, d()->stringObjectStructure); 397 412 398 413 // No need to mark the other structures, because their prototypes are all -
trunk/JavaScriptCore/runtime/JSObject.cpp
r48774 r49323 43 43 ASSERT_CLASS_FITS_IN_CELL(JSObject); 44 44 45 static inline void getEnumerablePropertyNames(ExecState* exec, const ClassInfo* classInfo, PropertyNameArray& propertyNames) 46 { 47 // Add properties from the static hashtables of properties 48 for (; classInfo; classInfo = classInfo->parentClass) { 49 const HashTable* table = classInfo->propHashTable(exec); 50 if (!table) 51 continue; 52 table->initializeIfNeeded(exec); 53 ASSERT(table->table); 54 55 int hashSizeMask = table->compactSize - 1; 56 const HashEntry* entry = table->table; 57 for (int i = 0; i <= hashSizeMask; ++i, ++entry) { 58 if (entry->key() && !(entry->attributes() & DontEnum)) 59 propertyNames.add(entry->key()); 60 } 61 } 62 } 63 45 64 void JSObject::markChildren(MarkStack& markStack) 46 65 { … … 425 444 void JSObject::getPropertyNames(ExecState* exec, PropertyNameArray& propertyNames) 426 445 { 427 m_structure->getEnumerablePropertyNames(exec, propertyNames, this); 446 bool shouldCache = propertyNames.shouldCache() && !(propertyNames.size() || m_structure->isDictionary()); 447 448 if (shouldCache) { 449 if (PropertyNameArrayData* data = m_structure->enumerationCache()) { 450 if (data->cachedPrototypeChain() == m_structure->prototypeChain(exec)) { 451 propertyNames.setData(data); 452 return; 453 } 454 455 m_structure->clearEnumerationCache(); 456 } 457 } 458 459 getOwnPropertyNames(exec, propertyNames); 460 461 if (prototype().isObject()) { 462 propertyNames.setShouldCache(false); // No need for our prototypes to waste memory on caching, since they're not being enumerated directly. 463 JSObject* prototype = asObject(this->prototype()); 464 while(1) { 465 if (!prototype->structure()->typeInfo().hasDefaultGetPropertyNames()) { 466 prototype->getPropertyNames(exec, propertyNames); 467 break; 468 } 469 prototype->getOwnPropertyNames(exec, propertyNames); 470 JSValue nextProto = prototype->prototype(); 471 if (!nextProto.isObject()) 472 break; 473 prototype = asObject(nextProto); 474 } 475 } 476 477 if (shouldCache) { 478 StructureChain* protoChain = m_structure->prototypeChain(exec); 479 if (!protoChain->isCacheable()) 480 return; 481 RefPtr<PropertyNameArrayData> data = propertyNames.data(); 482 data->setCachedPrototypeChain(protoChain); 483 data->setCachedStructure(m_structure); 484 m_structure->setEnumerationCache(data.release()); 485 } 428 486 } 429 487 430 488 void JSObject::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames) 431 489 { 432 m_structure->getOwnEnumerablePropertyNames(exec, propertyNames, this); 490 m_structure->getEnumerablePropertyNames(propertyNames); 491 getEnumerablePropertyNames(exec, classInfo(), propertyNames); 433 492 } 434 493 -
trunk/JavaScriptCore/runtime/JSObject.h
r48836 r49323 683 683 JSCell::markChildren(markStack); 684 684 685 m _structure->markAggregate(markStack);685 markStack.append(prototype()); 686 686 687 687 PropertyStorage storage = propertyStorage(); -
trunk/JavaScriptCore/runtime/PropertyNameArray.h
r48836 r49323 24 24 #include "CallFrame.h" 25 25 #include "Identifier.h" 26 #include "Structure .h"26 #include "StructureChain.h" 27 27 #include <wtf/HashSet.h> 28 28 #include <wtf/Vector.h> 29 29 30 30 namespace JSC { 31 32 class Structure; 31 33 32 34 class PropertyNameArrayData : public RefCounted<PropertyNameArrayData> { -
trunk/JavaScriptCore/runtime/Structure.cpp
r48582 r49323 283 283 } 284 284 285 void Structure::getOwnEnumerablePropertyNames(ExecState* exec, PropertyNameArray& propertyNames, JSObject* baseObject)286 {287 getEnumerableNamesFromPropertyTable(propertyNames);288 getEnumerableNamesFromClassInfoTable(exec, baseObject->classInfo(), propertyNames);289 }290 291 void Structure::getEnumerablePropertyNames(ExecState* exec, PropertyNameArray& propertyNames, JSObject* baseObject)292 {293 bool shouldCache = propertyNames.shouldCache() && !(propertyNames.size() || isDictionary());294 295 if (shouldCache && m_cachedPropertyNameArrayData) {296 if (m_cachedPropertyNameArrayData->cachedPrototypeChain() == prototypeChain(exec)) {297 propertyNames.setData(m_cachedPropertyNameArrayData);298 return;299 }300 clearEnumerationCache();301 }302 303 baseObject->getOwnPropertyNames(exec, propertyNames);304 305 if (m_prototype.isObject()) {306 propertyNames.setShouldCache(false); // No need for our prototypes to waste memory on caching, since they're not being enumerated directly.307 JSObject* prototype = asObject(m_prototype);308 while(1) {309 if (!prototype->structure()->typeInfo().hasDefaultGetPropertyNames()) {310 prototype->getPropertyNames(exec, propertyNames);311 break;312 }313 prototype->getOwnPropertyNames(exec, propertyNames);314 JSValue nextProto = prototype->prototype();315 if (!nextProto.isObject())316 break;317 prototype = asObject(nextProto);318 }319 }320 321 if (shouldCache) {322 StructureChain* protoChain = prototypeChain(exec);323 m_cachedPropertyNameArrayData = propertyNames.data();324 if (!protoChain->isCacheable())325 return;326 m_cachedPropertyNameArrayData->setCachedPrototypeChain(protoChain);327 m_cachedPropertyNameArrayData->setCachedStructure(this);328 }329 }330 331 285 void Structure::clearEnumerationCache() 332 286 { … … 1058 1012 } 1059 1013 1060 void Structure::getEnumerable NamesFromPropertyTable(PropertyNameArray& propertyNames)1014 void Structure::getEnumerablePropertyNames(PropertyNameArray& propertyNames) 1061 1015 { 1062 1016 materializePropertyMapIfNecessary(); … … 1112 1066 for (size_t i = 0; i < sortedEnumerables.size(); ++i) 1113 1067 propertyNames.add(sortedEnumerables[i]->key); 1114 }1115 }1116 1117 void Structure::getEnumerableNamesFromClassInfoTable(ExecState* exec, const ClassInfo* classInfo, PropertyNameArray& propertyNames)1118 {1119 // Add properties from the static hashtables of properties1120 for (; classInfo; classInfo = classInfo->parentClass) {1121 const HashTable* table = classInfo->propHashTable(exec);1122 if (!table)1123 continue;1124 table->initializeIfNeeded(exec);1125 ASSERT(table->table);1126 1127 int hashSizeMask = table->compactSize - 1;1128 const HashEntry* entry = table->table;1129 for (int i = 0; i <= hashSizeMask; ++i, ++entry) {1130 if (entry->key() && !(entry->attributes() & DontEnum))1131 propertyNames.add(entry->key());1132 }1133 1068 } 1134 1069 } -
trunk/JavaScriptCore/runtime/Structure.h
r48582 r49323 31 31 #include "JSValue.h" 32 32 #include "PropertyMapHashTable.h" 33 #include "PropertyNameArray.h" 33 34 #include "StructureChain.h" 34 35 #include "StructureTransitionTable.h" … … 77 78 ~Structure(); 78 79 79 void markAggregate(MarkStack&);80 81 80 // These should be used with caution. 82 81 size_t addPropertyWithoutTransition(const Identifier& propertyName, unsigned attributes, JSCell* specificValue); … … 117 116 } 118 117 119 void getEnumerablePropertyNames(ExecState*, PropertyNameArray&, JSObject*);120 void getOwnEnumerablePropertyNames(ExecState*, PropertyNameArray&, JSObject*);121 122 118 bool hasGetterSetterProperties() const { return m_hasGetterSetterProperties; } 123 119 void setHasGetterSetterProperties(bool hasGetterSetterProperties) { m_hasGetterSetterProperties = hasGetterSetterProperties; } … … 127 123 JSCell* specificValue() { return m_specificValueInPrevious; } 128 124 void despecifyDictionaryFunction(const Identifier& propertyName); 125 126 void setEnumerationCache(PassRefPtr<PropertyNameArrayData> data) { m_cachedPropertyNameArrayData = data; } 127 PropertyNameArrayData* enumerationCache() { return m_cachedPropertyNameArrayData.get(); } 128 void clearEnumerationCache(); 129 void getEnumerablePropertyNames(PropertyNameArray&); 129 130 130 131 private: … … 141 142 size_t remove(const Identifier& propertyName); 142 143 void addAnonymousSlots(unsigned slotCount); 143 void getEnumerableNamesFromPropertyTable(PropertyNameArray&);144 void getEnumerableNamesFromClassInfoTable(ExecState*, const ClassInfo*, PropertyNameArray&);145 144 146 145 void expandPropertyMapHashTable(); … … 162 161 materializePropertyMap(); 163 162 } 164 165 void clearEnumerationCache();166 163 167 164 signed char transitionCount() const
Note:
See TracChangeset
for help on using the changeset viewer.