Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: src/objects-inl.h

Issue 698043003: TransitionArray::Search() now returns insertion index if the entry was not found. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | src/transitions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // Review notes: 5 // Review notes:
6 // 6 //
7 // - The use of macros in these inline functions may seem superfluous 7 // - The use of macros in these inline functions may seem superfluous
8 // but it is absolutely needed to make sure gcc generates optimal 8 // but it is absolutely needed to make sure gcc generates optimal
9 // code. gcc is not happy when attempting to inline too deep. 9 // code. gcc is not happy when attempting to inline too deep.
10 // 10 //
(...skipping 2783 matching lines...) Expand 10 before | Expand all | Expand 10 after
2794 2794
2795 void DescriptorArray::SetNumberOfDescriptors(int number_of_descriptors) { 2795 void DescriptorArray::SetNumberOfDescriptors(int number_of_descriptors) {
2796 WRITE_FIELD( 2796 WRITE_FIELD(
2797 this, kDescriptorLengthOffset, Smi::FromInt(number_of_descriptors)); 2797 this, kDescriptorLengthOffset, Smi::FromInt(number_of_descriptors));
2798 } 2798 }
2799 2799
2800 2800
2801 // Perform a binary search in a fixed array. Low and high are entry indices. If 2801 // Perform a binary search in a fixed array. Low and high are entry indices. If
2802 // there are three entries in this array it should be called with low=0 and 2802 // there are three entries in this array it should be called with low=0 and
2803 // high=2. 2803 // high=2.
2804 template<SearchMode search_mode, typename T> 2804 template <SearchMode search_mode, typename T>
2805 int BinarySearch(T* array, Name* name, int low, int high, int valid_entries) { 2805 int BinarySearch(T* array, Name* name, int low, int high, int valid_entries,
2806 int* out_insertion_index) {
2807 DCHECK(search_mode == ALL_ENTRIES || out_insertion_index == NULL);
2806 uint32_t hash = name->Hash(); 2808 uint32_t hash = name->Hash();
2807 int limit = high; 2809 int limit = high;
2808 2810
2809 DCHECK(low <= high); 2811 DCHECK(low <= high);
2810 2812
2811 while (low != high) { 2813 while (low != high) {
2812 int mid = (low + high) / 2; 2814 int mid = (low + high) / 2;
2813 Name* mid_name = array->GetSortedKey(mid); 2815 Name* mid_name = array->GetSortedKey(mid);
2814 uint32_t mid_hash = mid_name->Hash(); 2816 uint32_t mid_hash = mid_name->Hash();
2815 2817
2816 if (mid_hash >= hash) { 2818 if (mid_hash >= hash) {
2817 high = mid; 2819 high = mid;
2818 } else { 2820 } else {
2819 low = mid + 1; 2821 low = mid + 1;
2820 } 2822 }
2821 } 2823 }
2822 2824
2823 for (; low <= limit; ++low) { 2825 for (; low <= limit; ++low) {
2824 int sort_index = array->GetSortedKeyIndex(low); 2826 int sort_index = array->GetSortedKeyIndex(low);
2825 Name* entry = array->GetKey(sort_index); 2827 Name* entry = array->GetKey(sort_index);
2826 if (entry->Hash() != hash) break; 2828 uint32_t current_hash = entry->Hash();
2829 if (current_hash != hash) {
2830 if (out_insertion_index != NULL) {
2831 *out_insertion_index = sort_index + (current_hash > hash ? 0 : 1);
2832 }
2833 return T::kNotFound;
2834 }
2827 if (entry->Equals(name)) { 2835 if (entry->Equals(name)) {
2828 if (search_mode == ALL_ENTRIES || sort_index < valid_entries) { 2836 if (search_mode == ALL_ENTRIES || sort_index < valid_entries) {
2829 return sort_index; 2837 return sort_index;
2830 } 2838 }
2831 return T::kNotFound; 2839 return T::kNotFound;
2832 } 2840 }
2833 } 2841 }
2834 2842
2843 if (out_insertion_index != NULL) *out_insertion_index = limit + 1;
2835 return T::kNotFound; 2844 return T::kNotFound;
2836 } 2845 }
2837 2846
2838 2847
2839 // Perform a linear search in this fixed array. len is the number of entry 2848 // Perform a linear search in this fixed array. len is the number of entry
2840 // indices that are valid. 2849 // indices that are valid.
2841 template<SearchMode search_mode, typename T> 2850 template <SearchMode search_mode, typename T>
2842 int LinearSearch(T* array, Name* name, int len, int valid_entries) { 2851 int LinearSearch(T* array, Name* name, int len, int valid_entries,
2852 int* out_insertion_index) {
2843 uint32_t hash = name->Hash(); 2853 uint32_t hash = name->Hash();
2844 if (search_mode == ALL_ENTRIES) { 2854 if (search_mode == ALL_ENTRIES) {
2845 for (int number = 0; number < len; number++) { 2855 for (int number = 0; number < len; number++) {
2846 int sorted_index = array->GetSortedKeyIndex(number); 2856 int sorted_index = array->GetSortedKeyIndex(number);
2847 Name* entry = array->GetKey(sorted_index); 2857 Name* entry = array->GetKey(sorted_index);
2848 uint32_t current_hash = entry->Hash(); 2858 uint32_t current_hash = entry->Hash();
2849 if (current_hash > hash) break; 2859 if (current_hash > hash) {
2860 if (out_insertion_index != NULL) *out_insertion_index = sorted_index;
2861 return T::kNotFound;
2862 }
2850 if (current_hash == hash && entry->Equals(name)) return sorted_index; 2863 if (current_hash == hash && entry->Equals(name)) return sorted_index;
2851 } 2864 }
2865 if (out_insertion_index != NULL) *out_insertion_index = len;
2866 return T::kNotFound;
2852 } else { 2867 } else {
2853 DCHECK(len >= valid_entries); 2868 DCHECK(len >= valid_entries);
2869 DCHECK_EQ(NULL, out_insertion_index); // Not supported here.
2854 for (int number = 0; number < valid_entries; number++) { 2870 for (int number = 0; number < valid_entries; number++) {
2855 Name* entry = array->GetKey(number); 2871 Name* entry = array->GetKey(number);
2856 uint32_t current_hash = entry->Hash(); 2872 uint32_t current_hash = entry->Hash();
2857 if (current_hash == hash && entry->Equals(name)) return number; 2873 if (current_hash == hash && entry->Equals(name)) return number;
2858 } 2874 }
2875 return T::kNotFound;
2859 } 2876 }
2860 return T::kNotFound;
2861 } 2877 }
2862 2878
2863 2879
2864 template<SearchMode search_mode, typename T> 2880 template <SearchMode search_mode, typename T>
2865 int Search(T* array, Name* name, int valid_entries) { 2881 int Search(T* array, Name* name, int valid_entries, int* out_insertion_index) {
2866 if (search_mode == VALID_ENTRIES) { 2882 if (search_mode == VALID_ENTRIES) {
2867 SLOW_DCHECK(array->IsSortedNoDuplicates(valid_entries)); 2883 SLOW_DCHECK(array->IsSortedNoDuplicates(valid_entries));
2868 } else { 2884 } else {
2869 SLOW_DCHECK(array->IsSortedNoDuplicates()); 2885 SLOW_DCHECK(array->IsSortedNoDuplicates());
2870 } 2886 }
2871 2887
2872 int nof = array->number_of_entries(); 2888 int nof = array->number_of_entries();
2873 if (nof == 0) return T::kNotFound; 2889 if (nof == 0) {
2890 if (out_insertion_index != NULL) *out_insertion_index = 0;
2891 return T::kNotFound;
2892 }
2874 2893
2875 // Fast case: do linear search for small arrays. 2894 // Fast case: do linear search for small arrays.
2876 const int kMaxElementsForLinearSearch = 8; 2895 const int kMaxElementsForLinearSearch = 8;
2877 if ((search_mode == ALL_ENTRIES && 2896 if ((search_mode == ALL_ENTRIES &&
2878 nof <= kMaxElementsForLinearSearch) || 2897 nof <= kMaxElementsForLinearSearch) ||
2879 (search_mode == VALID_ENTRIES && 2898 (search_mode == VALID_ENTRIES &&
2880 valid_entries <= (kMaxElementsForLinearSearch * 3))) { 2899 valid_entries <= (kMaxElementsForLinearSearch * 3))) {
2881 return LinearSearch<search_mode>(array, name, nof, valid_entries); 2900 return LinearSearch<search_mode>(array, name, nof, valid_entries,
2901 out_insertion_index);
2882 } 2902 }
2883 2903
2884 // Slow case: perform binary search. 2904 // Slow case: perform binary search.
2885 return BinarySearch<search_mode>(array, name, 0, nof - 1, valid_entries); 2905 return BinarySearch<search_mode>(array, name, 0, nof - 1, valid_entries,
2906 out_insertion_index);
2886 } 2907 }
2887 2908
2888 2909
2889 int DescriptorArray::Search(Name* name, int valid_descriptors) { 2910 int DescriptorArray::Search(Name* name, int valid_descriptors) {
2890 return internal::Search<VALID_ENTRIES>(this, name, valid_descriptors); 2911 return internal::Search<VALID_ENTRIES>(this, name, valid_descriptors, NULL);
2891 } 2912 }
2892 2913
2893 2914
2894 int DescriptorArray::SearchWithCache(Name* name, Map* map) { 2915 int DescriptorArray::SearchWithCache(Name* name, Map* map) {
2895 int number_of_own_descriptors = map->NumberOfOwnDescriptors(); 2916 int number_of_own_descriptors = map->NumberOfOwnDescriptors();
2896 if (number_of_own_descriptors == 0) return kNotFound; 2917 if (number_of_own_descriptors == 0) return kNotFound;
2897 2918
2898 DescriptorLookupCache* cache = GetIsolate()->descriptor_lookup_cache(); 2919 DescriptorLookupCache* cache = GetIsolate()->descriptor_lookup_cache();
2899 int number = cache->Lookup(map, name); 2920 int number = cache->Lookup(map, name);
2900 2921
(...skipping 4394 matching lines...) Expand 10 before | Expand all | Expand 10 after
7295 #undef READ_SHORT_FIELD 7316 #undef READ_SHORT_FIELD
7296 #undef WRITE_SHORT_FIELD 7317 #undef WRITE_SHORT_FIELD
7297 #undef READ_BYTE_FIELD 7318 #undef READ_BYTE_FIELD
7298 #undef WRITE_BYTE_FIELD 7319 #undef WRITE_BYTE_FIELD
7299 #undef NOBARRIER_READ_BYTE_FIELD 7320 #undef NOBARRIER_READ_BYTE_FIELD
7300 #undef NOBARRIER_WRITE_BYTE_FIELD 7321 #undef NOBARRIER_WRITE_BYTE_FIELD
7301 7322
7302 } } // namespace v8::internal 7323 } } // namespace v8::internal
7303 7324
7304 #endif // V8_OBJECTS_INL_H_ 7325 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/transitions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698