Don't use ConsStringIterator to compute string hashes
authordcarney <dcarney@chromium.org>
Wed, 26 Nov 2014 11:53:27 +0000 (03:53 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 26 Nov 2014 11:53:34 +0000 (11:53 +0000)
R=yangguo@chromium.org

BUG=

Review URL: https://codereview.chromium.org/762773002

Cr-Commit-Position: refs/heads/master@{#25518}

src/objects-inl.h
src/objects.cc
src/objects.h

index 9172257e6d8c884e5448605c4b7ee6ded30c698c..03aea64736d818f456c748f76a31d583593dc664 100644 (file)
@@ -6787,13 +6787,8 @@ uint32_t IteratingStringHasher::Hash(String* string, uint32_t seed) {
   // Nothing to do.
   if (hasher.has_trivial_hash()) return hasher.GetHashField();
   ConsString* cons_string = String::VisitFlat(&hasher, string);
-  // The string was flat.
-  if (cons_string == NULL) return hasher.GetHashField();
-  // This is a ConsString, iterate across it.
-  ConsStringIterator iter(cons_string);
-  int offset;
-  while (NULL != (string = iter.Next(&offset))) {
-    String::VisitFlat(&hasher, string, offset);
+  if (cons_string != nullptr) {
+    hasher.VisitConsString(cons_string);
   }
   return hasher.GetHashField();
 }
index 5262ed65671afa93c941173f9124813ab82c56ab..f4d22188b68fa747ae837d0367ab5d9050fb5cc8 100644 (file)
@@ -9283,6 +9283,23 @@ uint32_t StringHasher::ComputeUtf8Hash(Vector<const char> chars,
 }
 
 
+void IteratingStringHasher::VisitConsString(ConsString* cons_string) {
+  const int max_length = String::kMaxHashCalcLength;
+  int length = std::min(cons_string->length(), max_length);
+  if (cons_string->HasOnlyOneByteChars()) {
+    uint8_t* buffer = new uint8_t[length];
+    String::WriteToFlat(cons_string, buffer, 0, length);
+    AddCharacters(buffer, length);
+    delete[] buffer;
+  } else {
+    uint16_t* buffer = new uint16_t[length];
+    String::WriteToFlat(cons_string, buffer, 0, length);
+    AddCharacters(buffer, length);
+    delete[] buffer;
+  }
+}
+
+
 void String::PrintOn(FILE* file) {
   int length = this->length();
   for (int i = 0; i < length; i++) {
index 664a5064c706697b50a81f4c6994372e9bec023f..746f88d1c4c0c10083e63263a005f79ec4378b9d 100644 (file)
@@ -850,6 +850,7 @@ class AccessorPair;
 class AllocationSite;
 class AllocationSiteCreationContext;
 class AllocationSiteUsageContext;
+class ConsString;
 class DictionaryElementsAccessor;
 class ElementsAccessor;
 class FixedArrayBase;
@@ -8524,6 +8525,7 @@ class IteratingStringHasher : public StringHasher {
  private:
   inline IteratingStringHasher(int len, uint32_t seed)
       : StringHasher(len, seed) {}
+  void VisitConsString(ConsString* cons_string);
   DISALLOW_COPY_AND_ASSIGN(IteratingStringHasher);
 };