Changeset 2736 in webkit for trunk/JavaScriptCore/kjs/array_object.cpp
- Timestamp:
- Nov 18, 2002, 1:55:23 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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 }
Note:
See TracChangeset
for help on using the changeset viewer.