From deb0813166f3fcb72c742f76e3c7228f23568bf1 Mon Sep 17 00:00:00 2001 From: Leszek Swirski Date: Tue, 12 Jan 2021 15:09:08 +0100 Subject: [PATCH] [heap] Add proper rebind support to StrongRootBlockAllocator MSVC's STL in debug mode rebinds the allocator passed to vectors to allocate helper structures, so we need StrongRootBlockAllocator to have proper rebind support rather than assuming it always rebinds to Address. Bug: v8:11241 Change-Id: I15688e43fe2c71ec4ff0c287a03e36ca57427417 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2622915 Auto-Submit: Leszek Swirski Reviewed-by: Ulan Degenbaev Commit-Queue: Leszek Swirski Cr-Commit-Position: refs/heads/master@{#72060} --- src/heap/heap.h | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/heap/heap.h b/src/heap/heap.h index 24b92e8bc8..a636c5d8c4 100644 --- a/src/heap/heap.h +++ b/src/heap/heap.h @@ -2649,10 +2649,7 @@ class StrongRootBlockAllocator { using size_type = size_t; using difference_type = ptrdiff_t; template - struct rebind { - STATIC_ASSERT((std::is_same::value)); - using other = StrongRootBlockAllocator; - }; + struct rebind; explicit StrongRootBlockAllocator(Heap* heap) : heap_(heap) {} @@ -2663,6 +2660,23 @@ class StrongRootBlockAllocator { Heap* heap_; }; +// Rebinding to Address gives another StrongRootBlockAllocator. +template <> +struct StrongRootBlockAllocator::rebind
{ + using other = StrongRootBlockAllocator; +}; + +// Rebinding to something other than Address gives a std::allocator that +// is copy-constructable from StrongRootBlockAllocator. +template +struct StrongRootBlockAllocator::rebind { + class other : public std::allocator { + public: + // NOLINTNEXTLINE + other(const StrongRootBlockAllocator&) {} + }; +}; + } // namespace internal } // namespace v8