* _Realloc() did not initialize the reference count either.
* _Alloc() can now preserve the original reference count, only _Clone() still initializes it to 1. As Karsten pointed out, this is necessary to preserve the "shareable" status of the private data. * I hope that's finally it. What happened to our testing suite, anyway? :-) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24355 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -221,7 +221,7 @@ private:
|
|||||||
|
|
||||||
// Management
|
// Management
|
||||||
status_t _Detach();
|
status_t _Detach();
|
||||||
char* _Alloc(int32 length);
|
char* _Alloc(int32 length, bool adoptReferenceCount = true);
|
||||||
char* _Realloc(int32 length);
|
char* _Realloc(int32 length);
|
||||||
void _Init(const char* src, int32 length);
|
void _Init(const char* src, int32 length);
|
||||||
char* _Clone(const char* data, int32 length);
|
char* _Clone(const char* data, int32 length);
|
||||||
|
|||||||
@@ -1679,7 +1679,7 @@ BString::_Detach()
|
|||||||
|
|
||||||
|
|
||||||
char*
|
char*
|
||||||
BString::_Alloc(int32 length)
|
BString::_Alloc(int32 length, bool adoptReferenceCount)
|
||||||
{
|
{
|
||||||
if (length < 0)
|
if (length < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1692,7 +1692,11 @@ BString::_Alloc(int32 length)
|
|||||||
newData[length] = '\0';
|
newData[length] = '\0';
|
||||||
|
|
||||||
// initialize reference count & length
|
// 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;
|
*(((int32*)newData) - 1) = length & 0x7fffffff;
|
||||||
|
|
||||||
return newData;
|
return newData;
|
||||||
@@ -1711,12 +1715,15 @@ BString::_Realloc(int32 length)
|
|||||||
|
|
||||||
dataPtr = (char*)realloc(dataPtr, length + kPrivateDataOffset + 1);
|
dataPtr = (char*)realloc(dataPtr, length + kPrivateDataOffset + 1);
|
||||||
if (dataPtr) {
|
if (dataPtr) {
|
||||||
|
int32 oldReferenceCount = _ReferenceCount();
|
||||||
|
|
||||||
dataPtr += kPrivateDataOffset;
|
dataPtr += kPrivateDataOffset;
|
||||||
|
|
||||||
fPrivateData = dataPtr;
|
fPrivateData = dataPtr;
|
||||||
fPrivateData[length] = '\0';
|
fPrivateData[length] = '\0';
|
||||||
|
|
||||||
_SetLength(length);
|
_SetLength(length);
|
||||||
|
_ReferenceCount() = oldReferenceCount;
|
||||||
}
|
}
|
||||||
return dataPtr;
|
return dataPtr;
|
||||||
}
|
}
|
||||||
@@ -1734,7 +1741,7 @@ BString::_Init(const char* src, int32 length)
|
|||||||
char*
|
char*
|
||||||
BString::_Clone(const char* data, int32 length)
|
BString::_Clone(const char* data, int32 length)
|
||||||
{
|
{
|
||||||
char* newData = _Alloc(length);
|
char* newData = _Alloc(length, false);
|
||||||
if (newData == NULL)
|
if (newData == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user