Changeset 195420 in webkit
- Timestamp:
- Jan 21, 2016, 1:37:56 PM (11 years ago)
- Location:
- trunk/Source/WTF
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
wtf/RangeSet.h (modified) (3 diffs)
-
wtf/StdLibExtras.h (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r195417 r195420 1 2016-01-21 Filip Pizlo <fpizlo@apple.com> 2 3 REGRESSION(r195417): many tests crash 4 https://bugs.webkit.org/show_bug.cgi?id=153316 5 6 Reviewed by Saam Barati. 7 8 This rolls out the StdLibExtras.h change, and simplifies RangeSet to not use binary search. 9 That's fine for now, since B3 doesn't stress RangeSet enough right now. 10 11 * wtf/RangeSet.h: 12 (WTF::RangeSet::contains): 13 (WTF::RangeSet::overlaps): 14 (WTF::RangeSet::clear): 15 (WTF::RangeSet::findRange): 16 * wtf/StdLibExtras.h: 17 (WTF::binarySearchImpl): 18 (WTF::binarySearch): 19 (WTF::tryBinarySearch): 20 (WTF::approximateBinarySearch): 21 1 22 2016-01-21 Filip Pizlo <fpizlo@apple.com> 2 23 -
trunk/Source/WTF/wtf/RangeSet.h
r195417 r195420 93 93 94 94 unsigned index = findRange(range); 95 if (index + 1 < m_ranges.size() 96 && subsumesNonEmpty(m_ranges[index + 1], range)) 97 return true; 98 if (index < m_ranges.size() 99 && subsumesNonEmpty(m_ranges[index], range)) 100 return true; 101 if (static_cast<unsigned>(index - 1) < m_ranges.size() 102 && subsumesNonEmpty(m_ranges[index - 1], range)) 103 return true; 95 if (index != UINT_MAX) 96 return subsumesNonEmpty(m_ranges[index], range); 104 97 return false; 105 98 } … … 110 103 return false; 111 104 112 unsigned index = findRange(range); 113 if (index + 1 < m_ranges.size() 114 && overlapsNonEmpty(m_ranges[index + 1], range)) 115 return true; 116 if (index < m_ranges.size() 117 && overlapsNonEmpty(m_ranges[index], range)) 118 return true; 119 if (static_cast<unsigned>(index - 1) < m_ranges.size() 120 && overlapsNonEmpty(m_ranges[index - 1], range)) 121 return true; 122 return false; 105 return findRange(range) != UINT_MAX; 123 106 } 124 107 … … 192 175 const_cast<RangeSet*>(this)->compact(); 193 176 194 const Range* found = approximateBinarySearch<const Range, Type>( 195 m_ranges, m_ranges.size(), range.begin(), [&] (const Range* range) -> Type { 196 return range->begin(); 197 }); 198 if (!found) 199 return UINT_MAX; 200 201 return found - m_ranges.begin(); 177 // FIXME: Once we start using this in anger, we will want this to be a binary search. 178 for (unsigned i = 0; i < m_ranges.size(); ++i) { 179 if (overlapsNonEmpty(m_ranges[i], range)) 180 return i; 181 } 182 183 return UINT_MAX; 202 184 } 203 185 -
trunk/Source/WTF/wtf/StdLibExtras.h
r195417 r195420 1 1 /* 2 * Copyright (C) 2008 , 2016Apple Inc. All Rights Reserved.2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 3 3 * Copyright (C) 2013 Patrick Gansterer <paroga@paroga.com> 4 4 * … … 213 213 } 214 214 215 if (mode != KeyMustBePresentInArray && !size)215 if (mode == KeyMightNotBePresentInArray && !size) 216 216 return 0; 217 217 … … 231 231 // If the element is not found, crash if asserts are enabled, and behave like approximateBinarySearch in release builds. 232 232 template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey> 233 inline ArrayElementType* binarySearch(ArrayType& array, size_t size, KeyType key, const ExtractKey&extractKey = ExtractKey())233 inline ArrayElementType* binarySearch(ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey()) 234 234 { 235 235 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMustBePresentInArray>(array, size, key, extractKey); … … 238 238 // Return zero if the element is not found. 239 239 template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey> 240 inline ArrayElementType* tryBinarySearch(ArrayType& array, size_t size, KeyType key, const ExtractKey&extractKey = ExtractKey())240 inline ArrayElementType* tryBinarySearch(ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey()) 241 241 { 242 242 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMightNotBePresentInArray>(array, size, key, extractKey); … … 245 245 // Return the element that is either to the left, or the right, of where the element would have been found. 246 246 template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey> 247 inline ArrayElementType* approximateBinarySearch(ArrayType& array, size_t size, KeyType key, const ExtractKey&extractKey = ExtractKey())247 inline ArrayElementType* approximateBinarySearch(ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey()) 248 248 { 249 249 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, ReturnAdjacentElementIfKeyIsNotPresent>(array, size, key, extractKey); … … 252 252 // Variants of the above that use const. 253 253 template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey> 254 inline ArrayElementType* binarySearch(const ArrayType& array, size_t size, KeyType key, const ExtractKey&extractKey = ExtractKey())254 inline ArrayElementType* binarySearch(const ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey()) 255 255 { 256 256 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMustBePresentInArray>(const_cast<ArrayType&>(array), size, key, extractKey); 257 257 } 258 258 template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey> 259 inline ArrayElementType* tryBinarySearch(const ArrayType& array, size_t size, KeyType key, const ExtractKey&extractKey = ExtractKey())259 inline ArrayElementType* tryBinarySearch(const ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey()) 260 260 { 261 261 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMightNotBePresentInArray>(const_cast<ArrayType&>(array), size, key, extractKey); 262 262 } 263 263 template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey> 264 inline ArrayElementType* approximateBinarySearch(const ArrayType& array, size_t size, KeyType key, const ExtractKey&extractKey = ExtractKey())264 inline ArrayElementType* approximateBinarySearch(const ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey()) 265 265 { 266 266 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, ReturnAdjacentElementIfKeyIsNotPresent>(const_cast<ArrayType&>(array), size, key, extractKey);
Note:
See TracChangeset
for help on using the changeset viewer.