aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrançois Dumont <fdumont@gcc.gnu.org>2019-07-18 21:52:35 +0000
committerFrançois Dumont <fdumont@gcc.gnu.org>2019-07-18 21:52:35 +0000
commitf48d9d19dd30bea216dd54d6875c7b3e04d0b945 (patch)
treefb7101b0d8725bb948f79af1cd05f15cbe2c8c1f
parent2737c5909faa91ef1b8e0cbf42158632c4ab597e (diff)
downloadgcc-f48d9d19dd30bea216dd54d6875c7b3e04d0b945.zip
gcc-f48d9d19dd30bea216dd54d6875c7b3e04d0b945.tar.gz
gcc-f48d9d19dd30bea216dd54d6875c7b3e04d0b945.tar.bz2
stl_tempbuf.h (__detail::__return_temporary_buffer): New.
2019-07-18 François Dumont <fdumont@gcc.gnu.org> * include/bits/stl_tempbuf.h (__detail::__return_temporary_buffer): New. (~_Temporary_buffer()): Use latter. (_Temporary_buffer(_FIterator, size_type)): Likewise. From-SVN: r273586
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/include/bits/stl_tempbuf.h51
2 files changed, 39 insertions, 18 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 16fc844..b3c2f7d 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2019-07-18 François Dumont <fdumont@gcc.gnu.org>
+
+ * include/bits/stl_tempbuf.h (__detail::__return_temporary_buffer): New.
+ (~_Temporary_buffer()): Use latter.
+ (_Temporary_buffer(_FIterator, size_type)): Likewise.
+
2019-07-17 Andreas Schwab <schwab@suse.de>
* config/abi/post/ia64-linux-gnu/baseline_symbols.txt: Update.
diff --git a/libstdc++-v3/include/bits/stl_tempbuf.h b/libstdc++-v3/include/bits/stl_tempbuf.h
index fa78ee5..d746945 100644
--- a/libstdc++-v3/include/bits/stl_tempbuf.h
+++ b/libstdc++-v3/include/bits/stl_tempbuf.h
@@ -63,6 +63,21 @@ namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
+ namespace __detail
+ {
+ template<typename _Tp>
+ inline void
+ __return_temporary_buffer(_Tp* __p,
+ size_t __len __attribute__((__unused__)))
+ {
+#if __cpp_sized_deallocation
+ ::operator delete(__p, __len);
+#else
+ ::operator delete(__p);
+#endif
+ }
+ }
+
/**
* @brief Allocates a temporary buffer.
* @param __len The number of objects of type Tp.
@@ -112,7 +127,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return_temporary_buffer(_Tp* __p)
{ ::operator delete(__p); }
-
/**
* This class is used in two places: stl_algo.h and ext/memory,
* where it is wrapped as the temporary_buffer class. See
@@ -165,7 +179,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
~_Temporary_buffer()
{
std::_Destroy(_M_buffer, _M_buffer + _M_len);
- std::return_temporary_buffer(_M_buffer);
+ std::__detail::__return_temporary_buffer(_M_buffer, _M_len);
}
private:
@@ -185,7 +199,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ucr(_Pointer __first, _Pointer __last,
_ForwardIterator __seed)
{
- if(__first == __last)
+ if (__first == __last)
return;
_Pointer __cur = __first;
@@ -244,22 +258,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_Temporary_buffer(_ForwardIterator __seed, size_type __original_len)
: _M_original_len(__original_len), _M_len(0), _M_buffer(0)
{
- __try
- {
- std::pair<pointer, size_type> __p(std::get_temporary_buffer<
- value_type>(_M_original_len));
- _M_buffer = __p.first;
- _M_len = __p.second;
- if (_M_buffer)
- std::__uninitialized_construct_buf(_M_buffer, _M_buffer + _M_len,
- __seed);
- }
- __catch(...)
+ std::pair<pointer, size_type> __p(
+ std::get_temporary_buffer<value_type>(_M_original_len));
+
+ if (__p.first)
{
- std::return_temporary_buffer(_M_buffer);
- _M_buffer = 0;
- _M_len = 0;
- __throw_exception_again;
+ __try
+ {
+ std::__uninitialized_construct_buf(__p.first, __p.first + __p.second,
+ __seed);
+ _M_buffer = __p.first;
+ _M_len = __p.second;
+ }
+ __catch(...)
+ {
+ std::__detail::__return_temporary_buffer(__p.first, __p.second);
+ __throw_exception_again;
+ }
}
}