Blame chromium-77.0.3865.90-linked-hash-set.patch

dacf053
From 74138b9febd37eac0fc26b8efb110014a83a52c6 Mon Sep 17 00:00:00 2001
dacf053
From: Jeremy Roman <jbroman@chromium.org>
dacf053
Date: Wed, 07 Aug 2019 13:26:48 +0000
dacf053
Subject: [PATCH] WTF: Make LinkedHashSet understand values for which memset initialization would be bad.
dacf053
dacf053
Includes a unit test which fails before, and uses this to fix FontCacheKeyTraits.
dacf053
dacf053
Bug: 980025
dacf053
Change-Id: If41f97444c7fd37b9b95d6dadaf3da5689079e9e
dacf053
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1739948
dacf053
Reviewed-by: Kentaro Hara <haraken@chromium.org>
dacf053
Reviewed-by: Yutaka Hirano <yhirano@chromium.org>
dacf053
Commit-Queue: Jeremy Roman <jbroman@chromium.org>
dacf053
Cr-Commit-Position: refs/heads/master@{#684731}
dacf053
---
dacf053
dacf053
diff --git a/third_party/blink/renderer/platform/fonts/font_cache_key.h b/third_party/blink/renderer/platform/fonts/font_cache_key.h
dacf053
index 0efc8fb..90063cb 100644
dacf053
--- a/third_party/blink/renderer/platform/fonts/font_cache_key.h
dacf053
+++ b/third_party/blink/renderer/platform/fonts/font_cache_key.h
dacf053
@@ -133,6 +133,10 @@
dacf053
 
dacf053
 struct FontCacheKeyTraits : WTF::SimpleClassHashTraits<FontCacheKey> {
dacf053
   STATIC_ONLY(FontCacheKeyTraits);
dacf053
+
dacf053
+  // std::string's empty state need not be zero in all implementations,
dacf053
+  // and it is held within FontFaceCreationParams.
dacf053
+  static const bool kEmptyValueIsZero = false;
dacf053
 };
dacf053
 
dacf053
 }  // namespace blink
dacf053
diff --git a/third_party/blink/renderer/platform/wtf/linked_hash_set.h b/third_party/blink/renderer/platform/wtf/linked_hash_set.h
dacf053
index b35b6e9..77e524c 100644
dacf053
--- a/third_party/blink/renderer/platform/wtf/linked_hash_set.h
dacf053
+++ b/third_party/blink/renderer/platform/wtf/linked_hash_set.h
dacf053
@@ -146,6 +146,11 @@
dacf053
                     LinkedHashSetNodeBase* next)
dacf053
       : LinkedHashSetNodeBase(prev, next), value_(value) {}
dacf053
 
dacf053
+  LinkedHashSetNode(ValueArg&& value,
dacf053
+                    LinkedHashSetNodeBase* prev,
dacf053
+                    LinkedHashSetNodeBase* next)
dacf053
+      : LinkedHashSetNodeBase(prev, next), value_(std::move(value)) {}
dacf053
+
dacf053
   LinkedHashSetNode(LinkedHashSetNode&& other)
dacf053
       : LinkedHashSetNodeBase(std::move(other)),
dacf053
         value_(std::move(other.value_)) {}
dacf053
@@ -445,10 +450,13 @@
dacf053
 
dacf053
   // The slot is empty when the next_ field is zero so it's safe to zero
dacf053
   // the backing.
dacf053
-  static const bool kEmptyValueIsZero = true;
dacf053
+  static const bool kEmptyValueIsZero = ValueTraits::kEmptyValueIsZero;
dacf053
 
dacf053
   static const bool kHasIsEmptyValueFunction = true;
dacf053
   static bool IsEmptyValue(const Node& node) { return !node.next_; }
dacf053
+  static Node EmptyValue() {
dacf053
+    return Node(ValueTraits::EmptyValue(), nullptr, nullptr);
dacf053
+  }
dacf053
 
dacf053
   static const int kDeletedValue = -1;
dacf053
 
dacf053
diff --git a/third_party/blink/renderer/platform/wtf/list_hash_set_test.cc b/third_party/blink/renderer/platform/wtf/list_hash_set_test.cc
dacf053
index 4c3f899..cd1be00 100644
dacf053
--- a/third_party/blink/renderer/platform/wtf/list_hash_set_test.cc
dacf053
+++ b/third_party/blink/renderer/platform/wtf/list_hash_set_test.cc
dacf053
@@ -487,6 +487,7 @@
dacf053
 };
dacf053
 
dacf053
 struct Complicated {
dacf053
+  Complicated() : Complicated(0) {}
dacf053
   Complicated(int value) : simple_(value) { objects_constructed_++; }
dacf053
 
dacf053
   Complicated(const Complicated& other) : simple_(other.simple_) {
dacf053
@@ -495,9 +496,6 @@
dacf053
 
dacf053
   Simple simple_;
dacf053
   static int objects_constructed_;
dacf053
-
dacf053
- private:
dacf053
-  Complicated() = delete;
dacf053
 };
dacf053
 
dacf053
 int Complicated::objects_constructed_ = 0;
dacf053
@@ -731,4 +729,45 @@
dacf053
 
dacf053
 }  // anonymous namespace
dacf053
 
dacf053
+// A unit type which objects to its state being initialized wrong.
dacf053
+struct InvalidZeroValue {
dacf053
+  InvalidZeroValue() = default;
dacf053
+  InvalidZeroValue(WTF::HashTableDeletedValueType) : deleted_(true) {}
dacf053
+  ~InvalidZeroValue() { CHECK(ok_); }
dacf053
+  bool IsHashTableDeletedValue() const { return deleted_; }
dacf053
+
dacf053
+  bool ok_ = true;
dacf053
+  bool deleted_ = false;
dacf053
+};
dacf053
+
dacf053
+template <>
dacf053
+struct HashTraits<InvalidZeroValue> : SimpleClassHashTraits<InvalidZeroValue> {
dacf053
+  static const bool kEmptyValueIsZero = false;
dacf053
+};
dacf053
+
dacf053
+template <>
dacf053
+struct DefaultHash<InvalidZeroValue> {
dacf053
+  struct Hash {
dacf053
+    static unsigned GetHash(const InvalidZeroValue&) { return 0; }
dacf053
+    static bool Equal(const InvalidZeroValue&, const InvalidZeroValue&) {
dacf053
+      return true;
dacf053
+    }
dacf053
+  };
dacf053
+};
dacf053
+
dacf053
+template <typename Set>
dacf053
+class ListOrLinkedHashSetInvalidZeroTest : public testing::Test {};
dacf053
+
dacf053
+using InvalidZeroValueSetTypes =
dacf053
+    testing::Types<ListHashSet<InvalidZeroValue>,
dacf053
+                   ListHashSet<InvalidZeroValue, 1>,
dacf053
+                   LinkedHashSet<InvalidZeroValue>>;
dacf053
+TYPED_TEST_SUITE(ListOrLinkedHashSetInvalidZeroTest, InvalidZeroValueSetTypes);
dacf053
+
dacf053
+TYPED_TEST(ListOrLinkedHashSetInvalidZeroTest, InvalidZeroValue) {
dacf053
+  using Set = TypeParam;
dacf053
+  Set set;
dacf053
+  set.insert(InvalidZeroValue());
dacf053
+}
dacf053
+
dacf053
 }  // namespace WTF