Ignore:
Timestamp:
Nov 18, 2002, 1:55:23 PM (23 years ago)
Author:
darin
Message:
  • fix worst speed problems on the sort page of the iBench JavaScript test

Sped up JavaScript iBench by 70%, the sort page by 88%.

  • kjs/array_object.h: Add array-specific sort functions.
  • kjs/array_object.cpp: (compareByStringForQSort): Added. (ArrayInstanceImp::sort): Added. (compareWithCompareFunctionForQSort): Added. (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being sorted is actually an array.
  • kjs/object.h: Add argumentsPropertyName.
  • kjs/object.cpp: Add argumentsPropertyName.
  • kjs/function.cpp: (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString. (FunctionImp::call): Ditto. (ActivationImp::ActivationImp): Ditto.
  • kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto.
  • kjs/ustring.h: Added compare function for -1/0/+1 comparison.
  • kjs/ustring.cpp: (KJS::compare): Added.
File:
1 edited

Legend:

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

    r2475 r2736  
    191191      imp->mark();
    192192  }
     193}
     194
     195static ExecState *execForCompareByStringForQSort;
     196
     197static int compareByStringForQSort(const void *a, const void *b)
     198{
     199    ExecState *exec = execForCompareByStringForQSort;
     200    return compare(Value(*(ValueImp **)a).toString(exec), Value(*(ValueImp **)b).toString(exec));
     201}
     202
     203void ArrayInstanceImp::sort(ExecState *exec)
     204{
     205    execForCompareByStringForQSort = exec;
     206    qsort(storage, length, sizeof(ValueImp *), compareByStringForQSort);
     207    execForCompareByStringForQSort = 0;
     208}
     209
     210struct CompareWithCompareFunctionArguments {
     211    CompareWithCompareFunctionArguments(ExecState *e, ObjectImp *cf)
     212        : exec(e)
     213        , compareFunction(cf)
     214        , globalObject(e->interpreter()->globalObject())
     215    { }
     216
     217    ExecState *exec;
     218    ObjectImp *compareFunction;
     219    List arguments;
     220    Object globalObject;
     221};
     222
     223static CompareWithCompareFunctionArguments *compareWithCompareFunctionArguments;
     224
     225static int compareWithCompareFunctionForQSort(const void *a, const void *b)
     226{
     227    CompareWithCompareFunctionArguments *args = compareWithCompareFunctionArguments;
     228   
     229    args->arguments.clear();
     230    args->arguments.append(Value(*(ValueImp **)a));
     231    args->arguments.append(Value(*(ValueImp **)b));
     232    return args->compareFunction->call(args->exec, args->globalObject, args->arguments)
     233        .toInt32(args->exec);
     234}
     235
     236void ArrayInstanceImp::sort(ExecState *exec, Object &compareFunction)
     237{
     238    CompareWithCompareFunctionArguments args(exec, compareFunction.imp());
     239    compareWithCompareFunctionArguments = &args;
     240    qsort(storage, length, sizeof(ValueImp *), compareWithCompareFunctionForQSort);
     241    compareWithCompareFunctionArguments = 0;
    193242}
    194243
     
    425474          useSortFunction = false;
    426475      }
     476   
     477    if (thisObj.imp()->classInfo() == &ArrayInstanceImp::info) {
     478      if (useSortFunction)
     479        ((ArrayInstanceImp *)thisObj.imp())->sort(exec, sortFunction);
     480      else
     481        ((ArrayInstanceImp *)thisObj.imp())->sort(exec);
     482      result = thisObj;
     483      break;
     484    }
    427485
    428486    if (length == 0) {
    429487      thisObj.put(exec, lengthPropertyName, Number(0), DontEnum | DontDelete);
    430       result = Undefined();
     488      result = thisObj;
    431489      break;
    432490    }
Note: See TracChangeset for help on using the changeset viewer.