ENH: Exception safe link interface computation

This fixes cmTarget::GetLinkInterface to compute and return the link
interface in an exception-safe manner.  We manage the link interface
returned by cmTarget::ComputeLinkInterface using auto_ptr.
This commit is contained in:
Brad King 2009-07-06 16:24:32 -04:00
parent 2b85fcdd7d
commit 82a8c6b0c7
2 changed files with 14 additions and 8 deletions

View File

@ -3696,19 +3696,22 @@ cmTargetLinkInterface const* cmTarget::GetLinkInterface(const char* config)
if(i == this->LinkInterface.end()) if(i == this->LinkInterface.end())
{ {
// Compute the link interface for this configuration. // Compute the link interface for this configuration.
cmTargetLinkInterface* iface = this->ComputeLinkInterface(config); cmsys::auto_ptr<cmTargetLinkInterface>
iface(this->ComputeLinkInterface(config));
// Store the information for this configuration. // Store the information for this configuration.
std::map<cmStdString, cmTargetLinkInterface*>::value_type std::map<cmStdString, cmTargetLinkInterface*>::value_type
entry(config?config:"", iface); entry(config?config:"", 0);
i = this->LinkInterface.insert(entry).first; i = this->LinkInterface.insert(entry).first;
i->second = iface.release();
} }
return i->second; return i->second;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
cmTargetLinkInterface* cmTarget::ComputeLinkInterface(const char* config) cmsys::auto_ptr<cmTargetLinkInterface>
cmTarget::ComputeLinkInterface(const char* config)
{ {
// Construct the property name suffix for this configuration. // Construct the property name suffix for this configuration.
std::string suffix = "_"; std::string suffix = "_";
@ -3739,14 +3742,14 @@ cmTargetLinkInterface* cmTarget::ComputeLinkInterface(const char* config)
// If still not set, there is no link interface. // If still not set, there is no link interface.
if(!libs) if(!libs)
{ {
return 0; return cmsys::auto_ptr<cmTargetLinkInterface>();
} }
// Allocate the interface. // Allocate the interface.
cmTargetLinkInterface* iface = new cmTargetLinkInterface; cmsys::auto_ptr<cmTargetLinkInterface> iface(new cmTargetLinkInterface);
if(!iface) if(!iface.get())
{ {
return 0; return cmsys::auto_ptr<cmTargetLinkInterface>();
} }
// Expand the list of libraries in the interface. // Expand the list of libraries in the interface.

View File

@ -21,6 +21,8 @@
#include "cmPropertyMap.h" #include "cmPropertyMap.h"
#include "cmPolicies.h" #include "cmPolicies.h"
#include <cmsys/auto_ptr.hxx>
class cmake; class cmake;
class cmMakefile; class cmMakefile;
class cmSourceFile; class cmSourceFile;
@ -533,7 +535,8 @@ private:
cmTargetLinkInformationMap LinkInformation; cmTargetLinkInformationMap LinkInformation;
// Link interface. // Link interface.
cmTargetLinkInterface* ComputeLinkInterface(const char* config); cmsys::auto_ptr<cmTargetLinkInterface>
ComputeLinkInterface(const char* config);
cmTargetLinkInterfaceMap LinkInterface; cmTargetLinkInterfaceMap LinkInterface;
// The cmMakefile instance that owns this target. This should // The cmMakefile instance that owns this target. This should