You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2005/11/26 02:12:53 UTC

svn commit: r349056 - in /incubator/stdcxx/trunk/include: string string.cc

Author: sebor
Date: Fri Nov 25 17:12:48 2005
New Revision: 349056

URL: http://svn.apache.org/viewcvs?rev=349056&view=rev
Log:
2005-11-25  Martin Sebor  <se...@roguewave.com>

	STDCXX-70
	* string (basic_string): Took into account the fact that the value
	of the reference count when read unguarded may be negative (-1) on
	SPARC V8 when it's being manipulated (incremented or decremented)
	by another thread, and cast it to an unsigned type in expressions
	involving relational operators such as < and <=.
	(begin): Same.
	(append): Same.
	* string.cc (operator=): Same.
	(replace): Same.
	(__replace_aux): Same.

Modified:
    incubator/stdcxx/trunk/include/string
    incubator/stdcxx/trunk/include/string.cc

Modified: incubator/stdcxx/trunk/include/string
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/include/string?rev=349056&r1=349055&r2=349056&view=diff
==============================================================================
--- incubator/stdcxx/trunk/include/string (original)
+++ incubator/stdcxx/trunk/include/string Fri Nov 25 17:12:48 2005
@@ -937,7 +937,7 @@
 basic_string (const basic_string<_CharT, _Traits, _Allocator> &__s)
     : allocator_type (__s.get_allocator ())
 {
-    if (__s._C_pref ()->_C_get_ref () > 0) {
+    if (size_type (0) < size_type (__s._C_pref ()->_C_get_ref ())) {
         _C_data = __s._C_data;
         _C_pref ()->_C_inc_ref ();
     }
@@ -956,7 +956,7 @@
 basic_string<_CharT, _Traits, _Allocator>::
 begin ()
 {
-    if (_C_pref ()->_C_get_ref () > 1)
+    if (size_type (1) < size_type (_C_pref ()->_C_get_ref ()))
         _C_clone (size ());
 
     // not thread safe: there is exactly one body pointed to by
@@ -1180,7 +1180,8 @@
 {
     const size_type __size = size () + __str.size ();
 
-    if (__size > capacity () || _C_pref ()->_C_get_ref () > 1)
+    if (   capacity () < __size
+        || size_type (1) < size_type (_C_pref ()->_C_get_ref ()))
         return append (__str, size_type (), __str.size ());
 
     traits_type::copy (_C_data + size (), __str.data (), __str.size () + 1);

Modified: incubator/stdcxx/trunk/include/string.cc
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/include/string.cc?rev=349056&r1=349055&r2=349056&view=diff
==============================================================================
--- incubator/stdcxx/trunk/include/string.cc (original)
+++ incubator/stdcxx/trunk/include/string.cc Fri Nov 25 17:12:48 2005
@@ -2,7 +2,7 @@
  *
  * string.cc - Definitions for the Standard Library string classes
  *
- * $Id: //stdlib/dev/include/string.cc#63 $
+ * $Id$
  *
  ***************************************************************************
  *
@@ -218,7 +218,8 @@
 basic_string<_CharT, _Traits, _Allocator>::
 operator= (const basic_string &__rhs)
 {
-    if (__rhs._C_pref ()->_C_get_ref () > 0) {
+    if (size_type (0) < size_type (__rhs._C_pref ()->_C_get_ref ())) {
+        // `rhs' has reference counting enabled
         __rhs._C_pref ()->_C_inc_ref ();
         _C_unlink (__rhs._C_data);
     }
@@ -356,7 +357,7 @@
 
         // check for shared representation, insufficient capacity,
         // and overlapping regions
-        if (   _C_pref ()->_C_get_ref () > 1
+        if (   size_type (1) < size_type (_C_pref ()->_C_get_ref ())
             || capacity () < __size1
             || __s >= data () && __s < data () + __size0) {
 
@@ -427,7 +428,8 @@
         const size_type __rem = __size0 - __xlen - __pos;
 
         // check for shared representation, insufficient capacity
-        if (_C_pref ()->_C_get_ref () > 1 || capacity () < __size1) {
+        if (   capacity () < __size1
+            || size_type (1) < size_type (_C_pref ()->_C_get_ref ())) {
 
             // need to allocate a new reference
             const size_type __cap = _C_grow (__size0, __size1);
@@ -621,7 +623,8 @@
       size_type __d = 0;
       size_type __rem = __s.size() - __xlen - __pos; // length of bit at the end
       // Check for shared representation, insufficient capacity, 
-      if ( (__s._C_pref()->_C_get_ref () > 1) || (__s.capacity() < __len))
+      if (   __s.capacity() < __len
+          || size_type (1) < size_type (__s._C_pref()->_C_get_ref ()))
       {
         // Need to allocate a new reference.
           const size_type __cap = __s._C_grow (__s.size (), __len);