diff options
-rw-r--r-- | include/clang/Analysis/Support/BumpVector.h | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/include/clang/Analysis/Support/BumpVector.h b/include/clang/Analysis/Support/BumpVector.h index 243332fec0..a5e11a1006 100644 --- a/include/clang/Analysis/Support/BumpVector.h +++ b/include/clang/Analysis/Support/BumpVector.h @@ -21,14 +21,29 @@ #include "llvm/Support/type_traits.h" #include "llvm/Support/Allocator.h" +#include "llvm/ADT/PointerIntPair.h" #include <algorithm> namespace clang { class BumpVectorContext { - llvm::BumpPtrAllocator Alloc; + llvm::PointerIntPair<llvm::BumpPtrAllocator*, 1, bool> Alloc; public: - llvm::BumpPtrAllocator &getAllocator() { return Alloc; } + /// Construct a new BumpVectorContext that creates a new BumpPtrAllocator + /// and destroys it when the BumpVectorContext object is destroyed. + BumpVectorContext() : Alloc(new llvm::BumpPtrAllocator(), true) {} + + /// Construct a new BumpVectorContext that reuses an existing + /// BumpPtrAllocator. This BumpPtrAllocator is not destroyed when the + /// BumpVectorContext object is destroyed. + BumpVectorContext(llvm::BumpPtrAllocator &A) : Alloc(&A, false) {} + + ~BumpVectorContext() { + if (Alloc.getInt()) + delete Alloc.getPointer(); + } + + llvm::BumpPtrAllocator &getAllocator() { return *Alloc.getPointer(); } }; template<typename T> |