diff options
Diffstat (limited to 'core/fxcrt/fx_basic_bstring.cpp')
-rw-r--r-- | core/fxcrt/fx_basic_bstring.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/core/fxcrt/fx_basic_bstring.cpp b/core/fxcrt/fx_basic_bstring.cpp index 1622c4bc55..e098d8fe50 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) { |