Changeset 49323 in webkit for trunk/JavaScriptCore/runtime/JSObject.cpp
- Timestamp:
- Oct 8, 2009, 3:02:53 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.