Ignore:
Timestamp:
Sep 10, 2009, 1:01:57 PM (16 years ago)
Author:
[email protected]
Message:

Refactor StructureTransitionTable and Structure to unify handling of the single slot optimization
https://bugs.webkit.org/show_bug.cgi?id=29141

Reviewed by Geoff Garen

Make StructureTransitionTable encapsulate the single transition slot optimization.

File:
1 edited

Legend:

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

    r48207 r48264  
    5353    public:
    5454        friend class JIT;
     55        friend class StructureTransitionTable;
    5556        static PassRefPtr<Structure> create(JSValue prototype, const TypeInfo& typeInfo)
    5657        {
     
    175176        JSCell* m_specificValueInPrevious;
    176177
    177         union {
    178             Structure* singleTransition;
    179             StructureTransitionTable* table;
    180         } m_transitions;
     178        StructureTransitionTable table;
    181179
    182180        RefPtr<PropertyNameArrayData> m_cachedPropertyNameArrayData;
     
    190188        bool m_isPinnedPropertyTable : 1;
    191189        bool m_hasGetterSetterProperties : 1;
    192         bool m_usingSingleTransitionSlot : 1;
    193190        unsigned m_attributesInPrevious : 7;
    194191    };
     
    241238    bool StructureTransitionTable::contains(const StructureTransitionTableHash::Key& key, JSCell* specificValue)
    242239    {
    243         TransitionTable::iterator find = m_table.find(key);
    244         if (find == m_table.end())
     240        if (usingSingleTransitionSlot()) {
     241            Structure* existingTransition = singleTransition();
     242            return existingTransition && existingTransition->m_nameInPrevious.get() == key.first
     243                   && existingTransition->m_attributesInPrevious == key.second
     244                   && (existingTransition->m_specificValueInPrevious == specificValue || existingTransition->m_specificValueInPrevious == 0);
     245        }
     246        TransitionTable::iterator find = table()->find(key);
     247        if (find == table()->end())
    245248            return false;
    246249
     
    250253    Structure* StructureTransitionTable::get(const StructureTransitionTableHash::Key& key, JSCell* specificValue) const
    251254    {
    252         Transition transition = m_table.get(key);
     255        if (usingSingleTransitionSlot()) {
     256            Structure* existingTransition = singleTransition();
     257            if (existingTransition && existingTransition->m_nameInPrevious.get() == key.first
     258                && existingTransition->m_attributesInPrevious == key.second
     259                && (existingTransition->m_specificValueInPrevious == specificValue || existingTransition->m_specificValueInPrevious == 0))
     260                return existingTransition;
     261            return 0;
     262        }
     263
     264        Transition transition = table()->get(key);
    253265        if (transition.second && transition.second->transitionedFor(specificValue))
    254266            return transition.second;
    255267        return transition.first;
    256268    }
     269
     270    bool StructureTransitionTable::hasTransition(const StructureTransitionTableHash::Key& key) const
     271    {
     272        if (usingSingleTransitionSlot()) {
     273            Structure* transition = singleTransition();
     274            return transition && transition->m_nameInPrevious == key.first
     275            && transition->m_attributesInPrevious == key.second;
     276        }
     277        return table()->contains(key);
     278    }
     279   
     280    void StructureTransitionTable::reifySingleTransition()
     281    {
     282        ASSERT(usingSingleTransitionSlot());
     283        Structure* existingTransition = singleTransition();
     284        ASSERT(existingTransition);
     285        TransitionTable* transitionTable = new TransitionTable;
     286        setTransitionTable(transitionTable);
     287        add(make_pair(existingTransition->m_nameInPrevious.get(), existingTransition->m_attributesInPrevious), existingTransition, existingTransition->m_specificValueInPrevious);
     288    }
    257289} // namespace JSC
    258290
Note: See TracChangeset for help on using the changeset viewer.