diff --git a/headers/os/support/String.h b/headers/os/support/String.h index 7e07178048..0d9141d2da 100644 --- a/headers/os/support/String.h +++ b/headers/os/support/String.h @@ -221,7 +221,7 @@ private: // Management status_t _Detach(); - char* _Alloc(int32 length); + char* _Alloc(int32 length, bool adoptReferenceCount = true); char* _Realloc(int32 length); void _Init(const char* src, int32 length); char* _Clone(const char* data, int32 length); diff --git a/src/kits/support/String.cpp b/src/kits/support/String.cpp index 9fac0581e1..f941f876a3 100644 --- a/src/kits/support/String.cpp +++ b/src/kits/support/String.cpp @@ -1679,7 +1679,7 @@ BString::_Detach() char* -BString::_Alloc(int32 length) +BString::_Alloc(int32 length, bool adoptReferenceCount) { if (length < 0) return NULL; @@ -1692,7 +1692,11 @@ BString::_Alloc(int32 length) newData[length] = '\0'; // initialize reference count & length - *(((vint32*)newData) - 2) = 1; + int32 referenceCount = 1; + if (adoptReferenceCount && fPrivateData != NULL) + referenceCount = _ReferenceCount(); + + *(((vint32*)newData) - 2) = referenceCount; *(((int32*)newData) - 1) = length & 0x7fffffff; return newData; @@ -1711,12 +1715,15 @@ BString::_Realloc(int32 length) dataPtr = (char*)realloc(dataPtr, length + kPrivateDataOffset + 1); if (dataPtr) { + int32 oldReferenceCount = _ReferenceCount(); + dataPtr += kPrivateDataOffset; fPrivateData = dataPtr; fPrivateData[length] = '\0'; _SetLength(length); + _ReferenceCount() = oldReferenceCount; } return dataPtr; } @@ -1734,7 +1741,7 @@ BString::_Init(const char* src, int32 length) char* BString::_Clone(const char* data, int32 length) { - char* newData = _Alloc(length); + char* newData = _Alloc(length, false); if (newData == NULL) return NULL;