Changeset 36779 in webkit


Ignore:
Timestamp:
Sep 22, 2008 2:20:52 PM (16 years ago)
Author:
weinig@apple.com
Message:

JavaScriptCore:

2008-09-22 Sam Weinig <sam@webkit.org>

Reviewed by Darin Adler.

Patch for https://bugs.webkit.org/show_bug.cgi?id=20982
Speed up the apply method of functions by special-casing array and 'arguments' objects

1% speedup on v8-raytrace.

Test: fast/js/function-apply.html

  • kjs/Arguments.cpp: (JSC::Arguments::fillArgList):
  • kjs/Arguments.h:
  • kjs/FunctionPrototype.cpp: (JSC::functionProtoFuncApply):
  • kjs/JSArray.cpp: (JSC::JSArray::fillArgList):
  • kjs/JSArray.h:

LayoutTests:

2008-09-22 Sam Weinig <sam@webkit.org>

Reviewed by Darin Adler.

Test for https://bugs.webkit.org/show_bug.cgi?id=20982

  • fast/js/function-apply-expected.txt: Added.
  • fast/js/function-apply.html: Added.
  • fast/js/resources/function-apply.js: Added.
Location:
trunk
Files:
3 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r36778 r36779  
     12008-09-22  Sam Weinig  <sam@webkit.org>
     2
     3        Reviewed by Darin Adler.
     4
     5        Patch for https://bugs.webkit.org/show_bug.cgi?id=20982
     6        Speed up the apply method of functions by special-casing array and 'arguments' objects
     7
     8        1% speedup on v8-raytrace.
     9
     10        Test: fast/js/function-apply.html
     11
     12        * kjs/Arguments.cpp:
     13        (JSC::Arguments::fillArgList):
     14        * kjs/Arguments.h:
     15        * kjs/FunctionPrototype.cpp:
     16        (JSC::functionProtoFuncApply):
     17        * kjs/JSArray.cpp:
     18        (JSC::JSArray::fillArgList):
     19        * kjs/JSArray.h:
     20
    1212008-09-22  Darin Adler  <darin@apple.com>
    222
  • trunk/JavaScriptCore/kjs/ArgList.h

    r36263 r36779  
    6565#endif
    6666        {
     67        }
     68
     69        void initialize(Register* buffer, size_t size)
     70        {
     71            ASSERT(!m_markSet);
     72            ASSERT(isEmpty());
     73
     74            m_buffer = buffer;
     75            m_size = size;
     76#ifndef NDEBUG
     77            m_isReadOnly = true;
     78#endif
    6779        }
    6880
  • trunk/JavaScriptCore/kjs/Arguments.cpp

    r36753 r36779  
    9292}
    9393
     94void Arguments::fillArgList(ExecState* exec, ArgList& args)
     95{
     96    if (!d->deletedArguments) {
     97        if (d->numParameters == d->numArguments) {
     98            args.initialize(&d->activation->registerAt(d->firstArgumentIndex), d->numArguments);
     99            return;
     100        }
     101
     102        unsigned parametersLength = min(d->numParameters, d->numArguments);
     103        unsigned i = 0;
     104        for (; i < parametersLength; ++i)
     105            args.append(d->activation->uncheckedSymbolTableGetValue(d->firstArgumentIndex + i));
     106        for (; i < d->numArguments; ++i)
     107            args.append(d->extraArguments[i - d->numParameters]);
     108        return;
     109    }
     110
     111    unsigned parametersLength = min(d->numParameters, d->numArguments);
     112    unsigned i = 0;
     113    for (; i < parametersLength; ++i) {
     114        if (!d->deletedArguments[i])
     115            args.append(d->activation->uncheckedSymbolTableGetValue(d->firstArgumentIndex + i));
     116        else
     117            args.append(get(exec, i));
     118    }
     119    for (; i < d->numArguments; ++i) {
     120        if (!d->deletedArguments[i])
     121            args.append(d->extraArguments[i - d->numParameters]);
     122        else
     123            args.append(get(exec, i));
     124    }
     125}
     126
    94127bool Arguments::getOwnPropertySlot(ExecState* exec, unsigned i, PropertySlot& slot)
    95128{
  • trunk/JavaScriptCore/kjs/Arguments.h

    r36743 r36779  
    4444        virtual void mark();
    4545
     46        void fillArgList(ExecState*, ArgList&);
     47
    4648    private:
    4749        virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
  • trunk/JavaScriptCore/kjs/FunctionPrototype.cpp

    r36726 r36779  
    9696    ArgList applyArgs;
    9797    if (!argArray->isUndefinedOrNull()) {
    98         if (argArray->isObject() &&
    99             (static_cast<JSObject*>(argArray)->inherits(&JSArray::info) ||
    100              static_cast<JSObject*>(argArray)->inherits(&Arguments::info))) {
    101 
    102             JSObject* argArrayObj = static_cast<JSObject*>(argArray);
    103             unsigned int length = argArrayObj->get(exec, exec->propertyNames().length)->toUInt32(exec);
    104             for (unsigned int i = 0; i < length; i++)
    105                 applyArgs.append(argArrayObj->get(exec, i));
     98        if (argArray->isObject()) {
     99            if (static_cast<JSObject*>(argArray)->classInfo() == &Arguments::info)
     100                static_cast<Arguments*>(argArray)->fillArgList(exec, applyArgs);
     101            else if (exec->machine()->isJSArray(argArray))
     102                static_cast<JSArray*>(argArray)->fillArgList(exec, applyArgs);
     103            else if (static_cast<JSObject*>(argArray)->inherits(&JSArray::info))
     104                static_cast<JSArray*>(argArray)->fillArgList(exec, applyArgs);
     105            else
     106                return throwError(exec, TypeError);
    106107        } else
    107108            return throwError(exec, TypeError);
  • trunk/JavaScriptCore/kjs/JSArray.cpp

    r36778 r36779  
    858858}
    859859
     860void JSArray::fillArgList(ExecState* exec, ArgList& args)
     861{
     862    unsigned fastAccessLength = min(m_storage->m_length, m_fastAccessCutoff);
     863    unsigned i = 0;
     864    for (; i < fastAccessLength; ++i)
     865        args.append(getIndex(i));
     866    for (; i < m_storage->m_length; ++i)
     867        args.append(get(exec, i));
     868}
     869
    860870unsigned JSArray::compactForSorting()
    861871{
  • trunk/JavaScriptCore/kjs/JSArray.h

    r36778 r36779  
    7575        }
    7676
     77        void fillArgList(ExecState*, ArgList&);
     78
    7779    protected:
    7880        virtual void put(ExecState*, const Identifier& propertyName, JSValue*, PutPropertySlot&);
  • trunk/LayoutTests/ChangeLog

    r36774 r36779  
     12008-09-22  Sam Weinig  <sam@webkit.org>
     2
     3        Reviewed by Darin Adler.
     4
     5        Test for https://bugs.webkit.org/show_bug.cgi?id=20982
     6
     7        * fast/js/function-apply-expected.txt: Added.
     8        * fast/js/function-apply.html: Added.
     9        * fast/js/resources/function-apply.js: Added.
     10
    1112008-09-22  Simon Fraser  <simon.fraser@apple.com>
    212
Note: See TracChangeset for help on using the changeset viewer.