revert: re PR libstdc++/42832 (Revisit std::function for aliasing issues and efficiency)
Revert: PR libstdc++/42832 * include/std/functional (function<>::swap): Perform bytewise swap of _M_functor. * include/tr1/functional (function<>::swap): Likewise. From-SVN: r159940
This commit is contained in:
parent
6ab4e49cf0
commit
fb9c3174c9
|
@ -1,3 +1,11 @@
|
||||||
|
2010-05-27 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
Revert:
|
||||||
|
PR libstdc++/42832
|
||||||
|
* include/std/functional (function<>::swap): Perform bytewise
|
||||||
|
swap of _M_functor.
|
||||||
|
* include/tr1/functional (function<>::swap): Likewise.
|
||||||
|
|
||||||
2010-05-27 Paolo Carlini <paolo.carlini@oracle.com>
|
2010-05-27 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR libstdc++/40497
|
PR libstdc++/40497
|
||||||
|
|
|
@ -1948,16 +1948,9 @@ namespace std
|
||||||
*/
|
*/
|
||||||
void swap(function& __x)
|
void swap(function& __x)
|
||||||
{
|
{
|
||||||
/* We cannot perform direct assignments of the _M_functor
|
_Any_data __old_functor = _M_functor;
|
||||||
parts as they are of type _Any_data and have a different
|
_M_functor = __x._M_functor;
|
||||||
dynamic type. Doing so would violate type-based aliasing
|
__x._M_functor = __old_functor;
|
||||||
rules and lead to spurious miscompilations.
|
|
||||||
Instead perform a bytewise exchange of the memory of
|
|
||||||
both POD objects.
|
|
||||||
??? A wordwise exchange honoring alignment of _M_functor
|
|
||||||
would be more efficient. See PR42845. */
|
|
||||||
for (unsigned i = 0; i < sizeof (_M_functor._M_pod_data); ++i)
|
|
||||||
std::swap (_M_functor._M_pod_data[i], __x._M_functor._M_pod_data[i]);
|
|
||||||
_Manager_type __old_manager = _M_manager;
|
_Manager_type __old_manager = _M_manager;
|
||||||
_M_manager = __x._M_manager;
|
_M_manager = __x._M_manager;
|
||||||
__x._M_manager = __old_manager;
|
__x._M_manager = __old_manager;
|
||||||
|
|
|
@ -1907,16 +1907,9 @@ namespace tr1
|
||||||
*/
|
*/
|
||||||
void swap(function& __x)
|
void swap(function& __x)
|
||||||
{
|
{
|
||||||
/* We cannot perform direct assignments of the _M_functor
|
_Any_data __old_functor = _M_functor;
|
||||||
parts as they are of type _Any_data and have a different
|
_M_functor = __x._M_functor;
|
||||||
dynamic type. Doing so would violate type-based aliasing
|
__x._M_functor = __old_functor;
|
||||||
rules and lead to spurious miscompilations.
|
|
||||||
Instead perform a bytewise exchange of the memory of
|
|
||||||
both POD objects.
|
|
||||||
??? A wordwise exchange honoring alignment of _M_functor
|
|
||||||
would be more efficient. See PR42845. */
|
|
||||||
for (unsigned i = 0; i < sizeof (_M_functor._M_pod_data); ++i)
|
|
||||||
std::swap (_M_functor._M_pod_data[i], __x._M_functor._M_pod_data[i]);
|
|
||||||
_Manager_type __old_manager = _M_manager;
|
_Manager_type __old_manager = _M_manager;
|
||||||
_M_manager = __x._M_manager;
|
_M_manager = __x._M_manager;
|
||||||
__x._M_manager = __old_manager;
|
__x._M_manager = __old_manager;
|
||||||
|
|
Loading…
Reference in New Issue