| Index: core/fxcrt/fx_basic_bstring.cpp
|
| diff --git a/core/fxcrt/fx_basic_bstring.cpp b/core/fxcrt/fx_basic_bstring.cpp
|
| index 1622c4bc55c2363bbcc84aa066c67844ad52f761..e098d8fe506c112ef8c857af09fad0630e86edb8 100644
|
| --- a/core/fxcrt/fx_basic_bstring.cpp
|
| +++ b/core/fxcrt/fx_basic_bstring.cpp
|
| @@ -276,20 +276,25 @@ void CFX_ByteString::ReleaseBuffer(FX_STRSIZE nNewLength) {
|
| if (nNewLength == -1)
|
| nNewLength = FXSYS_strlen(m_pData->m_String);
|
|
|
| + nNewLength = std::min(nNewLength, m_pData->m_nAllocLength);
|
| if (nNewLength == 0) {
|
| clear();
|
| return;
|
| }
|
|
|
| - FXSYS_assert(nNewLength <= m_pData->m_nAllocLength);
|
| - ReallocBeforeWrite(nNewLength);
|
| + FXSYS_assert(m_pData->m_nRefs == 1);
|
| m_pData->m_nDataLength = nNewLength;
|
| m_pData->m_String[nNewLength] = 0;
|
| + if (m_pData->m_nAllocLength - nNewLength >= 32) {
|
| + // Over arbitrary threshold, so pay the price to relocate. Force copy to
|
| + // always occur by holding a second reference to the string.
|
| + CFX_ByteString preserve(*this);
|
| + ReallocBeforeWrite(nNewLength);
|
| + }
|
| }
|
|
|
| void CFX_ByteString::Reserve(FX_STRSIZE len) {
|
| GetBuffer(len);
|
| - ReleaseBuffer(GetLength());
|
| }
|
|
|
| FX_CHAR* CFX_ByteString::GetBuffer(FX_STRSIZE nMinBufLength) {
|
|
|