]> granicus.if.org Git - clang/commitdiff
Moved destructor logic of templated class ExplodedGraph to non-templated
authorTed Kremenek <kremenek@apple.com>
Sun, 13 Jan 2008 05:33:04 +0000 (05:33 +0000)
committerTed Kremenek <kremenek@apple.com>
Sun, 13 Jan 2008 05:33:04 +0000 (05:33 +0000)
parent class ExplodedGraphImpl.

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

Analysis/ExplodedGraph.cpp
include/clang/Analysis/PathSensitive/ExplodedGraph.h

index 4c9f0265328e7ea4bae4c33436c6c7fd4935f70d..61548e9b27412bbaffb820c590f47c3cfa8094f5 100644 (file)
@@ -68,3 +68,20 @@ ExplodedNodeImpl** ExplodedNodeImpl::NodeGroup::end() const {
 ExplodedNodeImpl::NodeGroup::~NodeGroup() {
   if (getKind() == SizeOther) delete &getVector(getPtr());
 }
+
+
+ExplodedGraphImpl::~ExplodedGraphImpl() {
+  // Delete the FoldingSet's in Nodes.  Note that the contents
+  // of the FoldingSets are nodes allocated from the BumpPtrAllocator,
+  // so all of those will get nuked when that object is destroyed.
+  for (EdgeNodeSetMap::iterator I=Nodes.begin(), E=Nodes.end(); I!=E; ++I) {
+    llvm::FoldingSet<ExplodedNodeImpl>* ENodes = 
+      reinterpret_cast<llvm::FoldingSet<ExplodedNodeImpl>*>(I->second);
+    
+    for (llvm::FoldingSet<ExplodedNodeImpl>::iterator
+         I=ENodes->begin(), E=ENodes->end(); I!=E; ++I)
+      delete &*I;
+    
+    delete ENodes;
+  }
+}
index 347c9e6f4f9225ee90d452caecb152ba2d762bb4..1a9ec32f601b42e9b7366fa5157eaac05cd6a9b5 100644 (file)
@@ -86,6 +86,16 @@ protected:
   }
   
 public:
+  // This method is only defined so that we can cast a
+  // void* to FoldingSet<ExplodedNodeImpl> so that we can iterate
+  // over the vertices of EdgeNodeSetMap in ExplodeGraphImpl.
+  // The actual profiling of vertices will be done in the derived
+  // class, ExplodedNode<>.  Nodes will NEVER be INSERTED into the
+  // FoldingSet using this Profile method (since it doesn't do anything).
+  inline void Profile(llvm::FoldingSetNodeID& ID) const {
+    assert (false && "Needs to be implemented in derived class.");
+  }
+  
   /// getLocation - Returns the edge associated with the given node.
   const ProgramPoint& getLocation() const { return Location; }
   
@@ -227,22 +237,6 @@ protected:
   }
     
 public:
-  virtual ~ExplodedGraph() {
-    // Delete the FoldingSet's in Nodes.  Note that the contents
-    // of the FoldingSets are nodes allocated from the BumpPtrAllocator,
-    // so all of those will get nuked when that object is destroyed.
-    for (EdgeNodeSetMap::iterator I=Nodes.begin(), E=Nodes.end(); I!=E; ++I) {
-      llvm::FoldingSet<NodeTy>* ENodes = 
-        reinterpret_cast<llvm::FoldingSet<NodeTy>*>(I->second);
-      
-      for (typename llvm::FoldingSet<NodeTy>::iterator
-             I=ENodes->begin(), E=ENodes->end(); I!=E; ++I)
-        delete *I;
-      
-      delete ENodes;
-    }
-  }
-  
   /// getCheckerState - Returns the internal checker state associated
   ///  with the exploded graph.  Ownership remains with the ExplodedGraph
   ///  objecct.