aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorPaolo Carlini <paolo@gcc.gnu.org>2006-07-03 17:31:46 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2006-07-03 17:31:46 +0000
commit7aa6ba766c8438ca61e08d85573256d00278cc50 (patch)
tree93211a6c9a8464863e08785ae2d8e30d52fba091 /libstdc++-v3
parentcdc3c14cfc801d70b3499e21f3d5a02a85badbf4 (diff)
downloadgcc-7aa6ba766c8438ca61e08d85573256d00278cc50.zip
gcc-7aa6ba766c8438ca61e08d85573256d00278cc50.tar.gz
gcc-7aa6ba766c8438ca61e08d85573256d00278cc50.tar.bz2
[multiple changes]
2006-07-03 Ian Lance Taylor <ian@airs.com> Paolo Carlini <pcarlini@suse.de> * include/ext/rc_string_base.h (__rc_string_base::_S_max_size): Increase by a factor of two. * include/ext/sso_string_base.h (__sso_string_base::_S_max_size): Likewise. 2006-07-03 Paolo Carlini <pcarlini@suse.de> * include/ext/sso_string_base.h (__sso_string_base::_M_create): Never allocate a string bigger than _S_max_size. From-SVN: r115155
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog13
-rw-r--r--libstdc++-v3/include/ext/rc_string_base.h4
-rw-r--r--libstdc++-v3/include/ext/sso_string_base.h11
3 files changed, 23 insertions, 5 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 67d3879..01868aa 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,16 @@
+2006-07-03 Ian Lance Taylor <ian@airs.com>
+ Paolo Carlini <pcarlini@suse.de>
+
+ * include/ext/rc_string_base.h (__rc_string_base::_S_max_size):
+ Increase by a factor of two.
+ * include/ext/sso_string_base.h (__sso_string_base::_S_max_size):
+ Likewise.
+
+2006-07-03 Paolo Carlini <pcarlini@suse.de>
+
+ * include/ext/sso_string_base.h (__sso_string_base::_M_create): Never
+ allocate a string bigger than _S_max_size.
+
2006-06-29 Benjamin Kosnik <bkoz@redhat.com>
* include/Makefile.am (pch1_input, pch1_output_builddir,
diff --git a/libstdc++-v3/include/ext/rc_string_base.h b/libstdc++-v3/include/ext/rc_string_base.h
index c8bb9f3..9470db7 100644
--- a/libstdc++-v3/include/ext/rc_string_base.h
+++ b/libstdc++-v3/include/ext/rc_string_base.h
@@ -177,9 +177,9 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
// npos = sizeof(_Rep) + (m * sizeof(_CharT)) + sizeof(_CharT)
// Solving for m:
// m = ((npos - sizeof(_Rep)) / sizeof(_CharT)) - 1
- // In addition, this implementation quarters this amount.
+ // In addition, this implementation halfs this amount.
enum { _S_max_size = (((static_cast<size_type>(-1) - sizeof(_Rep))
- / sizeof(_CharT)) - 1) / 4 };
+ / sizeof(_CharT)) - 1) / 2 };
// Data Member (private):
mutable typename _Util_Base::template _Alloc_hider<_Alloc> _M_dataplus;
diff --git a/libstdc++-v3/include/ext/sso_string_base.h b/libstdc++-v3/include/ext/sso_string_base.h
index 0bf99ca..1282eb6 100644
--- a/libstdc++-v3/include/ext/sso_string_base.h
+++ b/libstdc++-v3/include/ext/sso_string_base.h
@@ -61,9 +61,9 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
// npos = m * sizeof(_CharT) + sizeof(_CharT)
// Solving for m:
// m = npos / sizeof(_CharT) - 1
- // In addition, this implementation quarters this amount.
+ // In addition, this implementation halfs this amount.
enum { _S_max_size = (((static_cast<size_type>(-1)
- / sizeof(_CharT)) - 1) / 4) };
+ / sizeof(_CharT)) - 1) / 2) };
// Data Members (private):
typename _Util_Base::template _Alloc_hider<_CharT_alloc_type>
@@ -325,7 +325,12 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
// meet amortized linear time requirements of the library: see
// http://gcc.gnu.org/ml/libstdc++/2001-07/msg00085.html.
if (__capacity > __old_capacity && __capacity < 2 * __old_capacity)
- __capacity = 2 * __old_capacity;
+ {
+ __capacity = 2 * __old_capacity;
+ // Never allocate a string bigger than _S_max_size.
+ if (__capacity > size_type(_S_max_size))
+ __capacity = size_type(_S_max_size);
+ }
// NB: Need an array of char_type[__capacity], plus a terminating
// null char_type() element.