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

Unified Diff: src/objects-inl.h

Issue 1704353002: [runtime] Force internalize names used before lookup in in DescriptorArray and TransitionArray (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects.cc ('k') | src/property.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index e40f02fc199a627e9b6a0e398d7c2891c602b93e..5323183a745d9ff4ffa8bbd95f38ff76473030c7 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -172,6 +172,12 @@ bool HeapObject::IsUniqueName() const {
return IsInternalizedString() || IsSymbol();
}
+bool Name::IsUniqueName() const {
+ uint32_t type = map()->instance_type();
+ return (type & (kIsNotStringMask | kIsNotInternalizedMask)) !=
+ (kStringTag | kNotInternalizedTag);
+}
+
bool HeapObject::IsFunction() const {
STATIC_ASSERT(LAST_FUNCTION_TYPE == LAST_TYPE);
return map()->instance_type() >= FIRST_FUNCTION_TYPE;
@@ -2538,15 +2544,14 @@ Object** DescriptorArray::GetEnumCacheSlot() {
kEnumCacheOffset);
}
-
-// 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.
+// Perform a binary search in a fixed array.
template <SearchMode search_mode, typename T>
-int BinarySearch(T* array, Name* name, int low, int high, int valid_entries,
+int BinarySearch(T* array, Name* name, int valid_entries,
int* out_insertion_index) {
DCHECK(search_mode == ALL_ENTRIES || out_insertion_index == NULL);
- uint32_t hash = name->Hash();
+ int low = 0;
+ int high = array->number_of_entries() - 1;
+ uint32_t hash = name->hash_field();
int limit = high;
DCHECK(low <= high);
@@ -2554,7 +2559,7 @@ int BinarySearch(T* array, Name* name, int low, int high, int valid_entries,
while (low != high) {
int mid = low + (high - low) / 2;
Name* mid_name = array->GetSortedKey(mid);
- uint32_t mid_hash = mid_name->Hash();
+ uint32_t mid_hash = mid_name->hash_field();
if (mid_hash >= hash) {
high = mid;
@@ -2566,14 +2571,14 @@ int BinarySearch(T* array, Name* name, int low, int high, int valid_entries,
for (; low <= limit; ++low) {
int sort_index = array->GetSortedKeyIndex(low);
Name* entry = array->GetKey(sort_index);
- uint32_t current_hash = entry->Hash();
+ uint32_t current_hash = entry->hash_field();
if (current_hash != hash) {
- if (out_insertion_index != NULL) {
+ if (search_mode == ALL_ENTRIES && out_insertion_index != nullptr) {
*out_insertion_index = sort_index + (current_hash > hash ? 0 : 1);
}
return T::kNotFound;
}
- if (entry->Equals(name)) {
+ if (entry == name) {
if (search_mode == ALL_ENTRIES || sort_index < valid_entries) {
return sort_index;
}
@@ -2581,7 +2586,9 @@ int BinarySearch(T* array, Name* name, int low, int high, int valid_entries,
}
}
- if (out_insertion_index != NULL) *out_insertion_index = limit + 1;
+ if (search_mode == ALL_ENTRIES && out_insertion_index != nullptr) {
+ *out_insertion_index = limit + 1;
+ }
return T::kNotFound;
}
@@ -2589,27 +2596,28 @@ int BinarySearch(T* array, Name* name, int low, int high, int valid_entries,
// Perform a linear search in this fixed array. len is the number of entry
// indices that are valid.
template <SearchMode search_mode, typename T>
-int LinearSearch(T* array, Name* name, int len, int valid_entries,
+int LinearSearch(T* array, Name* name, int valid_entries,
int* out_insertion_index) {
- if (search_mode == ALL_ENTRIES) {
- uint32_t hash = name->Hash();
+ if (search_mode == ALL_ENTRIES && out_insertion_index != nullptr) {
+ uint32_t hash = name->hash_field();
+ int len = array->number_of_entries();
for (int number = 0; number < len; number++) {
int sorted_index = array->GetSortedKeyIndex(number);
Name* entry = array->GetKey(sorted_index);
- uint32_t current_hash = entry->Hash();
+ uint32_t current_hash = entry->hash_field();
if (current_hash > hash) {
- if (out_insertion_index != NULL) *out_insertion_index = sorted_index;
+ *out_insertion_index = sorted_index;
return T::kNotFound;
}
- if (current_hash == hash && entry->Equals(name)) return sorted_index;
+ if (entry == name) return sorted_index;
}
- if (out_insertion_index != NULL) *out_insertion_index = len;
+ *out_insertion_index = len;
return T::kNotFound;
} else {
- DCHECK(len >= valid_entries);
+ DCHECK_LE(valid_entries, array->number_of_entries());
DCHECK_NULL(out_insertion_index); // Not supported here.
for (int number = 0; number < valid_entries; number++) {
- if (array->GetKey(number)->Equals(name)) return number;
+ if (array->GetKey(number) == name) return number;
}
return T::kNotFound;
}
@@ -2618,39 +2626,35 @@ int LinearSearch(T* array, Name* name, int len, int valid_entries,
template <SearchMode search_mode, typename T>
int Search(T* array, Name* name, int valid_entries, int* out_insertion_index) {
- if (search_mode == VALID_ENTRIES) {
- SLOW_DCHECK(array->IsSortedNoDuplicates(valid_entries));
- } else {
- SLOW_DCHECK(array->IsSortedNoDuplicates());
- }
+ SLOW_DCHECK(array->IsSortedNoDuplicates());
- int nof = array->number_of_entries();
- if (nof == 0) {
- if (out_insertion_index != NULL) *out_insertion_index = 0;
+ if (valid_entries == 0) {
+ if (search_mode == ALL_ENTRIES && out_insertion_index != nullptr) {
+ *out_insertion_index = 0;
+ }
return T::kNotFound;
}
// Fast case: do linear search for small arrays.
const int kMaxElementsForLinearSearch = 8;
- if ((search_mode == ALL_ENTRIES &&
- nof <= kMaxElementsForLinearSearch) ||
- (search_mode == VALID_ENTRIES &&
- valid_entries <= (kMaxElementsForLinearSearch * 3))) {
- return LinearSearch<search_mode>(array, name, nof, valid_entries,
+ if (valid_entries <= kMaxElementsForLinearSearch) {
+ return LinearSearch<search_mode>(array, name, valid_entries,
out_insertion_index);
}
// Slow case: perform binary search.
- return BinarySearch<search_mode>(array, name, 0, nof - 1, valid_entries,
+ return BinarySearch<search_mode>(array, name, valid_entries,
out_insertion_index);
}
int DescriptorArray::Search(Name* name, int valid_descriptors) {
+ DCHECK(name->IsUniqueName());
return internal::Search<VALID_ENTRIES>(this, name, valid_descriptors, NULL);
}
int DescriptorArray::SearchWithCache(Isolate* isolate, Name* name, Map* map) {
+ DCHECK(name->IsUniqueName());
int number_of_own_descriptors = map->NumberOfOwnDescriptors();
if (number_of_own_descriptors == 0) return kNotFound;
@@ -2665,7 +2669,6 @@ int DescriptorArray::SearchWithCache(Isolate* isolate, Name* name, Map* map) {
return number;
}
-
PropertyDetails Map::GetLastDescriptorDetails() {
return instance_descriptors()->GetDetails(LastAdded());
}
@@ -3422,12 +3425,6 @@ Handle<String> String::Flatten(Handle<String> string, PretenureFlag pretenure) {
}
-Handle<Name> Name::Flatten(Handle<Name> name, PretenureFlag pretenure) {
- if (name->IsSymbol()) return name;
- return String::Flatten(Handle<String>::cast(name));
-}
-
-
uint16_t String::Get(int index) {
DCHECK(index >= 0 && index < length());
switch (StringShape(this).full_representation_tag()) {
« no previous file with comments | « src/objects.cc ('k') | src/property.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698