Kaydet (Commit) b6b0b95b authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Bail out of group calculation in case the array fetching fails.

Change-Id: Ibb7575eeb025fc025d05b147629113796185c5d3
üst 0c53ccd1
...@@ -11,15 +11,34 @@ ...@@ -11,15 +11,34 @@
namespace formula { namespace formula {
VectorRefArray::VectorRefArray() : mpNumericArray(NULL), mpStringArray(NULL) {} VectorRefArray::VectorRefArray() :
VectorRefArray::VectorRefArray( const double* pArray ) : mpNumericArray(pArray), mpStringArray(NULL) {} mpNumericArray(NULL),
VectorRefArray::VectorRefArray( rtl_uString** pArray ) : mpNumericArray(NULL), mpStringArray(pArray) {} mpStringArray(NULL),
mbValid(true) {}
VectorRefArray::VectorRefArray( InitInvalid ) :
mpNumericArray(NULL),
mpStringArray(NULL),
mbValid(false) {}
VectorRefArray::VectorRefArray( const double* pArray ) :
mpNumericArray(pArray),
mpStringArray(NULL),
mbValid(true) {}
VectorRefArray::VectorRefArray( rtl_uString** pArray ) :
mpNumericArray(NULL),
mpStringArray(pArray),
mbValid(true) {}
VectorRefArray::VectorRefArray( const double* pNumArray, rtl_uString** pStrArray ) : VectorRefArray::VectorRefArray( const double* pNumArray, rtl_uString** pStrArray ) :
mpNumericArray(pNumArray), mpStringArray(pStrArray) {} mpNumericArray(pNumArray),
mpStringArray(pStrArray),
mbValid(true) {}
bool VectorRefArray::isValid() const bool VectorRefArray::isValid() const
{ {
return mpNumericArray || mpStringArray; return mbValid;
} }
SingleVectorRefToken::SingleVectorRefToken( const VectorRefArray& rArray, size_t nReqLength, size_t nArrayLength ) : SingleVectorRefToken::SingleVectorRefToken( const VectorRefArray& rArray, size_t nReqLength, size_t nArrayLength ) :
......
...@@ -34,10 +34,15 @@ namespace formula { ...@@ -34,10 +34,15 @@ namespace formula {
*/ */
struct FORMULA_DLLPUBLIC VectorRefArray struct FORMULA_DLLPUBLIC VectorRefArray
{ {
enum InitInvalid { Invalid };
const double* mpNumericArray; const double* mpNumericArray;
rtl_uString** mpStringArray; rtl_uString** mpStringArray;
bool mbValid;
VectorRefArray(); VectorRefArray();
VectorRefArray( InitInvalid );
VectorRefArray( const double* pArray ); VectorRefArray( const double* pArray );
VectorRefArray( rtl_uString** pArray ); VectorRefArray( rtl_uString** pArray );
VectorRefArray( const double* pNumArray, rtl_uString** pStrArray ); VectorRefArray( const double* pNumArray, rtl_uString** pStrArray );
......
...@@ -2426,7 +2426,7 @@ bool hasNonEmpty( const sc::FormulaGroupContext::StrArrayType& rArray, SCROW nRo ...@@ -2426,7 +2426,7 @@ bool hasNonEmpty( const sc::FormulaGroupContext::StrArrayType& rArray, SCROW nRo
formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 ) formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 )
{ {
if (nRow1 > nRow2) if (nRow1 > nRow2)
return formula::VectorRefArray(); return formula::VectorRefArray(formula::VectorRefArray::Invalid);
// See if the requested range is already cached. // See if the requested range is already cached.
sc::FormulaGroupContext& rCxt = pDocument->GetFormulaGroupContext(); sc::FormulaGroupContext& rCxt = pDocument->GetFormulaGroupContext();
...@@ -2470,13 +2470,13 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 ...@@ -2470,13 +2470,13 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
pColArray = rCxt.setCachedColArray(nTab, nCol, &rArray, NULL); pColArray = rCxt.setCachedColArray(nTab, nCol, &rArray, NULL);
if (!pColArray) if (!pColArray)
// Failed to insert a new cached column array. // Failed to insert a new cached column array.
return formula::VectorRefArray(); return formula::VectorRefArray(formula::VectorRefArray::Invalid);
// Fill the remaining array with values from the following blocks. // Fill the remaining array with values from the following blocks.
size_t nPos = itBlk->size; size_t nPos = itBlk->size;
++itBlk; ++itBlk;
if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end())) if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end()))
return formula::VectorRefArray(); return formula::VectorRefArray(formula::VectorRefArray::Invalid);
if (pColArray->mpStrArray) if (pColArray->mpStrArray)
return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]); return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]);
...@@ -2507,7 +2507,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 ...@@ -2507,7 +2507,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
size_t nPos = itBlk->size; size_t nPos = itBlk->size;
++itBlk; ++itBlk;
if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end())) if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end()))
return formula::VectorRefArray(); return formula::VectorRefArray(formula::VectorRefArray::Invalid);
if (pColArray->mpNumArray) if (pColArray->mpNumArray)
return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]); return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]);
...@@ -2524,7 +2524,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 ...@@ -2524,7 +2524,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
pColArray = copyFirstFormulaBlock(rCxt, itBlk, nRow2+1, nTab, nCol); pColArray = copyFirstFormulaBlock(rCxt, itBlk, nRow2+1, nTab, nCol);
if (!pColArray) if (!pColArray)
// Failed to insert a new cached column array. // Failed to insert a new cached column array.
return formula::VectorRefArray(); return formula::VectorRefArray(formula::VectorRefArray::Invalid);
const double* pNum = NULL; const double* pNum = NULL;
rtl_uString** pStr = NULL; rtl_uString** pStr = NULL;
...@@ -2539,12 +2539,12 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 ...@@ -2539,12 +2539,12 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
pColArray = copyFirstFormulaBlock(rCxt, itBlk, nRow2+1, nTab, nCol); pColArray = copyFirstFormulaBlock(rCxt, itBlk, nRow2+1, nTab, nCol);
if (!pColArray) if (!pColArray)
// Failed to insert a new cached column array. // Failed to insert a new cached column array.
return formula::VectorRefArray(); return formula::VectorRefArray(formula::VectorRefArray::Invalid);
size_t nPos = itBlk->size; size_t nPos = itBlk->size;
++itBlk; ++itBlk;
if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end())) if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end()))
return formula::VectorRefArray(); return formula::VectorRefArray(formula::VectorRefArray::Invalid);
const double* pNum = NULL; const double* pNum = NULL;
rtl_uString** pStr = NULL; rtl_uString** pStr = NULL;
...@@ -2564,7 +2564,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 ...@@ -2564,7 +2564,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
pColArray = rCxt.setCachedColArray(nTab, nCol, &rArray, NULL); pColArray = rCxt.setCachedColArray(nTab, nCol, &rArray, NULL);
if (!pColArray) if (!pColArray)
// Failed to insert a new cached column array. // Failed to insert a new cached column array.
return formula::VectorRefArray(); return formula::VectorRefArray(formula::VectorRefArray::Invalid);
if (static_cast<size_t>(nRow2) < itBlk->size) if (static_cast<size_t>(nRow2) < itBlk->size)
return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1]); return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1]);
...@@ -2573,7 +2573,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 ...@@ -2573,7 +2573,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
size_t nPos = itBlk->size; size_t nPos = itBlk->size;
++itBlk; ++itBlk;
if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end())) if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end()))
return formula::VectorRefArray(); return formula::VectorRefArray(formula::VectorRefArray::Invalid);
if (pColArray->mpStrArray && hasNonEmpty(*pColArray->mpStrArray, nRow1, nRow2)) if (pColArray->mpStrArray && hasNonEmpty(*pColArray->mpStrArray, nRow1, nRow2))
return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]); return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]);
...@@ -2585,7 +2585,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 ...@@ -2585,7 +2585,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
; ;
} }
return formula::VectorRefArray(); return formula::VectorRefArray(formula::VectorRefArray::Invalid);
} }
void ScColumn::SetFormulaResults( SCROW nRow, const double* pResults, size_t nLen ) void ScColumn::SetFormulaResults( SCROW nRow, const double* pResults, size_t nLen )
......
...@@ -119,6 +119,9 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode) ...@@ -119,6 +119,9 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode)
if (nTrimLen) if (nTrimLen)
aArray = mrDoc.FetchVectorRefArray(aRefPos, nTrimLen); aArray = mrDoc.FetchVectorRefArray(aRefPos, nTrimLen);
if (!aArray.isValid())
return false;
formula::SingleVectorRefToken aTok(aArray, nLen, nTrimLen); formula::SingleVectorRefToken aTok(aArray, nLen, nTrimLen);
mrGroupTokens.AddToken(aTok); mrGroupTokens.AddToken(aTok);
} }
...@@ -188,6 +191,9 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode) ...@@ -188,6 +191,9 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode)
if (nArrayLength) if (nArrayLength)
aArray = mrDoc.FetchVectorRefArray(aRefPos, nArrayLength); aArray = mrDoc.FetchVectorRefArray(aRefPos, nArrayLength);
if (!aArray.isValid())
return false;
aArrays.push_back(aArray); aArrays.push_back(aArray);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment