Introduce another Reset() method in BumpPtrAllocator that calls a destructor
[oota-llvm.git] / lib / Support / Allocator.cpp
index 31b45c8d4aae77538940f8f1b9e948f7f2726e23..7433247c23796de3b94198bd19640654f89280b7 100644 (file)
@@ -78,6 +78,21 @@ void BumpPtrAllocator::Reset() {
   End = ((char*)CurSlab) + CurSlab->Size;
 }
 
+void BumpPtrAllocator::Reset(size_t Size, size_t Alignment, DTorFunction DTor) {
+  if (Alignment == 0) Alignment = 1;
+  MemSlab *Slab = CurSlab;
+  while (Slab) {
+    char *End = Slab == CurSlab ? CurPtr : (char*)Slab + Slab->Size;
+    for (char *Ptr = (char*)Slab+1; Ptr < End; Ptr += Size) {
+       Ptr = AlignPtr(Ptr, Alignment);
+       if (Ptr + Size <= End)
+           DTor(Ptr);
+    }
+    Slab = Slab->NextPtr;
+  }
+  Reset();
+}
+
 /// Allocate - Allocate space at the specified alignment.
 ///
 void *BumpPtrAllocator::Allocate(size_t Size, size_t Alignment) {