Changeset 34851 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp


Ignore:
Timestamp:
Jun 28, 2008, 8:50:49 AM (17 years ago)
Author:
Darin Adler
Message:

2008-06-28 Darin Adler <Darin Adler>

Reviewed by Oliver.

SunSpider says 0.8% faster.

  • VM/CodeBlock.cpp: (KJS::CodeBlock::dump): Added argv and argc parameters to new_array.
  • VM/Machine.cpp: (KJS::Machine::privateExecute): Ditto.
  • VM/CodeGenerator.cpp: (KJS::CodeGenerator::emitNewArray): Added.
  • VM/CodeGenerator.h: Added ElementNode* argument to emitNewArray.
  • kjs/nodes.cpp: (KJS::ArrayNode::emitCode): Pass the ElementNode to emitNewArray so it can be initialized with as many elements as possible. If the array doesn't have any holes in it, that's all that's needed. If there are holes, then emit some separate put operations for the other values in the array and for the length as needed.
  • kjs/nodes.h: Added some accessors to ElementNode so the code generator can iterate through elements and generate code to evaluate them. Now ArrayNode does not need to be a friend. Also took out some unused PlacementNewAdoptType constructors.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r34843 r34851  
    4848namespace KJS {
    4949
    50 static inline UString::Rep* rep(const Identifier& ident)
    51 {
    52     return ident.ustring().rep();
    53 }
    54 
    5550// ------------------------------ Node -----------------------------------------
    5651
    5752#ifndef NDEBUG
     53
    5854#ifndef LOG_CHANNEL_PREFIX
    5955#define LOG_CHANNEL_PREFIX Log
    6056#endif
     57
    6158static WTFLogChannel LogKJSNodeLeaks = { 0x00000000, "", WTFLogChannelOn };
    6259
     
    10097    --count;
    10198}
     99
    102100#endif
    103101
     
    215213}
    216214
    217 static inline int currentSourceId(ExecState* exec) KJS_FAST_CALL;
    218 static inline int currentSourceId(ExecState*)
    219 {
    220     ASSERT_NOT_REACHED();
    221     return 0;
    222 }
    223 
    224 static inline const UString currentSourceURL(ExecState* exec) KJS_FAST_CALL;
    225 static inline const UString currentSourceURL(ExecState*)
    226 {
    227     ASSERT_NOT_REACHED();
    228     return UString();
    229 }
    230 
    231215RegisterID* Node::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg)
    232216{
     
    346330// ------------------------------ ArrayNode ------------------------------------
    347331
    348 
    349332RegisterID* ArrayNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    350333{
    351     RefPtr<RegisterID> newArray = generator.emitNewArray(generator.tempDestination(dst));
     334    // FIXME: Should we put all of this code into emitNewArray?
     335
    352336    unsigned length = 0;
    353 
    354     RegisterID* value;
    355     for (ElementNode* n = m_element.get(); n; n = n->m_next.get()) {
    356         value = generator.emitNode(n->m_node.get());
    357         length += n->m_elision;
    358         generator.emitPutByIndex(newArray.get(), length++, value);
    359     }
    360 
    361     value = generator.emitLoad(generator.newTemporary(), jsNumber(generator.globalExec(), m_elision + length));
    362     generator.emitPutById(newArray.get(), generator.propertyNames().length, value);
    363 
    364     return generator.moveToDestinationIfNeeded(dst, newArray.get());
     337    ElementNode* firstPutElement;
     338    for (firstPutElement = m_element.get(); firstPutElement; firstPutElement = firstPutElement->next()) {
     339        if (firstPutElement->elision())
     340            break;
     341        ++length;
     342    }
     343
     344    if (!firstPutElement && !m_elision)
     345        return generator.emitNewArray(generator.finalDestination(dst), m_element.get());
     346
     347    RefPtr<RegisterID> array = generator.emitNewArray(generator.tempDestination(dst), m_element.get());
     348
     349    for (ElementNode* n = firstPutElement; n; n = n->next()) {
     350        RegisterID* value = generator.emitNode(n->value());
     351        length += n->elision();
     352        generator.emitPutByIndex(array.get(), length++, value);
     353    }
     354
     355    if (m_elision) {
     356        RegisterID* value = generator.emitLoad(generator.newTemporary(), jsNumber(generator.globalExec(), m_elision + length));
     357        generator.emitPutById(array.get(), generator.propertyNames().length, value);
     358    }
     359
     360    return generator.moveToDestinationIfNeeded(dst, array.get());
    365361}
    366362
     
    371367    if (m_list)
    372368        return generator.emitNode(dst, m_list.get());
    373     else
    374         return generator.emitNewObject(generator.finalDestination(dst));
     369    return generator.emitNewObject(generator.finalDestination(dst));
    375370}
    376371
Note: See TracChangeset for help on using the changeset viewer.