Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index fb3fe647f1a8be00eb543a54dfe8aecd69299fa6..38104f5ad237975f116be79cf4bd2759386827c7 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -1915,8 +1915,8 @@ void DescriptorArray::SetNumberOfDescriptors(int number_of_descriptors) { |
// Perform a binary search in a fixed array. Low and high are entry indices. If |
// there are three entries in this array it should be called with low=0 and |
// high=2. |
-template<typename T> |
-int BinarySearch(T* array, String* name, int low, int high) { |
+template<SearchMode search_mode, typename T> |
+int BinarySearch(T* array, String* name, int low, int high, int valid_entries) { |
uint32_t hash = name->Hash(); |
int limit = high; |
@@ -1938,7 +1938,12 @@ int BinarySearch(T* array, String* name, int low, int high) { |
int sort_index = array->GetSortedKeyIndex(low); |
String* entry = array->GetKey(sort_index); |
if (entry->Hash() != hash) break; |
- if (entry->Equals(name)) return sort_index; |
+ if (entry->Equals(name)) { |
+ if (search_mode == ALL_ENTRIES || sort_index < valid_entries) { |
+ return sort_index; |
+ } |
+ return T::kNotFound; |
+ } |
} |
return T::kNotFound; |
@@ -1982,13 +1987,15 @@ int Search(T* array, String* name, int valid_entries) { |
// Fast case: do linear search for small arrays. |
const int kMaxElementsForLinearSearch = 8; |
- if (search_mode == VALID_ENTRIES || |
- (search_mode == ALL_ENTRIES && nof < kMaxElementsForLinearSearch)) { |
+ if ((search_mode == ALL_ENTRIES && |
+ nof <= kMaxElementsForLinearSearch) || |
+ (search_mode == VALID_ENTRIES && |
+ valid_entries <= kMaxElementsForLinearSearch)) { |
return LinearSearch<search_mode>(array, name, nof, valid_entries); |
} |
// Slow case: perform binary search. |
- return BinarySearch(array, name, 0, nof - 1); |
+ return BinarySearch<search_mode>(array, name, 0, nof - 1, valid_entries); |
} |