diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2018-09-18 15:02:33 +0200 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2018-10-10 13:00:07 +0200 |
commit | caf0595f05c0b9199c28c96415878ffc22cb05ec (patch) | |
tree | faf669768e82f30d30899ec9e750ec37f4a67c82 /sc | |
parent | 16e417b8c211a919a921baeb65660185aac38393 (diff) |
do not needlessly create ScTokenArray copies in Calc input filters
It doesn't make much sense to keep around one ScTokenArray, pass
it around, use a copy of it and then Clear() the original.
Change-Id: I8636b32dc9b547b4b649c8d811c8425530896100
Reviewed-on: https://gerrit.libreoffice.org/60863
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'sc')
25 files changed, 104 insertions, 107 deletions
diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx index 57038e36bd2d..7a2f80ef5fbc 100644 --- a/sc/source/filter/excel/excform.cxx +++ b/sc/source/filter/excel/excform.cxx @@ -107,7 +107,7 @@ void ImportExcel::Formula( return; // Formula will be read next, length in nFormLen - const ScTokenArray* pResult = nullptr; + std::unique_ptr<ScTokenArray> pResult; pFormConv->Reset( aScPos ); ScDocumentImport& rDoc = GetDocImport(); @@ -157,7 +157,7 @@ void ImportExcel::Formula( if (pResult) { - pCell = new ScFormulaCell(&rDoc.getDoc(), aScPos, *pResult); + pCell = new ScFormulaCell(&rDoc.getDoc(), aScPos, pResult.release()); pCell->GetCode()->WrapReference(aScPos, EXC_MAXCOL8, EXC_MAXROW8); rDoc.getDoc().CheckLinkFormulaNeedingCheck( *pCell->GetCode()); rDoc.getDoc().EnsureTable(aScPos.Tab()); @@ -196,17 +196,17 @@ ExcelToSc::~ExcelToSc() { } -void ExcelToSc::GetDummy( const ScTokenArray*& pResult ) +std::unique_ptr<ScTokenArray> ExcelToSc::GetDummy() { aPool.Store( OUString("Dummy()") ); aPool >> aStack; - pResult = aPool[ aStack.Get() ]; + return aPool.GetTokenArray( aStack.Get()); } // if bAllowArrays is false stream seeks to first byte after <nFormulaLen> // otherwise it will seek to the first byte after the additional content (eg // inline arrays) following <nFormulaLen> -ConvErr ExcelToSc::Convert( const ScTokenArray*& pResult, XclImpStream& aIn, std::size_t nFormulaLen, bool bAllowArrays, const FORMULA_TYPE eFT ) +ConvErr ExcelToSc::Convert( std::unique_ptr<ScTokenArray>& pResult, XclImpStream& aIn, std::size_t nFormulaLen, bool bAllowArrays, const FORMULA_TYPE eFT ) { RootData& rR = GetOldRoot(); sal_uInt8 nOp, nLen; @@ -232,7 +232,7 @@ ConvErr ExcelToSc::Convert( const ScTokenArray*& pResult, XclImpStream& aIn, std { aPool.Store( OUString("-/-") ); aPool >> aStack; - pResult = aPool[ aStack.Get() ]; + pResult = aPool.GetTokenArray( aStack.Get()); return ConvErr::OK; } @@ -870,14 +870,14 @@ ConvErr ExcelToSc::Convert( const ScTokenArray*& pResult, XclImpStream& aIn, std { aPool << ocBad; aPool >> aStack; - pResult = aPool[ aStack.Get() ]; + pResult = aPool.GetTokenArray( aStack.Get()); eRet = ConvErr::Ni; } else if( aIn.GetRecPos() != nEndPos ) { aPool << ocBad; aPool >> aStack; - pResult = aPool[ aStack.Get() ]; + pResult = aPool.GetTokenArray( aStack.Get()); eRet = ConvErr::Count; } else if( bArrayFormula ) @@ -887,7 +887,7 @@ ConvErr ExcelToSc::Convert( const ScTokenArray*& pResult, XclImpStream& aIn, std } else { - pResult = aPool[ aStack.Get() ]; + pResult = aPool.GetTokenArray( aStack.Get()); eRet = ConvErr::OK; } @@ -1326,7 +1326,7 @@ ConvErr ExcelToSc::Convert( ScRangeListTabs& rRangeList, XclImpStream& aIn, std: return eRet; } -void ExcelToSc::ConvertExternName( const ScTokenArray*& /*rpArray*/, XclImpStream& /*rStrm*/, std::size_t /*nFormulaLen*/, +void ExcelToSc::ConvertExternName( std::unique_ptr<ScTokenArray>& /*rpArray*/, XclImpStream& /*rStrm*/, std::size_t /*nFormulaLen*/, const OUString& /*rUrl*/, const vector<OUString>& /*rTabNames*/ ) { } @@ -1676,7 +1676,7 @@ void ExcelToSc::ExcRelToScRel( sal_uInt16 nRow, sal_uInt8 nCol, ScSingleRefData } } -const ScTokenArray* ExcelToSc::GetBoolErr( XclBoolError eType ) +std::unique_ptr<ScTokenArray> ExcelToSc::GetBoolErr( XclBoolError eType ) { FormulaError nError; aPool.Reset(); @@ -1708,11 +1708,11 @@ const ScTokenArray* ExcelToSc::GetBoolErr( XclBoolError eType ) aPool >> aStack; - const ScTokenArray* pResult = aPool[ aStack.Get() ]; + std::unique_ptr<ScTokenArray> pResult = aPool.GetTokenArray( aStack.Get()); if( nError != FormulaError::NONE ) - const_cast<ScTokenArray*>(pResult)->SetCodeError( nError ); + pResult->SetCodeError( nError ); - const_cast<ScTokenArray*>(pResult)->SetExclusiveRecalcModeNormal(); + pResult->SetExclusiveRecalcModeNormal(); return pResult; } diff --git a/sc/source/filter/excel/excform8.cxx b/sc/source/filter/excel/excform8.cxx index 515e89ca2c53..6cec86f94b11 100644 --- a/sc/source/filter/excel/excform8.cxx +++ b/sc/source/filter/excel/excform8.cxx @@ -135,7 +135,7 @@ bool ExcelToSc8::HandleOleLink(sal_uInt16 nXtiIndex, const XclImpExtName& rExtNa // if bAllowArrays is false stream seeks to first byte after <nFormulaLen> // otherwise it will seek to the first byte past additional content after <nFormulaLen> -ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, std::size_t nFormulaLen, bool bAllowArrays, const FORMULA_TYPE eFT ) +ConvErr ExcelToSc8::Convert( std::unique_ptr<ScTokenArray>& rpTokArray, XclImpStream& aIn, std::size_t nFormulaLen, bool bAllowArrays, const FORMULA_TYPE eFT ) { bool bError = false; bool bArrayFormula = false; @@ -160,7 +160,7 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, { aPool.Store( OUString( "-/-" ) ); aPool >> aStack; - rpTokArray = aPool[ aStack.Get() ]; + rpTokArray = aPool.GetTokenArray( aStack.Get()); return ConvErr::OK; } @@ -924,14 +924,14 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, { aPool << ocBad; aPool >> aStack; - rpTokArray = aPool[ aStack.Get() ]; + rpTokArray = aPool.GetTokenArray( aStack.Get()); eRet = ConvErr::Ni; } else if( aIn.GetRecPos() != nEndPos ) { aPool << ocBad; aPool >> aStack; - rpTokArray = aPool[ aStack.Get() ]; + rpTokArray = aPool.GetTokenArray( aStack.Get()); eRet = ConvErr::Count; } else if( bArrayFormula ) @@ -941,7 +941,7 @@ ConvErr ExcelToSc8::Convert( const ScTokenArray*& rpTokArray, XclImpStream& aIn, } else { - rpTokArray = aPool[ aStack.Get() ]; + rpTokArray = aPool.GetTokenArray( aStack.Get()); eRet = ConvErr::OK; } @@ -1297,7 +1297,7 @@ ConvErr ExcelToSc8::Convert( ScRangeListTabs& rRangeList, XclImpStream& aIn, std return eRet; } -void ExcelToSc8::ConvertExternName( const ScTokenArray*& rpArray, XclImpStream& rStrm, std::size_t nFormulaLen, +void ExcelToSc8::ConvertExternName( std::unique_ptr<ScTokenArray>& rpArray, XclImpStream& rStrm, std::size_t nFormulaLen, const OUString& rUrl, const vector<OUString>& rTabNames ) { if( !GetDocShell() ) @@ -1321,7 +1321,7 @@ void ExcelToSc8::ConvertExternName( const ScTokenArray*& rpArray, XclImpStream& { aPool.Store(OUString("-/-")); aPool >> aStack; - rpArray = aPool[aStack.Get()]; + rpArray = aPool.GetTokenArray( aStack.Get()); return; } @@ -1430,17 +1430,17 @@ void ExcelToSc8::ConvertExternName( const ScTokenArray*& rpArray, XclImpStream& { aPool << ocBad; aPool >> aStack; - rpArray = aPool[ aStack.Get() ]; + rpArray = aPool.GetTokenArray( aStack.Get()); } else if( rStrm.GetRecPos() != nEndPos ) { aPool << ocBad; aPool >> aStack; - rpArray = aPool[ aStack.Get() ]; + rpArray = aPool.GetTokenArray( aStack.Get()); } else { - rpArray = aPool[ aStack.Get() ]; + rpArray = aPool.GetTokenArray( aStack.Get()); } rStrm.Seek(nEndPos); diff --git a/sc/source/filter/excel/impop.cxx b/sc/source/filter/excel/impop.cxx index ceb03131f015..9394585e6920 100644 --- a/sc/source/filter/excel/impop.cxx +++ b/sc/source/filter/excel/impop.cxx @@ -386,8 +386,10 @@ void ImportExcel::ReadBoolErr() GetXFRangeBuffer().SetXF( aScPos, nXFIdx ); double fValue; - const ScTokenArray* pScTokArr = ErrorToFormula( nType != EXC_BOOLERR_BOOL, nValue, fValue ); - ScFormulaCell* pCell = pScTokArr ? new ScFormulaCell(pD, aScPos, *pScTokArr) : new ScFormulaCell(pD, aScPos); + std::unique_ptr<ScTokenArray> pScTokArr = ErrorToFormula( nType != EXC_BOOLERR_BOOL, nValue, fValue ); + ScFormulaCell* pCell = pScTokArr + ? new ScFormulaCell(pD, aScPos, pScTokArr.release()) + : new ScFormulaCell(pD, aScPos); pCell->SetHybridDouble( fValue ); GetDocImport().setFormulaCell(aScPos, pCell); } @@ -537,7 +539,7 @@ void ImportExcel::Array25() nFormLen = aIn.ReaduInt16(); } - const ScTokenArray* pResult = nullptr; + std::unique_ptr<ScTokenArray> pResult; if (ValidColRow(nLastCol, nLastRow)) { @@ -844,7 +846,7 @@ void ImportExcel::Shrfmla() // read mark is now on the formula - const ScTokenArray* pResult; + std::unique_ptr<ScTokenArray> pResult; // The shared range in this record is erroneous more than half the time. // Don't ever rely on it. Use the one from the formula cell above. @@ -867,7 +869,7 @@ void ImportExcel::Shrfmla() ScDocumentImport& rDoc = GetDocImport(); - ScFormulaCell* pCell = new ScFormulaCell(pD, aPos, *pResult); + ScFormulaCell* pCell = new ScFormulaCell(pD, aPos, pResult.release()); pCell->GetCode()->WrapReference(aPos, EXC_MAXCOL8, EXC_MAXROW8); rDoc.getDoc().CheckLinkFormulaNeedingCheck( *pCell->GetCode()); rDoc.getDoc().EnsureTable(aPos.Tab()); @@ -1035,7 +1037,7 @@ void ImportExcel::Array34() aIn.Ignore( (GetBiff() >= EXC_BIFF5) ? 6 : 2 ); nFormLen = aIn.ReaduInt16(); - const ScTokenArray* pResult = nullptr; + std::unique_ptr<ScTokenArray> pResult; if( ValidColRow( nLastCol, nLastRow ) ) { @@ -1244,7 +1246,7 @@ void ImportExcel::NewTable() pRowOutlineBuff = pNewItem->GetRowOutline(); } -const ScTokenArray* ImportExcel::ErrorToFormula( bool bErrOrVal, sal_uInt8 nError, double& rVal ) +std::unique_ptr<ScTokenArray> ImportExcel::ErrorToFormula( bool bErrOrVal, sal_uInt8 nError, double& rVal ) { return pFormConv->GetBoolErr( XclTools::ErrorToEnum( rVal, bErrOrVal, nError ) ); } diff --git a/sc/source/filter/excel/tokstack.cxx b/sc/source/filter/excel/tokstack.cxx index f28705fd755a..c4b067db2b7e 100644 --- a/sc/source/filter/excel/tokstack.cxx +++ b/sc/source/filter/excel/tokstack.cxx @@ -63,8 +63,6 @@ TokenPool::TokenPool( svl::SharedStringPool& rSPool ) : ppP_Matrix.reset( new ScMatrix*[ nP_Matrix ] ); memset( ppP_Matrix.get(), 0, sizeof( ScMatrix* ) * nP_Matrix ); - pScToken.reset(new ScTokenArray); - Reset(); } @@ -174,7 +172,7 @@ bool TokenPool::GrowMatrix() return true; } -bool TokenPool::GetElement( const sal_uInt16 nId ) +bool TokenPool::GetElement( const sal_uInt16 nId, ScTokenArray* pScToken ) { if (nId >= nElementCurrent) { @@ -184,7 +182,7 @@ bool TokenPool::GetElement( const sal_uInt16 nId ) bool bRet = true; if( pType[ nId ] == T_Id ) - bRet = GetElementRek( nId ); + bRet = GetElementRek( nId, pScToken ); else { switch( pType[ nId ] ) @@ -336,7 +334,7 @@ bool TokenPool::GetElement( const sal_uInt16 nId ) return bRet; } -bool TokenPool::GetElementRek( const sal_uInt16 nId ) +bool TokenPool::GetElementRek( const sal_uInt16 nId, ScTokenArray* pScToken ) { #ifdef DBG_UTIL m_nRek++; @@ -392,9 +390,9 @@ bool TokenPool::GetElementRek( const sal_uInt16 nId ) else { if (pType[ *pCurrent ] == T_Id) - bRet = GetElementRek( *pCurrent ); + bRet = GetElementRek( *pCurrent, pScToken ); else - bRet = GetElement( *pCurrent ); + bRet = GetElement( *pCurrent, pScToken ); } } else // elementary SC_Token diff --git a/sc/source/filter/excel/xichart.cxx b/sc/source/filter/excel/xichart.cxx index fbe65d55f897..6ff977f9d7a6 100644 --- a/sc/source/filter/excel/xichart.cxx +++ b/sc/source/filter/excel/xichart.cxx @@ -754,8 +754,8 @@ void XclImpChSourceLink::ReadChSourceLink( XclImpStream& rStrm ) rStrm >> aXclTokArr; // convert BIFF formula tokens to Calc token array - if( const ScTokenArray* pTokens = GetFormulaCompiler().CreateFormula( EXC_FMLATYPE_CHART, aXclTokArr ) ) - mxTokenArray.reset( pTokens->Clone() ); + if( std::unique_ptr<ScTokenArray> pTokens = GetFormulaCompiler().CreateFormula( EXC_FMLATYPE_CHART, aXclTokArr ) ) + mxTokenArray = std::move( pTokens ); } // try to read a following CHSTRING record diff --git a/sc/source/filter/excel/xicontent.cxx b/sc/source/filter/excel/xicontent.cxx index 9fbd5806824b..ef72040f3c28 100644 --- a/sc/source/filter/excel/xicontent.cxx +++ b/sc/source/filter/excel/xicontent.cxx @@ -658,13 +658,13 @@ void XclImpCondFormat::ReadCF( XclImpStream& rStrm ) ::std::unique_ptr< ScTokenArray > xTokArr1; if( nFmlaSize1 > 0 ) { - const ScTokenArray* pTokArr = nullptr; + std::unique_ptr<ScTokenArray> pTokArr; rFmlaConv.Reset( rPos ); rFmlaConv.Convert( pTokArr, rStrm, nFmlaSize1, false, FT_CondFormat ); // formula converter owns pTokArr -> create a copy of the token array if( pTokArr ) { - xTokArr1.reset( pTokArr->Clone() ); + xTokArr1 = std::move( pTokArr ); GetDocRef().CheckLinkFormulaNeedingCheck( *xTokArr1); } } @@ -672,13 +672,13 @@ void XclImpCondFormat::ReadCF( XclImpStream& rStrm ) ::std::unique_ptr< ScTokenArray > xTokArr2; if( nFmlaSize2 > 0 ) { - const ScTokenArray* pTokArr = nullptr; + std::unique_ptr<ScTokenArray> pTokArr; rFmlaConv.Reset( rPos ); rFmlaConv.Convert( pTokArr, rStrm, nFmlaSize2, false, FT_CondFormat ); // formula converter owns pTokArr -> create a copy of the token array if( pTokArr ) { - xTokArr2.reset( pTokArr->Clone() ); + xTokArr2 = std::move( pTokArr ); GetDocRef().CheckLinkFormulaNeedingCheck( *xTokArr2); } } @@ -832,23 +832,23 @@ void XclImpValidationManager::ReadDV( XclImpStream& rStrm ) rStrm.RestorePosition(aPosFormula1); if( nLenFormula1 > 0 ) { - const ScTokenArray* pTokArr = nullptr; + std::unique_ptr<ScTokenArray> pTokArr; rFmlaConv.Reset(aCombinedRange.aStart); rFmlaConv.Convert( pTokArr, rStrm, nLenFormula1, false, FT_CondFormat ); // formula converter owns pTokArr -> create a copy of the token array if( pTokArr ) - xTokArr1.reset( pTokArr->Clone() ); + xTokArr1 = std::move( pTokArr ); } rStrm.SetNulSubstChar(); // back to default if (nLenFormula2 > 0) { rStrm.RestorePosition(aPosFormula2); - const ScTokenArray* pTokArr = nullptr; + std::unique_ptr<ScTokenArray> pTokArr; rFmlaConv.Reset(aCombinedRange.aStart); rFmlaConv.Convert( pTokArr, rStrm, nLenFormula2, false, FT_CondFormat ); // formula converter owns pTokArr -> create a copy of the token array if( pTokArr ) - xTokArr2.reset( pTokArr->Clone() ); + xTokArr2 = std::move( pTokArr ); } rStrm.RestorePosition(aCurrentPos); diff --git a/sc/source/filter/excel/xiformula.cxx b/sc/source/filter/excel/xiformula.cxx index e2f0f9cb1cf7..7a5fc80557d6 100644 --- a/sc/source/filter/excel/xiformula.cxx +++ b/sc/source/filter/excel/xiformula.cxx @@ -36,7 +36,7 @@ public: ScRangeList& rScRanges, XclFormulaType eType, const XclTokenArray& rXclTokArr, XclImpStream& rStrm ); - const ScTokenArray* CreateFormula( XclFormulaType eType, const XclTokenArray& rXclTokArr ); + std::unique_ptr<ScTokenArray> CreateFormula( XclFormulaType eType, const XclTokenArray& rXclTokArr ); }; @@ -63,7 +63,7 @@ void XclImpFmlaCompImpl::CreateRangeList( } } -const ScTokenArray* XclImpFmlaCompImpl::CreateFormula( +std::unique_ptr<ScTokenArray> XclImpFmlaCompImpl::CreateFormula( XclFormulaType /*eType*/, const XclTokenArray& rXclTokArr ) { if (rXclTokArr.Empty()) @@ -75,7 +75,7 @@ const ScTokenArray* XclImpFmlaCompImpl::CreateFormula( aMemStrm.WriteBytes(rXclTokArr.GetData(), rXclTokArr.GetSize()); XclImpStream aFmlaStrm( aMemStrm, GetRoot() ); aFmlaStrm.StartNextRecord(); - const ScTokenArray* pArray = nullptr; + std::unique_ptr<ScTokenArray> pArray; GetOldFmlaConverter().Reset(); GetOldFmlaConverter().Convert(pArray, aFmlaStrm, aFmlaStrm.GetRecSize(), true); return pArray; @@ -98,7 +98,7 @@ void XclImpFormulaCompiler::CreateRangeList( mxImpl->CreateRangeList( rScRanges, eType, rXclTokArr, rStrm ); } -const ScTokenArray* XclImpFormulaCompiler::CreateFormula( +std::unique_ptr<ScTokenArray> XclImpFormulaCompiler::CreateFormula( XclFormulaType eType, const XclTokenArray& rXclTokArr ) { return mxImpl->CreateFormula(eType, rXclTokArr); diff --git a/sc/source/filter/excel/xihelper.cxx b/sc/source/filter/excel/xihelper.cxx index 93287121b554..5e60ef986917 100644 --- a/sc/source/filter/excel/xihelper.cxx +++ b/sc/source/filter/excel/xihelper.cxx @@ -794,10 +794,10 @@ XclImpCachedValue::XclImpCachedValue( XclImpStream& rStrm ) : mnBoolErr = rStrm.ReaduInt8(); rStrm.Ignore( 7 ); - const ScTokenArray* pScTokArr = rStrm.GetRoot().GetOldFmlaConverter().GetBoolErr( + std::unique_ptr<ScTokenArray> pScTokArr = rStrm.GetRoot().GetOldFmlaConverter().GetBoolErr( XclTools::ErrorToEnum( fVal, mnType == EXC_CACHEDVAL_ERROR, mnBoolErr ) ); if( pScTokArr ) - mxTokArr.reset( pScTokArr->Clone() ); + mxTokArr = std::move( pScTokArr ); } break; default: diff --git a/sc/source/filter/excel/xilink.cxx b/sc/source/filter/excel/xilink.cxx index ce811f2471e9..48905964378d 100644 --- a/sc/source/filter/excel/xilink.cxx +++ b/sc/source/filter/excel/xilink.cxx @@ -382,7 +382,7 @@ XclImpExtName::XclImpExtName( XclImpSupbook& rSupbook, XclImpStream& rStrm, XclS { if (pFormulaConv) { - const ScTokenArray* pArray = nullptr; + std::unique_ptr<ScTokenArray> pArray; sal_uInt16 nFmlaLen; nFmlaLen = rStrm.ReaduInt16(); std::vector<OUString> aTabNames; @@ -393,7 +393,7 @@ XclImpExtName::XclImpExtName( XclImpSupbook& rSupbook, XclImpStream& rStrm, XclS pFormulaConv->ConvertExternName(pArray, rStrm, nFmlaLen, rSupbook.GetXclUrl(), aTabNames); if (pArray) - mxArray.reset(pArray->Clone()); + mxArray = std::move( pArray ); } } break; diff --git a/sc/source/filter/excel/xiname.cxx b/sc/source/filter/excel/xiname.cxx index 720e61953d0f..0e53b619df91 100644 --- a/sc/source/filter/excel/xiname.cxx +++ b/sc/source/filter/excel/xiname.cxx @@ -144,12 +144,12 @@ XclImpName::XclImpName( XclImpStream& rStrm, sal_uInt16 nXclNameIdx ) : // 3) *** convert the name definition formula *** ------------------------- rFmlaConv.Reset(); - const ScTokenArray* pTokArr = nullptr; // pointer to token array, owned by rFmlaConv + std::unique_ptr<ScTokenArray> pTokArr; if( ::get_flag( nFlags, EXC_NAME_BIG ) ) { // special, unsupported name - rFmlaConv.GetDummy( pTokArr ); + pTokArr = rFmlaConv.GetDummy(); } else if( bBuiltIn ) { @@ -209,7 +209,7 @@ XclImpName::XclImpName( XclImpStream& rStrm, sal_uInt16 nXclNameIdx ) : } if (pTokArr && !bFunction && !mbVBName) - InsertName(pTokArr); + InsertName(pTokArr.get()); } void XclImpName::ConvertTokens() @@ -219,7 +219,7 @@ void XclImpName::ConvertTokens() ExcelToSc& rFmlaConv = GetOldFmlaConverter(); rFmlaConv.Reset(); - const ScTokenArray* pArray = nullptr; + std::unique_ptr<ScTokenArray> pArray; XclImpStreamPos aOldPos; XclImpStream& rStrm = mpTokensData->mrStrm; @@ -229,7 +229,7 @@ void XclImpName::ConvertTokens() rStrm.RestorePosition(aOldPos); if (pArray) - InsertName(pArray); + InsertName(pArray.get()); mpTokensData.reset(); } diff --git a/sc/source/filter/excel/xipivot.cxx b/sc/source/filter/excel/xipivot.cxx index b46439abbb28..90d512546980 100644 --- a/sc/source/filter/excel/xipivot.cxx +++ b/sc/source/filter/excel/xipivot.cxx @@ -118,9 +118,11 @@ void XclImpPCItem::WriteToSource( XclImpRoot& rRoot, const ScAddress& rScPos ) c { double fValue; sal_uInt8 nErrCode = static_cast< sal_uInt8 >( *pnError ); - const ScTokenArray* pScTokArr = rRoot.GetOldFmlaConverter().GetBoolErr( + std::unique_ptr<ScTokenArray> pScTokArr = rRoot.GetOldFmlaConverter().GetBoolErr( XclTools::ErrorToEnum( fValue, true, nErrCode ) ); - ScFormulaCell* pCell = pScTokArr ? new ScFormulaCell(&rDoc.getDoc(), rScPos, *pScTokArr) : new ScFormulaCell(&rDoc.getDoc(), rScPos); + ScFormulaCell* pCell = pScTokArr + ? new ScFormulaCell(&rDoc.getDoc(), rScPos, pScTokArr.release()) + : new ScFormulaCell(&rDoc.getDoc(), rScPos); pCell->SetHybridDouble( fValue ); rDoc.setFormulaCell(rScPos, pCell); } diff --git a/sc/source/filter/inc/XclImpChangeTrack.hxx b/sc/source/filter/inc/XclImpChangeTrack.hxx index 96146d5a3e78..f89a5f068bef 100644 --- a/sc/source/filter/inc/XclImpChangeTrack.hxx +++ b/sc/source/filter/inc/XclImpChangeTrack.hxx @@ -78,7 +78,7 @@ private: bool CheckRecord( sal_uInt16 nOpCode ); void ReadFormula( - ScTokenArray*& rpTokenArray, + std::unique_ptr<ScTokenArray>& rpTokenArray, const ScAddress& rPosition ); void ReadCell( ScCellValue& rCell, sal_uInt32& rFormat, sal_uInt16 nFlags, const ScAddress& rPosition ); diff --git a/sc/source/filter/inc/excform.hxx b/sc/source/filter/inc/excform.hxx index 4345d9daabfc..4851952b4f0c 100644 --- a/sc/source/filter/inc/excform.hxx +++ b/sc/source/filter/inc/excform.hxx @@ -48,18 +48,18 @@ protected: public: ExcelToSc( XclImpRoot& rRoot ); virtual ~ExcelToSc() override; - virtual ConvErr Convert( const ScTokenArray*&, XclImpStream& rStrm, std::size_t nFormulaLen, + virtual ConvErr Convert( std::unique_ptr<ScTokenArray>&, XclImpStream& rStrm, std::size_t nFormulaLen, bool bAllowArrays, const FORMULA_TYPE eFT = FT_CellFormula ) override; virtual ConvErr Convert( ScRangeListTabs&, XclImpStream& rStrm, std::size_t nFormulaLen, SCTAB nTab, const FORMULA_TYPE eFT = FT_CellFormula ) override; - virtual void ConvertExternName( const ScTokenArray*& rpArray, XclImpStream& rStrm, std::size_t nFormulaLen, + virtual void ConvertExternName( std::unique_ptr<ScTokenArray>& rpArray, XclImpStream& rStrm, std::size_t nFormulaLen, const OUString& rUrl, const ::std::vector<OUString>& rTabNames ); virtual void GetAbsRefs( ScRangeList& rRangeList, XclImpStream& rStrm, std::size_t nLen ); - void GetDummy( const ScTokenArray*& ); - const ScTokenArray* GetBoolErr( XclBoolError ); + std::unique_ptr<ScTokenArray> GetDummy(); + std::unique_ptr<ScTokenArray> GetBoolErr( XclBoolError ); static bool ReadSharedFormulaPosition( XclImpStream& rStrm, SCCOL& rCol, SCROW& rRow ); const ScTokenArray* GetSharedFormula( const ScAddress& rRefPos ) const; @@ -122,11 +122,11 @@ public: ExcelToSc8( XclImpRoot& rRoot ); virtual ~ExcelToSc8() override; - virtual ConvErr Convert( const ScTokenArray*& rpTokArray, XclImpStream& rStrm, std::size_t nFormulaLen, bool bAllowArrays, const FORMULA_TYPE eFT = FT_CellFormula ) override; + virtual ConvErr Convert( std::unique_ptr<ScTokenArray>& rpTokArray, XclImpStream& rStrm, std::size_t nFormulaLen, bool bAllowArrays, const FORMULA_TYPE eFT = FT_CellFormula ) override; virtual ConvErr Convert( ScRangeListTabs&, XclImpStream& rStrm, std::size_t nFormulaLen, SCTAB nTab, const FORMULA_TYPE eFT = FT_CellFormula ) override; - virtual void ConvertExternName( const ScTokenArray*& rpArray, XclImpStream& rStrm, std::size_t nFormulaLen, + virtual void ConvertExternName( std::unique_ptr<ScTokenArray>& rpArray, XclImpStream& rStrm, std::size_t nFormulaLen, const OUString& rUrl, const ::std::vector<OUString>& rTabNames ) override; static inline bool IsComplRowRange( const sal_uInt16 nRow1, const sal_uInt16 nRow2 ); diff --git a/sc/source/filter/inc/formel.hxx b/sc/source/filter/inc/formel.hxx index 2f82381b6ee3..ff6fd422448d 100644 --- a/sc/source/filter/inc/formel.hxx +++ b/sc/source/filter/inc/formel.hxx @@ -99,7 +99,7 @@ public: void Reset(); void Reset( const ScAddress& rEingPos ); - virtual ConvErr Convert( const ScTokenArray*& rpErg, XclImpStream& rStrm, std::size_t nFormulaLen, + virtual ConvErr Convert( std::unique_ptr<ScTokenArray>& rpErg, XclImpStream& rStrm, std::size_t nFormulaLen, bool bAllowArrays, const FORMULA_TYPE eFT = FT_CellFormula ) = 0; virtual ConvErr Convert( ScRangeListTabs&, XclImpStream& rStrm, std::size_t nFormulaLen, SCTAB nTab, const FORMULA_TYPE eFT = FT_CellFormula ) = 0; @@ -124,7 +124,7 @@ protected: public: void Reset( const ScAddress& rEingPos ); - virtual void Convert( const ScTokenArray*& rpErg, sal_Int32& nRest ) = 0; + virtual void Convert( std::unique_ptr<ScTokenArray>& rpErg, sal_Int32& nRest ) = 0; bool good() const { return aIn.good(); } diff --git a/sc/source/filter/inc/imp_op.hxx b/sc/source/filter/inc/imp_op.hxx index 6120da506958..2579446800b7 100644 --- a/sc/source/filter/inc/imp_op.hxx +++ b/sc/source/filter/inc/imp_op.hxx @@ -186,7 +186,7 @@ protected: virtual void EndSheet(); void NewTable(); - const ScTokenArray* ErrorToFormula( bool bErrOrVal, sal_uInt8 nError, + std::unique_ptr<ScTokenArray> ErrorToFormula( bool bErrOrVal, sal_uInt8 nError, double& rVal ); void AdjustRowHeight(); diff --git a/sc/source/filter/inc/lotform.hxx b/sc/source/filter/inc/lotform.hxx index f902fd67a893..a352b5c9bd91 100644 --- a/sc/source/filter/inc/lotform.hxx +++ b/sc/source/filter/inc/lotform.hxx @@ -88,7 +88,7 @@ private: public: LotusToSc(LotusContext &rContext, SvStream& aStr, svl::SharedStringPool& rSPool, rtl_TextEncoding eSrc, bool b); - virtual void Convert( const ScTokenArray*& rpErg, sal_Int32& nRest ) override; + virtual void Convert( std::unique_ptr<ScTokenArray>& rpErg, sal_Int32& nRest ) override; void Reset( const ScAddress& rEingPos ); inline void SetWK3(); diff --git a/sc/source/filter/inc/qproform.hxx b/sc/source/filter/inc/qproform.hxx index 35622618e260..cecb70d6ec55 100644 --- a/sc/source/filter/inc/qproform.hxx +++ b/sc/source/filter/inc/qproform.hxx @@ -58,7 +58,7 @@ private: public: static const size_t nBufSize = 256; QProToSc( SvStream &aStr, svl::SharedStringPool& rSPool, const ScAddress& rRefPos ); - ConvErr Convert( const ScTokenArray*& pArray ); + ConvErr Convert( std::unique_ptr<ScTokenArray>& pArray ); void DoFunc( DefTokenId eOc, sal_uInt16 nArgs, const sal_Char* pExtString ); void ReadSRD( ScSingleRefData& rR, sal_Int8 nPage, sal_Int8 nCol, sal_uInt16 rRel ); void IncToken( TokenId &aParam ); diff --git a/sc/source/filter/inc/tokstack.hxx b/sc/source/filter/inc/tokstack.hxx index a0dd2f80fba0..6b0ce783d4fc 100644 --- a/sc/source/filter/inc/tokstack.hxx +++ b/sc/source/filter/inc/tokstack.hxx @@ -209,7 +209,6 @@ private: #ifdef DBG_UTIL sal_uInt16 m_nRek; // recursion counter #endif - std::unique_ptr<ScTokenArray> pScToken; // Token array bool GrowTripel( sal_uInt16 nByMin ); bool GrowId(); @@ -222,8 +221,8 @@ private: nElementCurrent+1. */ bool CheckElementOrGrow(); - bool GetElement( const sal_uInt16 nId ); - bool GetElementRek( const sal_uInt16 nId ); + bool GetElement( const sal_uInt16 nId, ScTokenArray* pScToken ); + bool GetElementRek( const sal_uInt16 nId, ScTokenArray* pScToken ); void ClearMatrix(); public: TokenPool( svl::SharedStringPool& rSPool ); @@ -252,7 +251,7 @@ public: const TokenId StoreExtRef( sal_uInt16 nFileId, const OUString& rTabName, const ScSingleRefData& rRef ); const TokenId StoreExtRef( sal_uInt16 nFileId, const OUString& rTabName, const ScComplexRefData& rRef ); - inline const ScTokenArray* operator []( const TokenId& rId ); + std::unique_ptr<ScTokenArray> GetTokenArray( const TokenId& rId ); void Reset(); bool IsSingleOp( const TokenId& rId, const DefTokenId eId ) const; const OUString* GetExternal( const TokenId& rId ) const; @@ -412,19 +411,19 @@ inline const TokenId TokenPool::Store() return nId; } -const inline ScTokenArray* TokenPool::operator []( const TokenId& rId ) +inline std::unique_ptr<ScTokenArray> TokenPool::GetTokenArray( const TokenId& rId ) { - pScToken->Clear(); + std::unique_ptr<ScTokenArray> pScToken( new ScTokenArray ); if( rId ) {//...only if rId > 0! #ifdef DBG_UTIL m_nRek = 0; #endif - GetElement( static_cast<sal_uInt16>(rId) - 1 ); + GetElement( static_cast<sal_uInt16>(rId) - 1, pScToken.get()); } - return pScToken.get(); + return pScToken; } diff --git a/sc/source/filter/inc/xiformula.hxx b/sc/source/filter/inc/xiformula.hxx index a24c008d96fb..7af2dd9d3132 100644 --- a/sc/source/filter/inc/xiformula.hxx +++ b/sc/source/filter/inc/xiformula.hxx @@ -43,12 +43,9 @@ public: const XclTokenArray& rXclTokArr, XclImpStream& rStrm ); /** - * Creates a formula token array from the Excel token array. Note that - * the caller must create a copy of the token array instance returned by - * this function if the caller needs to persistently store the array, - * because the pointer points to an array instance on the stack. + * Creates a formula token array from the Excel token array. */ - const ScTokenArray* CreateFormula( XclFormulaType eType, const XclTokenArray& rXclTokArr ); + std::unique_ptr<ScTokenArray> CreateFormula( XclFormulaType eType, const XclTokenArray& rXclTokArr ); private: typedef std::shared_ptr< XclImpFmlaCompImpl > XclImpFmlaCompImplRef; diff --git a/sc/source/filter/lotus/lotform.cxx b/sc/source/filter/lotus/lotform.cxx index 4371a5587798..f25fc57e1562 100644 --- a/sc/source/filter/lotus/lotform.cxx +++ b/sc/source/filter/lotus/lotform.cxx @@ -384,7 +384,7 @@ LotusToSc::LotusToSc(LotusContext &rContext, SvStream &rStream, svl::SharedStrin typedef FUNC_TYPE ( FuncType1 ) ( sal_uInt8 ); typedef DefTokenId ( FuncType2 ) ( sal_uInt8 ); -void LotusToSc::Convert( const ScTokenArray*& rpErg, sal_Int32& rRest ) +void LotusToSc::Convert( std::unique_ptr<ScTokenArray>& rpErg, sal_Int32& rRest ) { sal_uInt8 nOc; sal_uInt8 nCnt; @@ -438,7 +438,7 @@ void LotusToSc::Convert( const ScTokenArray*& rpErg, sal_Int32& rRest ) if( nBytesLeft < 0 ) { - rpErg = aPool[ aStack.Get() ]; + rpErg = aPool.GetTokenArray( aStack.Get()); return; } @@ -659,7 +659,7 @@ void LotusToSc::Convert( const ScTokenArray*& rpErg, sal_Int32& rRest ) } } - rpErg = aPool[ aStack.Get() ]; + rpErg = aPool.GetTokenArray( aStack.Get()); SAL_WARN_IF( nBytesLeft < 0, "sc.filter", "*LotusToSc::Convert(): processed too much!"); SAL_WARN_IF( nBytesLeft > 0, "sc.filter", "*LotusToSc::Convert(): what happens with the rest?" ); diff --git a/sc/source/filter/lotus/lotimpop.cxx b/sc/source/filter/lotus/lotimpop.cxx index f93c965efa42..abf7fc36fc69 100644 --- a/sc/source/filter/lotus/lotimpop.cxx +++ b/sc/source/filter/lotus/lotimpop.cxx @@ -270,7 +270,7 @@ void ImportLotus::Formulacell( sal_uInt16 n ) n -= std::min<sal_uInt16>(n, 14); - const ScTokenArray* pErg; + std::unique_ptr<ScTokenArray> pErg; sal_Int32 nRest = n; aConv.Reset( aAddr ); @@ -279,7 +279,7 @@ void ImportLotus::Formulacell( sal_uInt16 n ) if (!aConv.good()) return; - ScFormulaCell* pCell = pErg ? new ScFormulaCell(pD, aAddr, *pErg) : new ScFormulaCell(pD, aAddr); + ScFormulaCell* pCell = pErg ? new ScFormulaCell(pD, aAddr, pErg.release()) : new ScFormulaCell(pD, aAddr); pCell->AddRecalcMode( ScRecalcMode::ONLOAD_ONCE ); pD->EnsureTable(aAddr.Tab()); pD->SetFormulaCell(aAddr, pCell); diff --git a/sc/source/filter/lotus/op.cxx b/sc/source/filter/lotus/op.cxx index 6fca43504b8d..1099aa870232 100644 --- a/sc/source/filter/lotus/op.cxx +++ b/sc/source/filter/lotus/op.cxx @@ -144,7 +144,7 @@ void OP_Formula(LotusContext &rContext, SvStream& r, sal_uInt16 /*n*/) SCCOL nCol(static_cast<SCCOL>(nTmpCol)); SCROW nRow(static_cast<SCROW>(nTmpRow)); - const ScTokenArray* pResult; + std::unique_ptr<ScTokenArray> pResult; sal_Int32 nBytesLeft = nFormulaSize; ScAddress aAddress(nCol, nRow, 0); @@ -157,7 +157,7 @@ void OP_Formula(LotusContext &rContext, SvStream& r, sal_uInt16 /*n*/) if (ValidColRow(nCol, nRow)) { - ScFormulaCell* pCell = new ScFormulaCell(rContext.pLotusRoot->pDoc, aAddress, *pResult); + ScFormulaCell* pCell = new ScFormulaCell(rContext.pLotusRoot->pDoc, aAddress, pResult.release()); pCell->AddRecalcMode( ScRecalcMode::ONLOAD_ONCE ); rContext.pDoc->EnsureTable(0); rContext.pDoc->SetFormulaCell(ScAddress(nCol, nRow, 0), pCell); @@ -402,7 +402,7 @@ void OP_Formula123(LotusContext& rContext, SvStream& r, sal_uInt16 n) SCROW nRow(static_cast<SCROW>(nTmpRow)); r.SeekRel( 8 ); // skip Result - const ScTokenArray* pResult; + std::unique_ptr<ScTokenArray> pResult; sal_Int32 nBytesLeft = (n > 12) ? n - 12 : 0; ScAddress aAddress( nCol, nRow, nTab ); @@ -415,7 +415,7 @@ void OP_Formula123(LotusContext& rContext, SvStream& r, sal_uInt16 n) if (ValidColRow(nCol, nRow) && nTab <= rContext.pDoc->GetMaxTableNumber()) { - ScFormulaCell* pCell = new ScFormulaCell(rContext.pLotusRoot->pDoc, aAddress, *pResult); + ScFormulaCell* pCell = new ScFormulaCell(rContext.pLotusRoot->pDoc, aAddress, pResult.release()); pCell->AddRecalcMode( ScRecalcMode::ONLOAD_ONCE ); rContext.pDoc->EnsureTable(nTab); rContext.pDoc->SetFormulaCell(ScAddress(nCol,nRow,nTab), pCell); diff --git a/sc/source/filter/qpro/qpro.cxx b/sc/source/filter/qpro/qpro.cxx index 28cbf788c5be..c6bca203eb21 100644 --- a/sc/source/filter/qpro/qpro.cxx +++ b/sc/source/filter/qpro/qpro.cxx @@ -111,14 +111,14 @@ ErrCode ScQProReader::readSheet( SCTAB nTab, ScDocument* pDoc, ScQProStyle *pSty break; } ScAddress aAddr( nCol, nRow, nTab ); - const ScTokenArray *pArray; + std::unique_ptr<ScTokenArray> pArray; QProToSc aConv(*mpStream, pDoc->GetSharedStringPool(), aAddr); if (ConvErr::OK != aConv.Convert( pArray )) eRet = SCERR_IMPORT_FORMAT; else { - ScFormulaCell* pFormula = new ScFormulaCell(pDoc, aAddr, *pArray); + ScFormulaCell* pFormula = new ScFormulaCell(pDoc, aAddr, pArray.release()); nStyle = nStyle >> 3; pFormula->AddRecalcMode( ScRecalcMode::ONLOAD_ONCE ); pStyle->SetFormat( pDoc, nCol, nRow, nTab, nStyle ); diff --git a/sc/source/filter/qpro/qproform.cxx b/sc/source/filter/qpro/qproform.cxx index a3a68c649480..0382228f3ecc 100644 --- a/sc/source/filter/qpro/qproform.cxx +++ b/sc/source/filter/qpro/qproform.cxx @@ -193,7 +193,7 @@ do { \ break; /* switch */ \ } -ConvErr QProToSc::Convert( const ScTokenArray*& pArray ) +ConvErr QProToSc::Convert( std::unique_ptr<ScTokenArray>& pArray ) { sal_uInt8 nFmla[ nBufSize ], nArg; sal_uInt8 nArgArray[ nBufSize ] = {0}; @@ -392,7 +392,7 @@ ConvErr QProToSc::Convert( const ScTokenArray*& pArray ) } i++; } - pArray = aPool[ aStack.Get() ]; + pArray = aPool.GetTokenArray( aStack.Get()); return eRet; } diff --git a/sc/source/filter/xcl97/XclImpChangeTrack.cxx b/sc/source/filter/xcl97/XclImpChangeTrack.cxx index f212b231c6dd..5ad6ccca9559 100644 --- a/sc/source/filter/xcl97/XclImpChangeTrack.cxx +++ b/sc/source/filter/xcl97/XclImpChangeTrack.cxx @@ -179,7 +179,7 @@ void XclImpChangeTrack::Read3DTabRefInfo( SCTAB& rFirstTab, SCTAB& rLastTab, Exc } } -void XclImpChangeTrack::ReadFormula( ScTokenArray*& rpTokenArray, const ScAddress& rPosition ) +void XclImpChangeTrack::ReadFormula( std::unique_ptr<ScTokenArray>& rpTokenArray, const ScAddress& rPosition ) { sal_uInt16 nFmlSize = pStrm->ReaduInt16(); @@ -208,10 +208,10 @@ void XclImpChangeTrack::ReadFormula( ScTokenArray*& rpTokenArray, const ScAddres XclImpChTrFmlConverter aFmlConv( GetRoot(), *this ); // read the formula, 3D tab refs from extended data - const ScTokenArray* pArray = nullptr; + std::unique_ptr<ScTokenArray> pArray; aFmlConv.Reset( rPosition ); bool bOK = (aFmlConv.Convert( pArray, aFmlaStrm, nFmlSize, false ) == ConvErr::OK); // JEG : Check This - rpTokenArray = (bOK && pArray) ? new ScTokenArray( *pArray ) : nullptr; + rpTokenArray = (bOK && pArray) ? std::move( pArray ) : nullptr; pStrm->Ignore( 1 ); } @@ -267,14 +267,13 @@ void XclImpChangeTrack::ReadCell( break; case EXC_CHTR_TYPE_FORMULA: { - ScTokenArray* pTokenArray = nullptr; + std::unique_ptr<ScTokenArray> pTokenArray; ReadFormula( pTokenArray, rPosition ); if( pStrm->IsValid() && pTokenArray ) { rCell.meType = CELLTYPE_FORMULA; - rCell.mpFormula = new ScFormulaCell(&GetDocRef(), rPosition, *pTokenArray); + rCell.mpFormula = new ScFormulaCell(&GetDocRef(), rPosition, pTokenArray.release()); } - delete pTokenArray; } break; default: |