From 5a885782491538abe81ff242dd08f7d9f594967f Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Tue, 16 Nov 2004 06:41:05 +0000 Subject: [PATCH] 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 --- lib/Bytecode/Reader/ReaderWrappers.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/Bytecode/Reader/ReaderWrappers.cpp b/lib/Bytecode/Reader/ReaderWrappers.cpp index 7cdcf64de1e..c8958ad19c3 100644 --- a/lib/Bytecode/Reader/ReaderWrappers.cpp +++ b/lib/Bytecode/Reader/ReaderWrappers.cpp @@ -377,13 +377,12 @@ bool llvm::GetBytecodeSymbols(const sys::Path& fName, std::auto_ptr 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& symbols) { + const std::string& ModuleID, + std::vector& 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; }