From bc9a96ef9eeab89276d67929f4a8a7d88f5dbc02 Mon Sep 17 00:00:00 2001 From: Stephan Hartmann Date: Wed, 27 May 2020 13:37:25 +0000 Subject: [PATCH] GCC: fix template specialization in TraceInCollectionTrait GCC complains that explicit specialization in non-namespace scope is happening for TraceImpl. Move TraceImpl implementations into different nested classes and select implementation using std::conditional. Bug: 819294 Change-Id: I8feea5f2aa6e1f87daad61f496d6b53b1bbc49ac Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2217887 Reviewed-by: Michael Lippautz Commit-Queue: Michael Lippautz Cr-Commit-Position: refs/heads/master@{#772215} --- diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h index 31e7888..2c0583f 100644 --- a/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h +++ b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h @@ -241,50 +241,52 @@ static void Trace(blink::Visitor* visitor, const KeyValuePair& self) { - TraceImpl(visitor, self); + TraceImpl::Trace(visitor, self); } private: - template - static void TraceImpl(blink::Visitor* visitor, - const KeyValuePair& self); - - // Strongification of ephemerons, i.e., Weak/Strong and Strong/Weak. - template <> - static void TraceImpl(blink::Visitor* visitor, - const KeyValuePair& self) { + struct TraceImplEphemerons { // Strongification of ephemerons, i.e., Weak/Strong and Strong/Weak. - // The helper ensures that helper.key always refers to the weak part and - // helper.value always refers to the dependent part. - // We distinguish ephemeron from Weak/Weak and Strong/Strong to allow users - // to override visitation behavior. An example is creating a heap snapshot, - // where it is useful to annotate values as being kept alive from keys - // rather than the table. - EphemeronHelper helper(&self.key, &self.value); - // Strongify the weak part. - blink::TraceCollectionIfEnabled< - kNoWeakHandling, typename EphemeronHelper::KeyType, - typename EphemeronHelper::KeyTraits>::Trace(visitor, helper.key); - // Strongify the dependent part. - visitor->TraceEphemeron( - *helper.key, helper.value, - blink::TraceCollectionIfEnabled< - kNoWeakHandling, typename EphemeronHelper::ValueType, - typename EphemeronHelper::ValueTraits>::Trace); - } + static void Trace(blink::Visitor* visitor, + const KeyValuePair& self) { + // Strongification of ephemerons, i.e., Weak/Strong and Strong/Weak. + // The helper ensures that helper.key always refers to the weak part and + // helper.value always refers to the dependent part. + // We distinguish ephemeron from Weak/Weak and Strong/Strong to allow + // users to override visitation behavior. An example is creating a heap + // snapshot, where it is useful to annotate values as being kept alive + // from keys rather than the table. + EphemeronHelper helper(&self.key, &self.value); + // Strongify the weak part. + blink::TraceCollectionIfEnabled< + kNoWeakHandling, typename EphemeronHelper::KeyType, + typename EphemeronHelper::KeyTraits>::Trace(visitor, helper.key); + // Strongify the dependent part. + visitor->TraceEphemeron( + *helper.key, helper.value, + blink::TraceCollectionIfEnabled< + kNoWeakHandling, typename EphemeronHelper::ValueType, + typename EphemeronHelper::ValueTraits>::Trace); + } + }; - template <> - static void TraceImpl(blink::Visitor* visitor, - const KeyValuePair& self) { - // Strongification of non-ephemeron KVP, i.e., Strong/Strong or Weak/Weak. - // Order does not matter here. - blink::TraceCollectionIfEnabled< - kNoWeakHandling, Key, typename Traits::KeyTraits>::Trace(visitor, - &self.key); - blink::TraceCollectionIfEnabled< - kNoWeakHandling, Value, - typename Traits::ValueTraits>::Trace(visitor, &self.value); - } + struct TraceImplDefault { + static void Trace(blink::Visitor* visitor, + const KeyValuePair& self) { + // Strongification of non-ephemeron KVP, i.e., Strong/Strong or Weak/Weak. + // Order does not matter here. + blink::TraceCollectionIfEnabled< + kNoWeakHandling, Key, typename Traits::KeyTraits>::Trace(visitor, + &self.key); + blink::TraceCollectionIfEnabled< + kNoWeakHandling, Value, + typename Traits::ValueTraits>::Trace(visitor, &self.value); + } + }; + + using TraceImpl = typename std::conditional::type; }; template