Ignore:
Timestamp:
Oct 28, 2009, 6:25:02 PM (16 years ago)
Author:
[email protected]
Message:

Improve for..in enumeration performance
https://bugs.webkit.org/show_bug.cgi?id=30887

Reviewed by Geoff Garen.

Improve indexing of an object with a for..in iterator by
identifying cases where get_by_val is being used with a iterator
as the subscript and replace it with a new get_by_pname
bytecode. get_by_pname then optimizes lookups that directly access
the base object.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/parser/Nodes.cpp

    r49734 r50254  
    14781478    RefPtr<RegisterID> i = generator.newTemporary();
    14791479    RefPtr<RegisterID> size = generator.newTemporary();
     1480    RefPtr<RegisterID> expectedSubscript;
    14801481    RefPtr<RegisterID> iter = generator.emitGetPropertyNames(generator.newTemporary(), base.get(), i.get(), size.get(), scope->breakTarget());
    14811482    generator.emitJump(scope->continueTarget());
     
    14851486
    14861487    RegisterID* propertyName;
     1488    bool optimizedForinAccess = false;
    14871489    if (m_lexpr->isResolveNode()) {
    14881490        const Identifier& ident = static_cast<ResolveNode*>(m_lexpr)->identifier();
     
    14951497            generator.emitExpressionInfo(divot(), startOffset(), endOffset());
    14961498            generator.emitPutById(base, ident, propertyName);
     1499        } else {
     1500            expectedSubscript = generator.emitMove(generator.newTemporary(), propertyName);
     1501            generator.pushOptimisedForIn(expectedSubscript.get(), iter.get(), i.get(), propertyName);
     1502            optimizedForinAccess = true;
    14971503        }
    14981504    } else if (m_lexpr->isDotAccessorNode()) {
     
    15181524
    15191525    generator.emitNode(dst, m_statement);
     1526
     1527    if (optimizedForinAccess)
     1528        generator.popOptimisedForIn();
    15201529
    15211530    generator.emitLabel(scope->continueTarget());
Note: See TracChangeset for help on using the changeset viewer.