improved SOO swap, fixed Darwin-clang build config

This commit is contained in:
Aleksandar Fabijanic
2013-03-31 16:28:53 -05:00
parent 6b871a8cab
commit 1f4afb9c6c
4 changed files with 37 additions and 16 deletions

View File

@@ -33,7 +33,7 @@ Release 1.5.2 (2013-03-??)
- fixed GH #131: no timezone global var on OpenBSD
- fixed GH #102: Some subprojects don't have x64 solutions for VS 2010
- added GH #75: Poco::Uri addQueryParameter method
- Poco::Environment::osDisplayName() now recognized Windows 8/Server 2012
- Poco::Environment::osDisplayName() now recognizes Windows 8/Server 2012
- fixed GH #140: Poco::Runnable threading cleanup issue
- simplified default TCP/HTTPServer construction
- fixed GH #141: Application::run() documentation/implementation discrepancy

View File

@@ -106,9 +106,9 @@ public:
return pHolder;
}
// MSVC71 doesn't extend friendship to nested class (Any::Holder)
#if !defined(POCO_MSVC_VERSION) || (defined(POCO_MSVC_VERSION) && (POCO_MSVC_VERSION > 71))
private:
// MSVC71,80 won't extend friendship to nested class (Any::Holder)
#if !defined(POCO_MSVC_VERSION) || (defined(POCO_MSVC_VERSION) && (POCO_MSVC_VERSION > 80))
// private:
#endif
PlaceholderT* pHolder;
@@ -165,7 +165,7 @@ public:
if(!empty())
{
if(_valueHolder.isLocal())
content()->~ValueHolder();
destruct();
else
delete content();
}
@@ -174,9 +174,9 @@ public:
Any& swap(Any& other)
/// Swaps the content of the two Anys.
///
/// When small object optimizaton is enabled,
/// swap is only exception-safe when both (*this and
/// other) objects are allocated on the heap.
/// When small object optimizaton is enabled, swap only
/// has no-throw guarantee when both (*this and other)
/// objects are allocated on the heap.
{
if (this == &other) return *this;
@@ -187,16 +187,24 @@ public:
else
{
Any tmp(*this);
if (_valueHolder.isLocal()) this->~Any();
try
{
if (_valueHolder.isLocal()) destruct();
construct(other);
other = tmp;
}
catch (...)
{
construct(tmp);
throw;
}
}
return *this;
}
template<typename ValueType>
Any & operator = (const ValueType& rhs)
Any& operator = (const ValueType& rhs)
/// Assignment operator for all types != Any.
///
/// Example:
@@ -309,6 +317,11 @@ private:
_valueHolder.erase();
}
void destruct()
{
content()->~ValueHolder();
}
Placeholder<ValueHolder> _valueHolder;

View File

@@ -668,10 +668,18 @@ inline void Var::swap(Var& other)
else
{
Var tmp(*this);
try
{
if (_placeholder.isLocal()) destruct();
construct(other);
other = tmp;
}
catch (...)
{
construct(tmp);
throw;
}
}
#endif
}

View File

@@ -33,7 +33,7 @@ LINK = $(CXX) -bind_at_load
LIB = libtool -static -o
RANLIB = ranlib
SHLIB = $(CXX) -dynamiclib -o $@
DYLIB = $(CXX) -dynamic -bundle $(RORELOCS) suppress -Wl,-bind_at_load -o $@
DYLIB = $(CXX) -dynamic -bundle $(RORELOCS) -Wl,-bind_at_load -o $@
SHLIBLN = $(POCO_BASE)/build/script/shlibln
STRIP =
DEP = $(POCO_BASE)/build/script/makedepend.clang