Ignore:
Timestamp:
Dec 29, 2008, 4:28:40 PM (16 years ago)
Author:
[email protected]
Message:

2008-12-29 Sam Weinig <[email protected]>

Reviewed by Oliver Hunt.

Patch for https://bugs.webkit.org/show_bug.cgi?id=23026
Move the deleted offsets vector into the PropertyMap

Saves 3 words per Structure.

  • runtime/PropertyMapHashTable.h:
  • runtime/Structure.cpp: (JSC::Structure::addPropertyTransition): (JSC::Structure::changePrototypeTransition): (JSC::Structure::getterSetterTransition): (JSC::Structure::toDictionaryTransition): (JSC::Structure::fromDictionaryTransition): (JSC::Structure::copyPropertyTable): (JSC::Structure::put): (JSC::Structure::remove): (JSC::Structure::rehashPropertyMapHashTable):
  • runtime/Structure.h: (JSC::Structure::propertyStorageSize):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/runtime/Structure.cpp

    r39341 r39502  
    3939#endif
    4040
    41 #define DUMP_STRUCTURE_ID_STATISTICS 0
     41#define DUMP_STRUCTURE_ID_STATISTICS 1
    4242
    4343#ifndef NDEBUG
     
    102102            ++numberWithPropertyMaps;
    103103            totalPropertyMapsSize += PropertyMapHashTable::allocationSize(structure->m_propertyTable->size);
     104            if (structure->m_propertyTable->deletedOffsets)
     105                totalPropertyMapsSize += (structure->m_propertyTable->deletedOffsets->capacity() * sizeof(unsigned));
    104106        }
    105107    }
     
    379381    ASSERT(!structure->m_isDictionary);
    380382    ASSERT(structure->typeInfo().type() == ObjectType);
    381     ASSERT(structure->m_deletedOffsets.isEmpty());
    382383    ASSERT(!Structure::addPropertyTransitionToExistingStructure(structure, propertyName, attributes, offset));
    383384
     
    451452
    452453    transition->m_transitionCount = structure->m_transitionCount + 1;
    453     transition->m_deletedOffsets = structure->m_deletedOffsets;
    454454    transition->m_propertyStorageCapacity = structure->m_propertyStorageCapacity;
    455455    transition->m_hasGetterSetterProperties = structure->m_hasGetterSetterProperties;
     
    468468    RefPtr<Structure> transition = create(structure->storedPrototype(), structure->typeInfo());
    469469    transition->m_transitionCount = structure->m_transitionCount + 1;
    470     transition->m_deletedOffsets = structure->m_deletedOffsets;
    471470    transition->m_propertyStorageCapacity = structure->m_propertyStorageCapacity;
    472471    transition->m_hasGetterSetterProperties = transition->m_hasGetterSetterProperties;
     
    487486    RefPtr<Structure> transition = create(structure->m_prototype, structure->typeInfo());
    488487    transition->m_isDictionary = true;
    489     transition->m_deletedOffsets = structure->m_deletedOffsets;
    490488    transition->m_propertyStorageCapacity = structure->m_propertyStorageCapacity;
    491489    transition->m_hasGetterSetterProperties = structure->m_hasGetterSetterProperties;
     
    508506    // FIMXE: We can make this more efficient by canonicalizing the Structure (draining the
    509507    // deleted offsets vector) before transitioning from dictionary.
    510     if (structure->m_deletedOffsets.isEmpty())
     508    if (!structure->m_propertyTable || !structure->m_propertyTable->deletedOffsets || structure->m_propertyTable->deletedOffsets->isEmpty())
    511509        structure->m_isDictionary = false;
    512510
     
    604602    }
    605603
     604    // Copy the deletedOffsets vector.
     605    if (m_propertyTable->deletedOffsets)
     606        newTable->deletedOffsets = new Vector<unsigned>(*m_propertyTable->deletedOffsets);
     607
    606608    return newTable;
    607609}
     
    729731
    730732    unsigned newOffset;
    731     if (!m_deletedOffsets.isEmpty()) {
    732         newOffset = m_deletedOffsets.last();
    733         m_deletedOffsets.removeLast();
     733    if (m_propertyTable->deletedOffsets && !m_propertyTable->deletedOffsets->isEmpty()) {
     734        newOffset = m_propertyTable->deletedOffsets->last();
     735        m_propertyTable->deletedOffsets->removeLast();
    734736    } else
    735737        newOffset = m_propertyTable->keyCount;
     
    799801    m_propertyTable->entries()[entryIndex - 1].attributes = 0;
    800802    m_propertyTable->entries()[entryIndex - 1].offset = 0;
    801     m_deletedOffsets.append(offset);
     803
     804    if (!m_propertyTable->deletedOffsets)
     805        m_propertyTable->deletedOffsets = new Vector<unsigned>;
     806    m_propertyTable->deletedOffsets->append(offset);
    802807
    803808    ASSERT(m_propertyTable->keyCount >= 1);
     
    904909    }
    905910    m_propertyTable->lastIndexUsed = lastIndexUsed;
     911    m_propertyTable->deletedOffsets = oldTable->deletedOffsets;
    906912
    907913    fastFree(oldTable);
Note: See TracChangeset for help on using the changeset viewer.