Fix an issue where assignments that caused a SmallPtrSet to become non-small
authorOwen Anderson <resistor@mac.com>
Wed, 18 Jul 2007 19:54:15 +0000 (19:54 +0000)
committerOwen Anderson <resistor@mac.com>
Wed, 18 Jul 2007 19:54:15 +0000 (19:54 +0000)
would result in calling realloc() on a null pointer.  Instead, if we encounter
this situation, make a normal call to malloc().

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40014 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/SmallPtrSet.cpp

index eb33c1541b080aad31e6795ad102f90395af8a31..b2c5c42e2792521db62ed277b9630264c1405e43 100644 (file)
@@ -184,15 +184,16 @@ void SmallPtrSetImpl::CopyFrom(const SmallPtrSetImpl &RHS) {
   if (isSmall() && RHS.isSmall())
     assert(CurArraySize == RHS.CurArraySize &&
            "Cannot assign sets with different small sizes");
-  NumElements = RHS.NumElements;
-  NumTombstones = RHS.NumTombstones;
-  
+           
   // If we're becoming small, prepare to insert into our stack space
   if (RHS.isSmall())
     CurArray = &SmallArray[0];
   // Otherwise, allocate new heap space (unless we were the same size)
   else if (CurArraySize != RHS.CurArraySize) {
-    CurArray = (void**)realloc(CurArray, sizeof(void*)*(RHS.CurArraySize+1));
+    if (isSmall())
+      CurArray = (void**)malloc(sizeof(void*) * (RHS.CurArraySize+1));
+    else
+      CurArray = (void**)realloc(CurArray, sizeof(void*)*(RHS.CurArraySize+1));
     assert(CurArray && "Failed to allocate memory?");
   }
   
@@ -201,6 +202,9 @@ void SmallPtrSetImpl::CopyFrom(const SmallPtrSetImpl &RHS) {
 
   // Copy over the contents from the other set
   memcpy(CurArray, RHS.CurArray, sizeof(void*)*(CurArraySize+1));
+  
+  NumElements = RHS.NumElements;
+  NumTombstones = RHS.NumTombstones;
 }
 
 SmallPtrSetImpl::~SmallPtrSetImpl() {