Ignore:
Timestamp:
Sep 22, 2008, 9:55:51 PM (17 years ago)
Author:
Darin Adler
Message:

2008-09-22 Darin Adler <Darin Adler>

Reviewed by Cameron Zwarich.

Speeds up v8-raytrace by 5%.

  • kjs/Arguments.cpp: (JSC::ArgumentsData::ArgumentsData): Use a fixed buffer if there are 4 or fewer extra arguments. (JSC::Arguments::Arguments): Use a fixed buffer if there are 4 or fewer extra arguments. (JSC::Arguments::~Arguments): Delete the buffer if necessary. (JSC::Arguments::mark): Update since extraArguments are now Register. (JSC::Arguments::fillArgList): Added special case for the only case that's actually used in the practice, when there are no parameters. There are some other special cases in there too, but that's the only one that matters. (JSC::Arguments::getOwnPropertySlot): Updated to use setValueSlot since there's no operation to get you at the JSValue* inside a Register as a "slot".
File:
1 edited

Legend:

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

    r36782 r36792  
    3838const ClassInfo Arguments::info = { "Arguments", 0, 0, 0 };
    3939
    40 struct ArgumentsData {
     40struct ArgumentsData : Noncopyable {
    4141    ArgumentsData(JSActivation* activation, unsigned numParameters, unsigned firstArgumentIndex, unsigned numArguments)
    4242        : activation(activation)
     
    4444        , firstArgumentIndex(firstArgumentIndex)
    4545        , numArguments(numArguments)
     46        , extraArguments(0)
    4647    {
    4748    }
     
    5152    unsigned firstArgumentIndex;
    5253    unsigned numArguments;
    53     OwnArrayPtr<JSValue*> extraArguments;
     54    Register* extraArguments;
    5455    OwnArrayPtr<bool> deletedArguments;
     56    Register extraArgumentsFixedBuffer[4];
    5557};
    5658
     
    6769    if (d->numArguments > d->numParameters) {
    6870        unsigned numExtraArguments = d->numArguments - d->numParameters;
    69         JSValue** extraArguments = new JSValue*[numExtraArguments];
     71        Register* extraArguments;
     72        if (numExtraArguments > sizeof(d->extraArgumentsFixedBuffer) / sizeof(Register))
     73            extraArguments = new Register[numExtraArguments];
     74        else
     75            extraArguments = d->extraArgumentsFixedBuffer;
    7076        for (unsigned i = 0; i < numExtraArguments; ++i)
    71             extraArguments[i] = argv[d->numParameters + i].getJSValue();
    72         d->extraArguments.set(extraArguments);
     77            extraArguments[i] = argv[d->numParameters + i];
     78        d->extraArguments = extraArguments;
    7379    }
    7480}
     
    7682Arguments::~Arguments()
    7783{
     84    if (d->extraArguments != d->extraArgumentsFixedBuffer)
     85        delete [] d->extraArguments;
    7886}
    7987
     
    8593        unsigned numExtraArguments = d->numArguments - d->numParameters;
    8694        for (unsigned i = 0; i < numExtraArguments; ++i) {
    87             if (!d->extraArguments[i]->marked())
    88                 d->extraArguments[i]->mark();
     95            if (!d->extraArguments[i].marked())
     96                d->extraArguments[i].mark();
    8997        }
    9098    }
     
    96104void Arguments::fillArgList(ExecState* exec, ArgList& args)
    97105{
    98     if (!d->deletedArguments) {
     106    if (LIKELY(!d->deletedArguments)) {
     107        if (LIKELY(!d->numParameters)) {
     108            args.initialize(d->extraArguments, d->numArguments);
     109            return;
     110        }
     111
    99112        if (d->numParameters == d->numArguments) {
    100113            args.initialize(&d->activation->registerAt(d->firstArgumentIndex), d->numArguments);
     
    107120            args.append(d->activation->uncheckedSymbolTableGetValue(d->firstArgumentIndex + i));
    108121        for (; i < d->numArguments; ++i)
    109             args.append(d->extraArguments[i - d->numParameters]);
     122            args.append(get(exec, i));
    110123        return;
    111124    }
     
    121134    for (; i < d->numArguments; ++i) {
    122135        if (!d->deletedArguments[i])
    123             args.append(d->extraArguments[i - d->numParameters]);
     136            args.append(d->extraArguments[i - d->numParameters].getJSValue());
    124137        else
    125138            args.append(get(exec, i));
     
    133146            d->activation->uncheckedSymbolTableGet(d->firstArgumentIndex + i, slot);
    134147        else
    135             slot.setValueSlot(&d->extraArguments[i - d->numParameters]);
     148            slot.setValue(d->extraArguments[i - d->numParameters].getJSValue());
    136149        return true;
    137150    }
     
    148161            d->activation->uncheckedSymbolTableGet(d->firstArgumentIndex + i, slot);
    149162        else
    150             slot.setValueSlot(&d->extraArguments[i - d->numParameters]);
     163            slot.setValue(d->extraArguments[i - d->numParameters].getJSValue());
    151164        return true;
    152165    }
Note: See TracChangeset for help on using the changeset viewer.