void Structure::materializePropertyMap(JSGlobalData& globalData) { ASSERT(structure()->classInfo() == &s_info); ASSERT(!m_propertyTable); Vector<Structure*, 8> structures; structures.append(this); Structure* structure = this; // Search for the last Structure with a property table. while ((structure = structure->previousID())) { if (structure->m_isPinnedPropertyTable) { ASSERT(structure->m_propertyTable); ASSERT(!structure->m_previous); m_propertyTable = structure->m_propertyTable->copy(globalData, 0, numberOfSlotsForLastOffset(m_offset, m_typeInfo.type())); break; } structures.append(structure); } if (!m_propertyTable) createPropertyMap(numberOfSlotsForLastOffset(m_offset, m_typeInfo.type())); for (ptrdiff_t i = structures.size() - 2; i >= 0; --i) { structure = structures[i]; if (!structure->m_nameInPrevious) continue; PropertyMapEntry entry(globalData, this, structure->m_nameInPrevious.get(), structure->m_offset, structure->m_attributesInPrevious, structure->m_specificValueInPrevious.get()); m_propertyTable->add(entry); } }
void Structure::materializePropertyMap(JSGlobalData& globalData) { ASSERT(structure()->classInfo() == &s_info); ASSERT(!propertyTable()); Vector<Structure*, 8> structures; structures.append(this); Structure* structure = this; // Search for the last Structure with a property table. while ((structure = structure->previousID())) { if (structure->m_isPinnedPropertyTable) { ASSERT(structure->propertyTable()); ASSERT(!structure->previousID()); propertyTable().set(globalData, this, structure->propertyTable()->copy(globalData, 0, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity))); break; } structures.append(structure); } if (!propertyTable()) createPropertyMap(globalData, numberOfSlotsForLastOffset(m_offset, m_inlineCapacity)); for (ptrdiff_t i = structures.size() - 1; i >= 0; --i) { structure = structures[i]; if (!structure->m_nameInPrevious) continue; PropertyMapEntry entry(globalData, this, structure->m_nameInPrevious.get(), structure->m_offset, structure->m_attributesInPrevious, structure->m_specificValueInPrevious.get()); propertyTable()->add(entry, m_offset, PropertyTable::PropertyOffsetMustNotChange); } checkOffsetConsistency(); }
void Structure::dumpStatistics() { #if DUMP_STRUCTURE_ID_STATISTICS unsigned numberLeaf = 0; unsigned numberUsingSingleSlot = 0; unsigned numberSingletons = 0; unsigned numberWithPropertyMaps = 0; unsigned totalPropertyMapsSize = 0; HashSet<Structure*>::const_iterator end = liveStructureSet.end(); for (HashSet<Structure*>::const_iterator it = liveStructureSet.begin(); it != end; ++it) { Structure* structure = *it; switch (structure->m_transitionTable.size()) { case 0: ++numberLeaf; if (!structure->previousID()) ++numberSingletons; break; case 1: ++numberUsingSingleSlot; break; } if (structure->propertyTable()) { ++numberWithPropertyMaps; totalPropertyMapsSize += structure->propertyTable()->sizeInMemory(); } } dataLogF("Number of live Structures: %d\n", liveStructureSet.size()); dataLogF("Number of Structures using the single item optimization for transition map: %d\n", numberUsingSingleSlot); dataLogF("Number of Structures that are leaf nodes: %d\n", numberLeaf); dataLogF("Number of Structures that singletons: %d\n", numberSingletons); dataLogF("Number of Structures with PropertyMaps: %d\n", numberWithPropertyMaps); dataLogF("Size of a single Structures: %d\n", static_cast<unsigned>(sizeof(Structure))); dataLogF("Size of sum of all property maps: %d\n", totalPropertyMapsSize); dataLogF("Size of average of all property maps: %f\n", static_cast<double>(totalPropertyMapsSize) / static_cast<double>(liveStructureSet.size())); #else dataLogF("Dumping Structure statistics is not enabled.\n"); #endif }
void Structure::materializePropertyMap() { ASSERT(!m_propertyTable); Vector<Structure*, 8> structures; structures.append(this); Structure* structure = this; // Search for the last Structure with a property table. while ((structure = structure->previousID())) { if (structure->m_isPinnedPropertyTable) { ASSERT(structure->m_propertyTable); ASSERT(!structure->m_previous); m_propertyTable = structure->copyPropertyTable(); break; } structures.append(structure); } if (!m_propertyTable) createPropertyMapHashTable(sizeForKeyCount(m_offset + 1)); else { if (sizeForKeyCount(m_offset + 1) > m_propertyTable->size) rehashPropertyMapHashTable(sizeForKeyCount(m_offset + 1)); // This could be made more efficient by combining with the copy above. } for (ptrdiff_t i = structures.size() - 2; i >= 0; --i) { structure = structures[i]; if (!structure->m_nameInPrevious) { m_propertyTable->anonymousSlotCount += structure->m_anonymousSlotsInPrevious; continue; } structure->m_nameInPrevious->ref(); PropertyMapEntry entry(structure->m_nameInPrevious.get(), structure->m_offset, structure->m_attributesInPrevious, structure->m_specificValueInPrevious, ++m_propertyTable->lastIndexUsed); insertIntoPropertyMapHashTable(entry); } }