Fix llvm::BumpPtrAllocatorImpl::Reset()

BumpPtrAllocator's Reset wouldn't clear CustomSizedSlabs if Slabs.size() == 0.

Patch by Kal <b17c0de@gmail.com>!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237588 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Hans Wennborg 2015-05-18 16:54:17 +00:00
parent 0b9ee775f5
commit febe7813c8
2 changed files with 10 additions and 2 deletions

View File

@ -187,6 +187,9 @@ public:
/// \brief Deallocate all but the current slab and reset the current pointer
/// to the beginning of it, freeing all memory allocated so far.
void Reset() {
DeallocateCustomSizedSlabs();
CustomSizedSlabs.clear();
if (Slabs.empty())
return;
@ -198,8 +201,6 @@ public:
// Deallocate all but the first slab, and deallocate all custom-sized slabs.
DeallocateSlabs(std::next(Slabs.begin()), Slabs.end());
Slabs.erase(std::next(Slabs.begin()), Slabs.end());
DeallocateCustomSizedSlabs();
CustomSizedSlabs.clear();
}
/// \brief Allocate space at the specified alignment.

View File

@ -61,6 +61,13 @@ TEST(AllocatorTest, ThreeSlabs) {
// again.
TEST(AllocatorTest, TestReset) {
BumpPtrAllocator Alloc;
// Allocate something larger than the SizeThreshold=4096.
(void)Alloc.Allocate(5000, 1);
Alloc.Reset();
// Calling Reset should free all CustomSizedSlabs.
EXPECT_EQ(0u, Alloc.GetNumSlabs());
Alloc.Allocate(3000, 1);
EXPECT_EQ(1U, Alloc.GetNumSlabs());
Alloc.Allocate(3000, 1);