Changeset 2736 in webkit
- Timestamp:
- Nov 18, 2002, 1:55:23 PM (23 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r2735 r2736 1 2002-11-18 Darin Adler <[email protected]> 2 3 - fix worst speed problems on the sort page of the iBench JavaScript test 4 5 Sped up JavaScript iBench by 70%, the sort page by 88%. 6 7 * kjs/array_object.h: Add array-specific sort functions. 8 * kjs/array_object.cpp: 9 (compareByStringForQSort): Added. 10 (ArrayInstanceImp::sort): Added. 11 (compareWithCompareFunctionForQSort): Added. 12 (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being 13 sorted is actually an array. 14 15 * kjs/object.h: Add argumentsPropertyName. 16 * kjs/object.cpp: Add argumentsPropertyName. 17 * kjs/function.cpp: 18 (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString. 19 (FunctionImp::call): Ditto. 20 (ActivationImp::ActivationImp): Ditto. 21 * kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto. 22 23 * kjs/ustring.h: Added compare function for -1/0/+1 comparison. 24 * kjs/ustring.cpp: (KJS::compare): Added. 25 1 26 2002-11-18 Maciej Stachowiak <[email protected]> 2 27 -
trunk/JavaScriptCore/ChangeLog-2002-12-03
r2735 r2736 1 2002-11-18 Darin Adler <[email protected]> 2 3 - fix worst speed problems on the sort page of the iBench JavaScript test 4 5 Sped up JavaScript iBench by 70%, the sort page by 88%. 6 7 * kjs/array_object.h: Add array-specific sort functions. 8 * kjs/array_object.cpp: 9 (compareByStringForQSort): Added. 10 (ArrayInstanceImp::sort): Added. 11 (compareWithCompareFunctionForQSort): Added. 12 (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being 13 sorted is actually an array. 14 15 * kjs/object.h: Add argumentsPropertyName. 16 * kjs/object.cpp: Add argumentsPropertyName. 17 * kjs/function.cpp: 18 (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString. 19 (FunctionImp::call): Ditto. 20 (ActivationImp::ActivationImp): Ditto. 21 * kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto. 22 23 * kjs/ustring.h: Added compare function for -1/0/+1 comparison. 24 * kjs/ustring.cpp: (KJS::compare): Added. 25 1 26 2002-11-18 Maciej Stachowiak <[email protected]> 2 27 -
trunk/JavaScriptCore/ChangeLog-2003-10-25
r2735 r2736 1 2002-11-18 Darin Adler <[email protected]> 2 3 - fix worst speed problems on the sort page of the iBench JavaScript test 4 5 Sped up JavaScript iBench by 70%, the sort page by 88%. 6 7 * kjs/array_object.h: Add array-specific sort functions. 8 * kjs/array_object.cpp: 9 (compareByStringForQSort): Added. 10 (ArrayInstanceImp::sort): Added. 11 (compareWithCompareFunctionForQSort): Added. 12 (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being 13 sorted is actually an array. 14 15 * kjs/object.h: Add argumentsPropertyName. 16 * kjs/object.cpp: Add argumentsPropertyName. 17 * kjs/function.cpp: 18 (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString. 19 (FunctionImp::call): Ditto. 20 (ActivationImp::ActivationImp): Ditto. 21 * kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto. 22 23 * kjs/ustring.h: Added compare function for -1/0/+1 comparison. 24 * kjs/ustring.cpp: (KJS::compare): Added. 25 1 26 2002-11-18 Maciej Stachowiak <[email protected]> 2 27 -
trunk/JavaScriptCore/kjs/array_object.cpp
r2475 r2736 191 191 imp->mark(); 192 192 } 193 } 194 195 static ExecState *execForCompareByStringForQSort; 196 197 static 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 203 void ArrayInstanceImp::sort(ExecState *exec) 204 { 205 execForCompareByStringForQSort = exec; 206 qsort(storage, length, sizeof(ValueImp *), compareByStringForQSort); 207 execForCompareByStringForQSort = 0; 208 } 209 210 struct 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 223 static CompareWithCompareFunctionArguments *compareWithCompareFunctionArguments; 224 225 static 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 236 void 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; 193 242 } 194 243 … … 425 474 useSortFunction = false; 426 475 } 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 } 427 485 428 486 if (length == 0) { 429 487 thisObj.put(exec, lengthPropertyName, Number(0), DontEnum | DontDelete); 430 result = Undefined();488 result = thisObj; 431 489 break; 432 490 } -
trunk/JavaScriptCore/kjs/array_object.h
r1821 r2736 50 50 unsigned getLength() const { return length; } 51 51 52 void sort(ExecState *exec); 53 void sort(ExecState *exec, Object &compareFunction); 54 52 55 private: 53 56 void setLength(unsigned newLength); -
trunk/JavaScriptCore/kjs/function.cpp
r2249 r2736 60 60 Value protect(this); 61 61 //fprintf(stderr,"FunctionImp::FunctionImp this=%p\n"); 62 put(exec, "arguments",Null(),ReadOnly|DontDelete|DontEnum);62 put(exec,argumentsPropertyName,Null(),ReadOnly|DontDelete|DontEnum); 63 63 } 64 64 … … 109 109 // previous arguments object. 110 110 // Note: this does not appear to be part of the spec 111 Value oldArgs = get(&newExec, "arguments");111 Value oldArgs = get(&newExec, argumentsPropertyName); 112 112 113 113 if (codeType() == FunctionCode) { 114 114 assert(ctx.activationObject().inherits(&ActivationImp::info)); 115 115 Object argsObj = static_cast<ActivationImp*>(ctx.activationObject().imp())->argumentsObject(); 116 put(&newExec, "arguments", argsObj, DontDelete|DontEnum|ReadOnly);116 put(&newExec, argumentsPropertyName, argsObj, DontDelete|DontEnum|ReadOnly); 117 117 } 118 118 … … 128 128 exec->setException(newExec.exception()); 129 129 if (codeType() == FunctionCode) 130 put(&newExec, "arguments", oldArgs, DontDelete|DontEnum|ReadOnly);130 put(&newExec, argumentsPropertyName, oldArgs, DontDelete|DontEnum|ReadOnly); 131 131 132 132 #ifdef KJS_VERBOSE … … 309 309 Value protect(this); 310 310 arguments = new ArgumentsImp(exec,f, args); 311 put(exec, "arguments", Object(arguments), Internal|DontDelete);311 put(exec, argumentsPropertyName, Object(arguments), Internal|DontDelete); 312 312 } 313 313 -
trunk/JavaScriptCore/kjs/function_object.cpp
r1799 r2736 284 284 Object(fimp), DontEnum|DontDelete|ReadOnly); 285 285 fimp->put(exec,prototypePropertyName,prototype,DontEnum|DontDelete|ReadOnly); 286 fimp->put(exec, "arguments",Null(),DontEnum|DontDelete|ReadOnly);286 fimp->put(exec,argumentsPropertyName,Null(),DontEnum|DontDelete|ReadOnly); 287 287 return ret; 288 288 } -
trunk/JavaScriptCore/kjs/object.cpp
r2535 r2736 42 42 namespace KJS { 43 43 44 extern const UString argumentsPropertyName("arguments"); 44 45 extern const UString lengthPropertyName("length"); 45 46 extern const UString prototypePropertyName("prototype"); -
trunk/JavaScriptCore/kjs/object.h
r2184 r2736 706 706 { imp()->setInternalValue(v); } 707 707 708 extern const UString argumentsPropertyName; 708 709 extern const UString lengthPropertyName; 709 710 extern const UString prototypePropertyName; -
trunk/JavaScriptCore/kjs/ustring.cpp
r2304 r2736 643 643 return (l1 < l2); 644 644 } 645 646 int KJS::compare(const UString& s1, const UString& s2) 647 { 648 const int l1 = s1.size(); 649 const int l2 = s2.size(); 650 const int lmin = l1 < l2 ? l1 : l2; 651 const UChar *c1 = s1.data(); 652 const UChar *c2 = s2.data(); 653 int l = 0; 654 while (l < lmin && *c1 == *c2) { 655 c1++; 656 c2++; 657 l++; 658 } 659 if (l < lmin) 660 return (c1->unicode() > c2->unicode()) ? 1 : -1; 661 662 if (l1 == l2) { 663 return 0; 664 } 665 return (l1 < l2) ? 1 : -1; 666 } -
trunk/JavaScriptCore/kjs/ustring.h
r2483 r2736 431 431 return UString(s1, s2); 432 432 } 433 434 int compare(const UString &, const UString &); 433 435 434 436 }; // namespace
Note:
See TracChangeset
for help on using the changeset viewer.