summaryrefslogtreecommitdiff
path: root/sc/source/core/tool/compiler.cxx
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2019-12-13 15:59:51 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2019-12-13 19:41:59 +0100
commit113444f59dc7690850919155b9b164b1a686bbe7 (patch)
tree90828ec324aabf60236f0785178c60144c2b4975 /sc/source/core/tool/compiler.cxx
parent3b8e554b69de349a20d10ec90b27ab71a013b464 (diff)
sc: rowcol: tdf#50916 create ScSheetLimits to hold by rtl::Reference
ScTokenArray sometimes outlives the ScDocument that created it, which means it accesses dead data when it tries to validate columns and rows. So create the ScSheetLimits class, which ScTokenArray can hold by reference counted pointer. Change-Id: Ic5771734fe4962d12f024fc1b29232124c14208a Reviewed-on: https://gerrit.libreoffice.org/85117 Tested-by: Jenkins Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'sc/source/core/tool/compiler.cxx')
-rw-r--r--sc/source/core/tool/compiler.cxx66
1 files changed, 33 insertions, 33 deletions
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 3d4a2def3552..7f1460db8f51 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -832,7 +832,7 @@ struct ConventionOOO_A1 : public Convention_A1
}
}
- static SingletonDisplay getSingletonDisplay( const ScDocument* pDoc, const ScAddress& rAbs1, const ScAddress& rAbs2,
+ static SingletonDisplay getSingletonDisplay( ScSheetLimits& rLimits, const ScAddress& rAbs1, const ScAddress& rAbs2,
const ScComplexRefData& rRef, bool bFromRangeName )
{
// If any part is error, display as such.
@@ -846,7 +846,7 @@ struct ConventionOOO_A1 : public Convention_A1
// Same if not in named expression and both rows of entire columns are
// relative references.
- if (!bFromRangeName && rAbs1.Row() == 0 && rAbs2.Row() == pDoc->MaxRow() &&
+ if (!bFromRangeName && rAbs1.Row() == 0 && rAbs2.Row() == rLimits.mnMaxRow &&
rRef.Ref1.IsRowRel() && rRef.Ref2.IsRowRel())
return SINGLETON_COL;
@@ -856,7 +856,7 @@ struct ConventionOOO_A1 : public Convention_A1
// Same if not in named expression and both columns of entire rows are
// relative references.
- if (!bFromRangeName && rAbs1.Col() == 0 && rAbs2.Col() == pDoc->MaxCol() &&
+ if (!bFromRangeName && rAbs1.Col() == 0 && rAbs2.Col() == rLimits.mnMaxCol &&
rRef.Ref1.IsColRel() && rRef.Ref2.IsColRel())
return SINGLETON_ROW;
@@ -864,7 +864,7 @@ struct ConventionOOO_A1 : public Convention_A1
}
virtual void makeRefStr(
- const ScDocument* pDoc,
+ ScSheetLimits& rLimits,
OUStringBuffer& rBuffer,
formula::FormulaGrammar::Grammar /*eGram*/,
const ScAddress& rPos,
@@ -880,7 +880,7 @@ struct ConventionOOO_A1 : public Convention_A1
aAbs2 = rRef.Ref2.toAbs(rPos);
SingletonDisplay eSingleton = bSingleRef ? SINGLETON_NONE :
- getSingletonDisplay( pDoc, aAbs1, aAbs2, rRef, bFromRangeName);
+ getSingletonDisplay( rLimits, aAbs1, aAbs2, rRef, bFromRangeName);
MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, rRef.Ref1, aAbs1, false, false, eSingleton);
if (!bSingleRef)
{
@@ -1009,7 +1009,7 @@ struct ConventionOOO_A1 : public Convention_A1
}
virtual void makeExternalRefStr(
- const ScDocument* /*pDoc*/,
+ ScSheetLimits&,
OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 /*nFileId*/, const OUString& rFileName,
const std::vector<OUString>& rTabNames, const OUString& rTabName,
const ScComplexRefData& rRef ) const override
@@ -1023,7 +1023,7 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1
ConventionOOO_A1_ODF() : ConventionOOO_A1 (FormulaGrammar::CONV_ODF) { }
virtual void makeRefStr(
- const ScDocument* pDoc,
+ ScSheetLimits& rLimits,
OUStringBuffer& rBuffer,
formula::FormulaGrammar::Grammar eGram,
const ScAddress& rPos,
@@ -1050,7 +1050,7 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1
else
{
SingletonDisplay eSingleton = bSingleRef ? SINGLETON_NONE :
- getSingletonDisplay( pDoc, aAbs1, aAbs2, rRef, bFromRangeName);
+ getSingletonDisplay( rLimits, aAbs1, aAbs2, rRef, bFromRangeName);
MakeOneRefStrImpl(rBuffer, rErrRef, rTabNames, rRef.Ref1, aAbs1, false, true, eSingleton);
if (!bSingleRef)
{
@@ -1076,7 +1076,7 @@ struct ConventionOOO_A1_ODF : public ConventionOOO_A1
}
virtual void makeExternalRefStr(
- const ScDocument* /*pDoc*/,
+ ScSheetLimits& ,
OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 /*nFileId*/, const OUString& rFileName,
const std::vector<OUString>& rTabNames,
const OUString& rTabName, const ScComplexRefData& rRef ) const override
@@ -1271,7 +1271,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
}
virtual void makeRefStr(
- const ScDocument* pDoc,
+ ScSheetLimits& rLimits,
OUStringBuffer& rBuf,
formula::FormulaGrammar::Grammar /*eGram*/,
const ScAddress& rPos,
@@ -1303,7 +1303,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
return;
}
- if (aAbs1.Col() == 0 && aAbs2.Col() >= pDoc->MaxCol())
+ if (aAbs1.Col() == 0 && aAbs2.Col() >= rLimits.mnMaxCol)
{
if (!aRef.Ref1.IsRowRel())
rBuf.append( '$' );
@@ -1315,7 +1315,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
return;
}
- if (aAbs1.Row() == 0 && aAbs2.Row() >= pDoc->MaxRow())
+ if (aAbs1.Row() == 0 && aAbs2.Row() >= rLimits.mnMaxRow)
{
if (!aRef.Ref1.IsColRel())
rBuf.append( '$' );
@@ -1394,7 +1394,7 @@ struct ConventionXL_A1 : public Convention_A1, public ConventionXL
}
virtual void makeExternalRefStr(
- const ScDocument* /*pDoc*/,
+ ScSheetLimits&,
OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 /*nFileId*/, const OUString& rFileName,
const std::vector<OUString>& rTabNames, const OUString& rTabName,
const ScComplexRefData& rRef ) const override
@@ -1418,7 +1418,7 @@ struct ConventionXL_OOX : public ConventionXL_A1
{
ConventionXL_OOX() : ConventionXL_A1( FormulaGrammar::CONV_XL_OOX ) { }
- virtual void makeRefStr( const ScDocument* pDoc,
+ virtual void makeRefStr( ScSheetLimits& rLimits,
OUStringBuffer& rBuf,
formula::FormulaGrammar::Grammar eGram,
const ScAddress& rPos,
@@ -1450,7 +1450,7 @@ struct ConventionXL_OOX : public ConventionXL_A1
return;
}
- ConventionXL_A1::makeRefStr( pDoc, rBuf, eGram, aPos, rErrRef, rTabNames, rRef, bSingleRef, bFromRangeName);
+ ConventionXL_A1::makeRefStr( rLimits, rBuf, eGram, aPos, rErrRef, rTabNames, rRef, bSingleRef, bFromRangeName);
}
virtual OUString makeExternalNameStr( sal_uInt16 nFileId, const OUString& /*rFile*/,
@@ -1513,7 +1513,7 @@ struct ConventionXL_OOX : public ConventionXL_A1
}
virtual void makeExternalRefStr(
- const ScDocument* /*pDoc*/,
+ ScSheetLimits& ,
OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 nFileId, const OUString& /*rFileName*/,
const std::vector<OUString>& rTabNames, const OUString& rTabName,
const ScComplexRefData& rRef ) const override
@@ -1591,7 +1591,7 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
{
ConventionXL_R1C1() : ScCompiler::Convention( FormulaGrammar::CONV_XL_R1C1 ) { }
- virtual void makeRefStr( const ScDocument* pDoc,
+ virtual void makeRefStr( ScSheetLimits& rLimits,
OUStringBuffer& rBuf,
formula::FormulaGrammar::Grammar /*eGram*/,
const ScAddress& rPos,
@@ -1621,7 +1621,7 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
return;
}
- if (aAbsRef.aStart.Col() == 0 && aAbsRef.aEnd.Col() >= pDoc->MaxCol())
+ if (aAbsRef.aStart.Col() == 0 && aAbsRef.aEnd.Col() >= rLimits.mnMaxCol)
{
r1c1_add_row(rBuf, rRef.Ref1, aAbsRef.aStart);
if (aAbsRef.aStart.Row() != aAbsRef.aEnd.Row() ||
@@ -1634,7 +1634,7 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
}
- if (aAbsRef.aStart.Row() == 0 && aAbsRef.aEnd.Row() >= pDoc->MaxRow())
+ if (aAbsRef.aStart.Row() == 0 && aAbsRef.aEnd.Row() >= rLimits.mnMaxRow)
{
r1c1_add_col(rBuf, rRef.Ref1, aAbsRef.aStart);
if (aAbsRef.aStart.Col() != aAbsRef.aEnd.Col() ||
@@ -1718,7 +1718,7 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
}
virtual void makeExternalRefStr(
- const ScDocument* pDoc,
+ ScSheetLimits& rLimits,
OUStringBuffer& rBuffer, const ScAddress& rPos, sal_uInt16 /*nFileId*/, const OUString& rFileName,
const std::vector<OUString>& rTabNames, const OUString& rTabName,
const ScComplexRefData& rRef ) const override
@@ -1735,7 +1735,7 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
return;
}
- if (aAbsRef.aStart.Col() == 0 && aAbsRef.aEnd.Col() >= pDoc->MaxCol())
+ if (aAbsRef.aStart.Col() == 0 && aAbsRef.aEnd.Col() >= rLimits.mnMaxCol)
{
r1c1_add_row(rBuffer, rRef.Ref1, aAbsRef.aStart);
if (aAbsRef.aStart.Row() != aAbsRef.aEnd.Row() || rRef.Ref1.IsRowRel() != rRef.Ref2.IsRowRel())
@@ -1746,7 +1746,7 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
return;
}
- if (aAbsRef.aStart.Row() == 0 && aAbsRef.aEnd.Row() >= pDoc->MaxRow())
+ if (aAbsRef.aStart.Row() == 0 && aAbsRef.aEnd.Row() >= rLimits.mnMaxRow)
{
r1c1_add_col(rBuffer, rRef.Ref1, aAbsRef.aStart);
if (aAbsRef.aStart.Col() != aAbsRef.aEnd.Col() || rRef.Ref1.IsColRel() != rRef.Ref2.IsColRel())
@@ -4658,7 +4658,7 @@ std::unique_ptr<ScTokenArray> ScCompiler::CompileString( const OUString& rFormul
++pFunctionStack[ nFunction ].nSep;
}
}
- FormulaToken* pNewToken = static_cast<ScTokenArray*>(pArr)->Add( maRawToken.CreateToken(pDoc));
+ FormulaToken* pNewToken = static_cast<ScTokenArray*>(pArr)->Add( maRawToken.CreateToken(pDoc->GetSheetLimits()));
if (!pNewToken && eOp == ocArrayClose && pArr->OpCodeBefore( pArr->GetLen()) == ocArrayClose)
{
// Nested inline array or non-value/non-string in array. The
@@ -5026,7 +5026,7 @@ void ScCompiler::CreateStringFromExternal( OUStringBuffer& rBuffer, const Formul
*pFileName << "' '" << t->GetString().getString() << "'");
pConv->makeExternalRefStr(
- pDoc, rBuffer, GetPos(), nFileId, *pFileName, aTabNames, t->GetString().getString(),
+ pDoc->GetSheetLimits(), rBuffer, GetPos(), nFileId, *pFileName, aTabNames, t->GetString().getString(),
*t->GetDoubleRef());
}
break;
@@ -5128,7 +5128,7 @@ void ScCompiler::CreateStringFromSingleRef( OUStringBuffer& rBuffer, const Formu
else
{
rBuffer.append(ScCompiler::GetNativeSymbol(ocErrName));
- pConv->makeRefStr(pDoc, rBuffer, meGrammar, aPos, aErrRef,
+ pConv->makeRefStr(pDoc->GetSheetLimits(), rBuffer, meGrammar, aPos, aErrRef,
GetSetupTabNames(), aRef, true, (pArr && pArr->IsFromRangeName()));
}
}
@@ -5160,14 +5160,14 @@ void ScCompiler::CreateStringFromSingleRef( OUStringBuffer& rBuffer, const Formu
rBuffer.append(aStr);
}
else
- pConv->makeRefStr(pDoc, rBuffer, meGrammar, aPos, aErrRef,
+ pConv->makeRefStr(pDoc->GetSheetLimits(), rBuffer, meGrammar, aPos, aErrRef,
GetSetupTabNames(), aRef, true, (pArr && pArr->IsFromRangeName()));
}
void ScCompiler::CreateStringFromDoubleRef( OUStringBuffer& rBuffer, const FormulaToken* _pTokenP ) const
{
OUString aErrRef = GetCurrentOpCodeMap()->getSymbol(ocErrRef);
- pConv->makeRefStr(pDoc, rBuffer, meGrammar, aPos, aErrRef, GetSetupTabNames(),
+ pConv->makeRefStr(pDoc->GetSheetLimits(), rBuffer, meGrammar, aPos, aErrRef, GetSetupTabNames(),
*_pTokenP->GetDoubleRef(), false, (pArr && pArr->IsFromRangeName()));
}
@@ -5287,7 +5287,7 @@ sal_Unicode ScCompiler::GetNativeAddressSymbol( Convention::SpecialSymbolType eT
FormulaTokenRef ScCompiler::ExtendRangeReference( FormulaToken & rTok1, FormulaToken & rTok2 )
{
- return extendRangeReference( pDoc, rTok1, rTok2, aPos, true/*bReuseDoubleRef*/ );
+ return extendRangeReference( pDoc->GetSheetLimits(), rTok1, rTok2, aPos, true/*bReuseDoubleRef*/ );
}
void ScCompiler::fillAddInToken(::std::vector< css::sheet::FormulaOpCodeMapEntry >& _rVec,bool _bIsEnglish) const
@@ -5519,7 +5519,7 @@ bool ScCompiler::HandleColRowName()
pNew->AddDoubleReference( aRefData );
else
{ // automagically
- pNew->Add( new ScDoubleRefToken( pDoc, aRefData, ocColRowNameAuto ) );
+ pNew->Add( new ScDoubleRefToken( pDoc->GetSheetLimits(), aRefData, ocColRowNameAuto ) );
}
}
PushTokenArray( pNew, true );
@@ -5808,7 +5808,7 @@ bool ScCompiler::HandleTableRef()
if (nError != FormulaError::NONE)
{
aRefData.SetAddress( aRange.aStart, aRange.aStart);
- pTR->SetAreaRefRPN( new ScSingleRefToken(pDoc, aRefData)); // set reference at TableRef
+ pTR->SetAreaRefRPN( new ScSingleRefToken(pDoc->GetSheetLimits(), aRefData)); // set reference at TableRef
pNew->Add( new FormulaErrorToken( nError)); // set error in RPN
}
else
@@ -5837,7 +5837,7 @@ bool ScCompiler::HandleTableRef()
if (nError != FormulaError::NONE)
{
aRefData.SetRange( aRange, aRange.aStart);
- pTR->SetAreaRefRPN( new ScDoubleRefToken(pDoc, aRefData)); // set reference at TableRef
+ pTR->SetAreaRefRPN( new ScDoubleRefToken(pDoc->GetSheetLimits(), aRefData)); // set reference at TableRef
pNew->Add( new FormulaErrorToken( nError)); // set error in RPN
}
else
@@ -6095,7 +6095,7 @@ void ScCompiler::ReplaceDoubleRefII(FormulaToken** ppDoubleRefTok)
aSingleRef.SetAddress(aAddr, aPos);
// Replace the original doubleref token with computed singleref token
- FormulaToken* pNewSingleRefTok = new ScSingleRefToken(pDoc, aSingleRef);
+ FormulaToken* pNewSingleRefTok = new ScSingleRefToken(pDoc->GetSheetLimits(), aSingleRef);
(*ppDoubleRefTok)->DecRef();
*ppDoubleRefTok = pNewSingleRefTok;
pNewSingleRefTok->IncRef();
@@ -6226,7 +6226,7 @@ void ScCompiler::CorrectSumRange(const ScComplexRefData& rBaseRange,
return;
// Replace sum-range token
- FormulaToken* pNewSumRangeTok = new ScDoubleRefToken(pDoc, rSumRange);
+ FormulaToken* pNewSumRangeTok = new ScDoubleRefToken(pDoc->GetSheetLimits(), rSumRange);
(*ppSumRangeToken)->DecRef();
*ppSumRangeToken = pNewSumRangeTok;
pNewSumRangeTok->IncRef();