Per code review:\
* 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
diff --git a/lib/Bytecode/Reader/ReaderWrappers.cpp b/lib/Bytecode/Reader/ReaderWrappers.cpp
index 7cdcf64..c8958ad 100644
--- a/lib/Bytecode/Reader/ReaderWrappers.cpp
+++ b/lib/Bytecode/Reader/ReaderWrappers.cpp
@@ -377,13 +377,12 @@
     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 @@
 
 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 @@
     // 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;
 }