Changeset 40993 in webkit for trunk/JavaScriptCore/runtime/JSArray.cpp
- Timestamp:
- Feb 13, 2009, 3:28:04 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/JSArray.cpp
r40339 r40993 618 618 } 619 619 620 typedef std::pair<JSValuePtr, UString> ArrayQSortPair; 620 static int compareNumbersForQSort(const void* a, const void* b) 621 { 622 double da = static_cast<const JSValuePtr*>(a)->uncheckedGetNumber(); 623 double db = static_cast<const JSValuePtr*>(b)->uncheckedGetNumber(); 624 return (da > db) - (da < db); 625 } 626 627 typedef std::pair<JSValuePtr, UString> ValueStringPair; 621 628 622 629 static int compareByStringPairForQSort(const void* a, const void* b) 623 630 { 624 const ArrayQSortPair* va = static_cast<const ArrayQSortPair*>(a);625 const ArrayQSortPair* vb = static_cast<const ArrayQSortPair*>(b);631 const ValueStringPair* va = static_cast<const ValueStringPair*>(a); 632 const ValueStringPair* vb = static_cast<const ValueStringPair*>(b); 626 633 return compare(va->second, vb->second); 634 } 635 636 void JSArray::sortNumeric(ExecState* exec, JSValuePtr compareFunction, CallType callType, const CallData& callData) 637 { 638 unsigned lengthNotIncludingUndefined = compactForSorting(); 639 if (m_storage->m_sparseValueMap) { 640 throwOutOfMemoryError(exec); 641 return; 642 } 643 644 if (!lengthNotIncludingUndefined) 645 return; 646 647 bool allValuesAreNumbers = true; 648 size_t size = m_storage->m_numValuesInVector; 649 for (size_t i = 0; i < size; ++i) { 650 if (!m_storage->m_vector[i].isNumber()) { 651 allValuesAreNumbers = false; 652 break; 653 } 654 } 655 656 if (!allValuesAreNumbers) 657 return sort(exec, compareFunction, callType, callData); 658 659 // For numeric comparison, which is fast, qsort is faster than mergesort. We 660 // also don't require mergesort's stability, since there's no user visible 661 // side-effect from swapping the order of equal primitive values. 662 qsort(m_storage->m_vector, size, sizeof(JSValuePtr), compareNumbersForQSort); 663 664 checkConsistency(SortConsistencyCheck); 627 665 } 628 666 … … 643 681 // random or otherwise changing results, effectively making compare function inconsistent. 644 682 645 Vector< ArrayQSortPair> values(lengthNotIncludingUndefined);683 Vector<ValueStringPair> values(lengthNotIncludingUndefined); 646 684 if (!values.begin()) { 647 685 throwOutOfMemoryError(exec); … … 671 709 672 710 #if HAVE(MERGESORT) 673 mergesort(values.begin(), values.size(), sizeof( ArrayQSortPair), compareByStringPairForQSort);711 mergesort(values.begin(), values.size(), sizeof(ValueStringPair), compareByStringPairForQSort); 674 712 #else 675 713 // FIXME: The qsort library function is likely to not be a stable sort. 676 714 // ECMAScript-262 does not specify a stable sort, but in practice, browsers perform a stable sort. 677 qsort(values.begin(), values.size(), sizeof( ArrayQSortPair), compareByStringPairForQSort);715 qsort(values.begin(), values.size(), sizeof(ValueStringPair), compareByStringPairForQSort); 678 716 #endif 679 717
Note:
See TracChangeset
for help on using the changeset viewer.