From 248cb27e64b3a25230f53fc2f4ab9d483facc5f9 Mon Sep 17 00:00:00 2001 From: tsepez Date: Wed, 7 Dec 2016 16:01:54 -0800 Subject: Remove CFX_FormatString::Release() Avoid the |delete this| anti-pattern. Remove some checks which don't avoid other segvs anyways. Review-Url: https://codereview.chromium.org/2557173002 --- xfa/fgas/localization/fgas_localeimp.h | 5 +-- xfa/fxfa/parser/xfa_localevalue.cpp | 74 ++++++++++++++-------------------- 2 files changed, 31 insertions(+), 48 deletions(-) diff --git a/xfa/fgas/localization/fgas_localeimp.h b/xfa/fgas/localization/fgas_localeimp.h index 66f1767c5c..7389158798 100644 --- a/xfa/fgas/localization/fgas_localeimp.h +++ b/xfa/fgas/localization/fgas_localeimp.h @@ -14,8 +14,7 @@ class CFX_LCNumeric; class CFX_FormatString { public: CFX_FormatString(IFX_LocaleMgr* pLocaleMgr, bool bUseLCID); - - void Release() { delete this; } + ~CFX_FormatString(); void SplitFormatString(const CFX_WideString& wsFormatString, CFX_WideStringArray& wsPatterns); @@ -62,8 +61,6 @@ class CFX_FormatString { bool FormatNull(const CFX_WideString& wsPattern, CFX_WideString& wsOutput); protected: - ~CFX_FormatString(); - IFX_Locale* GetTextFormat(const CFX_WideString& wsPattern, const CFX_WideStringC& wsCategory, CFX_WideString& wsPurgePattern); diff --git a/xfa/fxfa/parser/xfa_localevalue.cpp b/xfa/fxfa/parser/xfa_localevalue.cpp index b662121230..c060fe8166 100644 --- a/xfa/fxfa/parser/xfa_localevalue.cpp +++ b/xfa/fxfa/parser/xfa_localevalue.cpp @@ -7,6 +7,7 @@ #include "xfa/fxfa/parser/xfa_localevalue.h" #include "core/fxcrt/fx_ext.h" +#include "third_party/base/ptr_util.h" #include "xfa/fgas/localization/fgas_localeimp.h" #include "xfa/fxfa/parser/cxfa_document.h" #include "xfa/fxfa/parser/xfa_localemgr.h" @@ -93,21 +94,20 @@ static FX_LOCALECATEGORY XFA_ValugeCategory(FX_LOCALECATEGORY eCategory, } return eCategory; } + bool CXFA_LocaleValue::ValidateValue(const CFX_WideString& wsValue, const CFX_WideString& wsPattern, IFX_Locale* pLocale, CFX_WideString* pMatchFormat) { CFX_WideString wsOutput; IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); - if (pLocale) { + if (pLocale) m_pLocaleMgr->SetDefLocale(pLocale); - } - CFX_FormatString* pFormat = nullptr; - if (m_pLocaleMgr) - pFormat = new CFX_FormatString(m_pLocaleMgr, false); + auto pFormat = pdfium::MakeUnique(m_pLocaleMgr, false); CFX_WideStringArray wsPatterns; pFormat->SplitFormatString(wsPattern, wsPatterns); + bool bRet = false; int32_t iCount = wsPatterns.GetSize(); int32_t i = 0; @@ -181,15 +181,15 @@ bool CXFA_LocaleValue::ValidateValue(const CFX_WideString& wsValue, break; } } - if (bRet && pMatchFormat) { + if (bRet && pMatchFormat) *pMatchFormat = wsPatterns[i - 1]; - } - pFormat->Release(); - if (pLocale) { + + if (pLocale) m_pLocaleMgr->SetDefLocale(locale); - } + return bRet; } + CFX_WideString CXFA_LocaleValue::GetValue() const { return m_wsValue; } @@ -458,44 +458,34 @@ bool CXFA_LocaleValue::SetDateTime(const CFX_WideString& wsDateTime, m_dwType = XFA_VT_DATETIME; return m_bValid = ParsePatternValue(wsDateTime, wsFormat, pLocale); } + bool CXFA_LocaleValue::FormatPatterns(CFX_WideString& wsResult, const CFX_WideString& wsFormat, IFX_Locale* pLocale, XFA_VALUEPICTURE eValueType) const { - wsResult.clear(); - bool bRet = false; - - CFX_FormatString* pFormat = nullptr; - if (m_pLocaleMgr) - pFormat = new CFX_FormatString(m_pLocaleMgr, false); - + auto pFormat = pdfium::MakeUnique(m_pLocaleMgr, false); CFX_WideStringArray wsPatterns; pFormat->SplitFormatString(wsFormat, wsPatterns); + wsResult.clear(); int32_t iCount = wsPatterns.GetSize(); for (int32_t i = 0; i < iCount; i++) { - bRet = FormatSinglePattern(wsResult, wsPatterns[i], pLocale, eValueType); - if (bRet) { - break; - } + if (FormatSinglePattern(wsResult, wsPatterns[i], pLocale, eValueType)) + return true; } - pFormat->Release(); - return bRet; + return false; } + bool CXFA_LocaleValue::FormatSinglePattern(CFX_WideString& wsResult, const CFX_WideString& wsFormat, IFX_Locale* pLocale, XFA_VALUEPICTURE eValueType) const { IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); - if (pLocale) { + if (pLocale) m_pLocaleMgr->SetDefLocale(pLocale); - } + wsResult.clear(); bool bRet = false; - - CFX_FormatString* pFormat = nullptr; - if (m_pLocaleMgr) - pFormat = new CFX_FormatString(m_pLocaleMgr, false); - + auto pFormat = pdfium::MakeUnique(m_pLocaleMgr, false); FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat); eCategory = XFA_ValugeCategory(eCategory, m_dwType); switch (eCategory) { @@ -531,16 +521,16 @@ bool CXFA_LocaleValue::FormatSinglePattern(CFX_WideString& wsResult, wsResult = m_wsValue; bRet = true; } - pFormat->Release(); if (!bRet && (eCategory != FX_LOCALECATEGORY_Num || eValueType != XFA_VALUEPICTURE_Display)) { wsResult = m_wsValue; } - if (pLocale) { + if (pLocale) m_pLocaleMgr->SetDefLocale(locale); - } + return bRet; } + static bool XFA_ValueSplitDateTime(const CFX_WideString& wsDateTime, CFX_WideString& wsDate, CFX_WideString& wsTime) { @@ -799,14 +789,10 @@ bool CXFA_LocaleValue::ParsePatternValue(const CFX_WideString& wsValue, const CFX_WideString& wsPattern, IFX_Locale* pLocale) { IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); - if (pLocale) { + if (pLocale) m_pLocaleMgr->SetDefLocale(pLocale); - } - - CFX_FormatString* pFormat = nullptr; - if (m_pLocaleMgr) - pFormat = new CFX_FormatString(m_pLocaleMgr, false); + auto pFormat = pdfium::MakeUnique(m_pLocaleMgr, false); CFX_WideStringArray wsPatterns; pFormat->SplitFormatString(wsPattern, wsPatterns); bool bRet = false; @@ -875,15 +861,15 @@ bool CXFA_LocaleValue::ParsePatternValue(const CFX_WideString& wsValue, break; } } - if (!bRet) { + if (!bRet) m_wsValue = wsValue; - } - pFormat->Release(); - if (pLocale) { + + if (pLocale) m_pLocaleMgr->SetDefLocale(locale); - } + return bRet; } + void CXFA_LocaleValue::GetNumbericFormat(CFX_WideString& wsFormat, int32_t nIntLen, int32_t nDecLen, -- cgit v1.2.3