Fixed serious bug in BatchReadOwnedPtrs where in a chain of calls to
authorTed Kremenek <kremenek@apple.com>
Thu, 15 Nov 2007 00:05:03 +0000 (00:05 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 15 Nov 2007 00:05:03 +0000 (00:05 +0000)
deserialize objects if BatchReadOwnedPtrs was called more than once in the
same call chain then the second call would overwrite the SerializedPtrIDs
being used by the first call. Solved this problem by making the vector that
holds the pointer IDs local to a function call. Now BatchReadOwnedPtrs is
reentrant.

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

include/llvm/Bitcode/Deserialize.h

index 68d94b773d171e651372304ad6d1b5814052e917..d0ededef9fc5ef3c735b443fec67a38147edc58b 100644 (file)
@@ -126,7 +126,6 @@ private:
   unsigned AbbrevNo;
   unsigned RecordCode;
   Location StreamStart;
-  std::vector<SerializedPtrID> BatchIDVec;
   
   //===----------------------------------------------------------===//
   // Public Interface.
@@ -213,7 +212,7 @@ public:
   
   template <typename T>
   void BatchReadOwnedPtrs(unsigned NumPtrs, T** Ptrs, bool AutoRegister=true) {
-    BatchIDVec.clear();
+    llvm::SmallVector<SerializedPtrID,10> BatchIDVec;
     
     for (unsigned i = 0; i < NumPtrs; ++i)
       BatchIDVec.push_back(ReadPtrID());
@@ -234,8 +233,8 @@ public:
   void BatchReadOwnedPtrs(unsigned NumT1Ptrs, T1** Ptrs, T2*& P2,
                           bool A1=true, bool A2=true) {
     
-    BatchIDVec.clear();
-    
+    llvm::SmallVector<SerializedPtrID,10> BatchIDVec;
+
     for (unsigned i = 0; i < NumT1Ptrs; ++i)
       BatchIDVec.push_back(ReadPtrID());
     
@@ -261,7 +260,7 @@ public:
                           T2*& P2, T3*& P3,
                           bool A1=true, bool A2=true, bool A3=true) {
     
-    BatchIDVec.clear();
+    llvm::SmallVector<SerializedPtrID,10> BatchIDVec;
     
     for (unsigned i = 0; i < NumT1Ptrs; ++i)
       BatchIDVec.push_back(ReadPtrID());