Ignore:
Timestamp:
Sep 19, 2008, 7:23:42 PM (17 years ago)
Author:
[email protected]
Message:

2008-09-19 Sam Weinig <[email protected]>

Reviewed by Darin Adler.

Patch for https://bugs.webkit.org/show_bug.cgi?id=20928
Speed up JS property enumeration by caching entire PropertyNameArray

1.3% speedup on Sunspider, 30% on string-fasta.

  • JavaScriptCore.exp:
  • VM/JSPropertyNameIterator.cpp: (JSC::JSPropertyNameIterator::~JSPropertyNameIterator): (JSC::JSPropertyNameIterator::invalidate):
  • VM/JSPropertyNameIterator.h: (JSC::JSPropertyNameIterator::JSPropertyNameIterator): (JSC::JSPropertyNameIterator::create):
  • kjs/JSObject.cpp: (JSC::JSObject::getPropertyNames):
  • kjs/PropertyMap.cpp: (JSC::PropertyMap::getEnumerablePropertyNames):
  • kjs/PropertyMap.h:
  • kjs/PropertyNameArray.cpp: (JSC::PropertyNameArray::add):
  • kjs/PropertyNameArray.h: (JSC::PropertyNameArrayData::create): (JSC::PropertyNameArrayData::propertyNameVector): (JSC::PropertyNameArrayData::setCachedPrototypeChain): (JSC::PropertyNameArrayData::cachedPrototypeChain): (JSC::PropertyNameArrayData::begin): (JSC::PropertyNameArrayData::end): (JSC::PropertyNameArrayData::PropertyNameArrayData): (JSC::PropertyNameArray::PropertyNameArray): (JSC::PropertyNameArray::addKnownUnique): (JSC::PropertyNameArray::size): (JSC::PropertyNameArray::operator[]): (JSC::PropertyNameArray::begin): (JSC::PropertyNameArray::end): (JSC::PropertyNameArray::setData): (JSC::PropertyNameArray::data): (JSC::PropertyNameArray::releaseData):
  • kjs/ScopeChain.cpp: (JSC::ScopeChainNode::print):
  • kjs/StructureID.cpp: (JSC::structureIDChainsAreEqual): (JSC::StructureID::getEnumerablePropertyNames): (JSC::StructureID::clearEnumerationCache): (JSC::StructureID::createCachedPrototypeChain):
  • kjs/StructureID.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/VM/JSPropertyNameIterator.h

    r36316 r36694  
    5858
    5959    private:
    60         JSPropertyNameIterator(JSObject*, Identifier* propertyNames, size_t numProperties);
     60        JSPropertyNameIterator();
     61        JSPropertyNameIterator(JSObject*, PassRefPtr<PropertyNameArrayData> propertyNameArrayData);
    6162
    6263        JSObject* m_object;
    63         Identifier* m_propertyNames;
    64         Identifier* m_position;
    65         Identifier* m_end;
     64        RefPtr<PropertyNameArrayData> m_data;
     65        PropertyNameArrayData::const_iterator m_position;
     66        PropertyNameArrayData::const_iterator m_end;
    6667    };
    6768
    68 inline JSPropertyNameIterator::JSPropertyNameIterator(JSObject* object, Identifier* propertyNames, size_t numProperties)
     69inline JSPropertyNameIterator::JSPropertyNameIterator()
     70    : JSCell(0)
     71    , m_object(0)
     72    , m_position(0)
     73    , m_end(0)
     74{
     75}
     76
     77inline JSPropertyNameIterator::JSPropertyNameIterator(JSObject* object, PassRefPtr<PropertyNameArrayData> propertyNameArrayData)
    6978    : JSCell(0)
    7079    , m_object(object)
    71     , m_propertyNames(propertyNames)
    72     , m_position(propertyNames)
    73     , m_end(propertyNames + numProperties)
     80    , m_data(propertyNameArrayData)
     81    , m_position(m_data->begin())
     82    , m_end(m_data->end())
    7483{
    7584}
     
    7887{
    7988    if (v->isUndefinedOrNull())
    80         return new (exec) JSPropertyNameIterator(0, 0, 0);
     89        return new (exec) JSPropertyNameIterator;
    8190
    8291    JSObject* o = v->toObject(exec);
    8392    PropertyNameArray propertyNames(exec);
    8493    o->getPropertyNames(exec, propertyNames);
    85     size_t numProperties = propertyNames.size();
    86     return new (exec) JSPropertyNameIterator(o, propertyNames.releaseIdentifiers(), numProperties);
     94    return new (exec) JSPropertyNameIterator(o, propertyNames.releaseData());
    8795}
    8896
Note: See TracChangeset for help on using the changeset viewer.