fixes bug 311456 "Calling Truncate() on an nsAutoString makes next append work hard and doesn't clear F_VOIDED flag" r=bzbarsky

This commit is contained in:
darin%meer.net 2006-02-04 00:42:18 +00:00
Родитель fd42b81b2d
Коммит e2bb3bb1e7
2 изменённых файлов: 73 добавлений и 1 удалений

Просмотреть файл

@ -79,8 +79,10 @@ nsTSubstring_CharT::MutatePrep( size_type capacity, char_type** oldData, PRUint3
if (curCapacity != size_type(-1))
{
if (capacity <= curCapacity)
if (capacity <= curCapacity) {
mFlags &= ~F_VOIDED; // mutation clears voided flag
return PR_TRUE;
}
if (curCapacity > 0)
{
@ -119,6 +121,7 @@ nsTSubstring_CharT::MutatePrep( size_type capacity, char_type** oldData, PRUint3
hdr = newHdr;
mData = (char_type*) hdr->Data();
mFlags &= ~F_VOIDED; // mutation clears voided flag
return PR_TRUE;
}
}
@ -562,6 +565,11 @@ nsTSubstring_CharT::SetCapacity( size_type capacity )
void
nsTSubstring_CharT::SetLength( size_type length )
{
if (mLength == length) {
mFlags &= ~F_VOIDED; // mutation clears voided flag
return;
}
SetCapacity(length);
// XXX(darin): SetCapacity may fail, but it doesn't give us a way to find

Просмотреть файл

@ -613,6 +613,68 @@ PRBool test_stringbuffer()
return rv;
}
PRBool test_voided()
{
const char kData[] = "hello world";
nsXPIDLCString str;
if (str)
return PR_FALSE;
if (!str.IsVoid())
return PR_FALSE;
if (!str.IsEmpty())
return PR_FALSE;
str.Assign(kData);
if (strcmp(str, kData) != 0)
return PR_FALSE;
str.SetIsVoid(PR_TRUE);
if (str)
return PR_FALSE;
if (!str.IsVoid())
return PR_FALSE;
if (!str.IsEmpty())
return PR_FALSE;
str.SetIsVoid(PR_FALSE);
if (strcmp(str, "") != 0)
return PR_FALSE;
return PR_TRUE;
}
PRBool test_voided_autostr()
{
const char kData[] = "hello world";
nsCAutoString str;
if (str.IsVoid())
return PR_FALSE;
if (!str.IsEmpty())
return PR_FALSE;
str.Assign(kData);
if (strcmp(str.get(), kData) != 0)
return PR_FALSE;
str.SetIsVoid(PR_TRUE);
if (!str.IsVoid())
return PR_FALSE;
if (!str.IsEmpty())
return PR_FALSE;
str.Assign(kData);
if (str.IsVoid())
return PR_FALSE;
if (str.IsEmpty())
return PR_FALSE;
if (strcmp(str.get(), kData) != 0)
return PR_FALSE;
return PR_TRUE;
}
//----
typedef PRBool (*TestFunc)();
@ -651,6 +713,8 @@ tests[] =
{ "test_findcharinset", test_findcharinset },
{ "test_rfindcharinset", test_rfindcharinset },
{ "test_stringbuffer", test_stringbuffer },
{ "test_voided", test_voided },
{ "test_voided_autostr", test_voided_autostr },
{ nsnull, nsnull }
};