summaryrefslogtreecommitdiff
path: root/sc/source/core/tool/interpr4.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/core/tool/interpr4.cxx')
-rw-r--r--sc/source/core/tool/interpr4.cxx79
1 files changed, 57 insertions, 22 deletions
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 1c7ecdd33c78..bfe5b6b632ac 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -1519,6 +1519,28 @@ void ScInterpreter::PopExternalDoubleRef(ScExternalRefCache::TokenArrayRef& rArr
if (nGlobalError)
return;
+ GetExternalDoubleRef(nFileId, aTabName, aData, rArray);
+ if (nGlobalError)
+ return;
+}
+
+void ScInterpreter::PopExternalDoubleRef(ScMatrixRef& rMat)
+{
+ ScExternalRefCache::TokenArrayRef pArray;
+ PopExternalDoubleRef(pArray);
+ if (nGlobalError)
+ return;
+
+ // For now, we only support single range data for external
+ // references, which means the array should only contain a
+ // single matrix token.
+ ScToken* p = static_cast<ScToken*>(pArray->First());
+ rMat = p->GetMatrix();
+}
+
+void ScInterpreter::GetExternalDoubleRef(
+ sal_uInt16 nFileId, const String& rTabName, const ScComplexRefData& rData, ScExternalRefCache::TokenArrayRef& rArray)
+{
ScExternalRefManager* pRefMgr = pDok->GetExternalRefManager();
const String* pFile = pRefMgr->getExternalFileName(nFileId);
if (!pFile)
@@ -1526,18 +1548,19 @@ void ScInterpreter::PopExternalDoubleRef(ScExternalRefCache::TokenArrayRef& rArr
SetError(errNoName);
return;
}
- if (aData.Ref1.IsTabRel() || aData.Ref2.IsTabRel())
+ if (rData.Ref1.IsTabRel() || rData.Ref2.IsTabRel())
{
OSL_FAIL("ScCompiler::GetToken: external double reference must have an absolute table reference!");
SetError(errNoRef);
return;
}
+ ScComplexRefData aData(rData);
aData.CalcAbsIfRel(aPos);
ScRange aRange(aData.Ref1.nCol, aData.Ref1.nRow, aData.Ref1.nTab,
aData.Ref2.nCol, aData.Ref2.nRow, aData.Ref2.nTab);
ScExternalRefCache::TokenArrayRef pArray = pRefMgr->getDoubleRefTokens(
- nFileId, aTabName, aRange, &aPos);
+ nFileId, rTabName, aRange, &aPos);
if (!pArray)
{
@@ -1562,20 +1585,6 @@ void ScInterpreter::PopExternalDoubleRef(ScExternalRefCache::TokenArrayRef& rArr
rArray = pArray;
}
-void ScInterpreter::PopExternalDoubleRef(ScMatrixRef& rMat)
-{
- ScExternalRefCache::TokenArrayRef pArray;
- PopExternalDoubleRef(pArray);
- if (nGlobalError)
- return;
-
- // For now, we only support single range data for external
- // references, which means the array should only contain a
- // single matrix token.
- ScToken* p = static_cast<ScToken*>(pArray->First());
- rMat = p->GetMatrix();
-}
-
sal_Bool ScInterpreter::PopDoubleRefOrSingleRef( ScAddress& rAdr )
{
RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::PopDoubleRefOrSingleRef" );
@@ -1643,6 +1652,7 @@ bool ScInterpreter::ConvertMatrixParameters()
case svDouble:
case svString:
case svSingleRef:
+ case svExternalSingleRef:
case svMissing:
case svError:
case svEmptyCell:
@@ -1700,6 +1710,35 @@ bool ScInterpreter::ConvertMatrixParameters()
}
}
break;
+ case svExternalDoubleRef:
+ {
+ ScParameterClassification::Type eType =
+ ScParameterClassification::GetParameterType( pCur, nParams - i);
+ if (eType == ScParameterClassification::Array)
+ {
+ sal_uInt16 nFileId = p->GetIndex();
+ const String& rTabName = p->GetString();
+ const ScComplexRefData& rRef = static_cast<ScToken*>(p)->GetDoubleRef();
+ ScExternalRefCache::TokenArrayRef pArray;
+ GetExternalDoubleRef(nFileId, rTabName, rRef, pArray);
+ if (nGlobalError)
+ break;
+
+ ScToken* pTemp = static_cast<ScToken*>(pArray->First());
+ if (!pTemp)
+ break;
+
+ ScMatrixRef pMat = pTemp->GetMatrix();
+ if (pMat)
+ {
+ ScToken* pNew = new ScMatrixToken( pMat);
+ pNew->IncRef();
+ pStack[ sp - i ] = pNew;
+ p->DecRef(); // p may be dead now!
+ }
+ }
+ }
+ break;
case svRefList:
{
ScParameterClassification::Type eType =
@@ -2350,13 +2389,9 @@ ScMatValType ScInterpreter::GetDoubleOrStringFromMatrix( double& rDouble,
ScMatrixRef pMat;
StackVar eType = GetStackType();
- if (eType == svExternalDoubleRef)
- {
- PopExternalDoubleRef(pMat);
- }
- else if (eType == svMatrix)
+ if (eType == svExternalDoubleRef || eType == svExternalSingleRef || eType == svMatrix)
{
- pMat = PopMatrix();
+ pMat = GetMatrix();
}
else
{