[multiple changes]
authorPaolo Carlini <paolo@gcc.gnu.org>
Mon, 3 Jul 2006 17:31:46 +0000 (17:31 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 3 Jul 2006 17:31:46 +0000 (17:31 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/rc_string_base.h
libstdc++-v3/include/ext/sso_string_base.h

index 67d3879c833ed9c4795e8ff322f8bf715fd79cde..01868aaabcbe9aa314f2289e834518639c43e094 100644 (file)
@@ -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,
index c8bb9f3edcaed86880eb8445e981cd06e66440a2..9470db74fe34ac1937d653af7a4831d78866f1c4 100644 (file)
@@ -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;
index 0bf99cad53f4b3d81b78f7ceadb85a75194217ba..1282eb6e53e996bf05e697fcf61751ec7668935a 100644 (file)
@@ -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.