Per code review:\
authorReid Spencer <rspencer@reidspencer.com>
Tue, 16 Nov 2004 06:41:05 +0000 (06:41 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Tue, 16 Nov 2004 06:41:05 +0000 (06:41 +0000)
* Get rid of memory leaks on exception \
* Provide better comments of how the memory handling works

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

lib/Bytecode/Reader/ReaderWrappers.cpp

index 7cdcf64de1ebee16bb6bd8e39109061f5586eee4..c8958ad19c301e6b9aaf7a5269e8972d17d7b88d 100644 (file)
@@ -377,13 +377,12 @@ bool llvm::GetBytecodeSymbols(const sys::Path& fName,
     std::auto_ptr<ModuleProvider> AMP( getBytecodeModuleProvider(fName.get()));
 
     // Get the module from the provider
-    Module* M = AMP->releaseModule();
+    Module* M = AMP->materializeModule();
 
     // Get the symbols
     getSymbols(M, symbols);
 
     // Done with the module
-    delete M;
     return true;
 
   } catch (...) {
@@ -393,12 +392,13 @@ bool llvm::GetBytecodeSymbols(const sys::Path& fName,
 
 ModuleProvider* 
 llvm::GetBytecodeSymbols(const unsigned char*Buffer, unsigned Length,
-                              const std::string& ModuleID,
-                              std::vector<std::string>& symbols) {
+                         const std::string& ModuleID,
+                         std::vector<std::string>& symbols) {
 
+  ModuleProvider* MP = 0;
   try {
-    ModuleProvider* MP = 
-      getBytecodeBufferModuleProvider(Buffer, Length, ModuleID);
+    // Get the module provider
+    MP = getBytecodeBufferModuleProvider(Buffer, Length, ModuleID);
 
     // Get the module from the provider
     Module* M = MP->materializeModule();
@@ -406,11 +406,15 @@ llvm::GetBytecodeSymbols(const unsigned char*Buffer, unsigned Length,
     // Get the symbols
     getSymbols(M, symbols);
 
-    // Done with the module
+    // Done with the module. Note that ModuleProvider will delete the
+    // Module when it is deleted. Also note that its the caller's responsibility
+    // to delete the ModuleProvider.
     return MP;
 
   } catch (...) {
-    // Fall through
+    // We only delete the ModuleProvider here because its destructor will
+    // also delete the Module (we used materializeModule not releaseModule).
+    delete MP;
   }
   return 0;
 }