mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-17 03:03:23 +02:00
improved SOO swap, fixed Darwin-clang build config
This commit is contained in:
@@ -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
|
||||
|
@@ -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();
|
||||
construct(other);
|
||||
other = tmp;
|
||||
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;
|
||||
|
||||
|
||||
|
@@ -668,9 +668,17 @@ inline void Var::swap(Var& other)
|
||||
else
|
||||
{
|
||||
Var tmp(*this);
|
||||
if (_placeholder.isLocal()) destruct();
|
||||
construct(other);
|
||||
other = tmp;
|
||||
try
|
||||
{
|
||||
if (_placeholder.isLocal()) destruct();
|
||||
construct(other);
|
||||
other = tmp;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
construct(tmp);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user