[Libreoffice-commits] core.git: formula/source include/formula sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Wed May 14 13:25:20 PDT 2014


 formula/source/core/api/vectortoken.cxx     |   29 +++++++++++++++++++++++-----
 include/formula/vectortoken.hxx             |    5 ++++
 sc/source/core/data/column2.cxx             |   20 +++++++++----------
 sc/source/core/data/grouptokenconverter.cxx |    6 +++++
 4 files changed, 45 insertions(+), 15 deletions(-)

New commits:
commit b6b0b95bae845a2a59831f4e3ae63de3e54a2984
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Wed May 14 16:23:11 2014 -0400

    Bail out of group calculation in case the array fetching fails.
    
    Change-Id: Ibb7575eeb025fc025d05b147629113796185c5d3

diff --git a/formula/source/core/api/vectortoken.cxx b/formula/source/core/api/vectortoken.cxx
index bd75efb..c1ff94c 100644
--- a/formula/source/core/api/vectortoken.cxx
+++ b/formula/source/core/api/vectortoken.cxx
@@ -11,15 +11,34 @@
 
 namespace formula {
 
-VectorRefArray::VectorRefArray() : mpNumericArray(NULL), mpStringArray(NULL) {}
-VectorRefArray::VectorRefArray( const double* pArray ) : mpNumericArray(pArray), mpStringArray(NULL) {}
-VectorRefArray::VectorRefArray( rtl_uString** pArray ) : mpNumericArray(NULL), mpStringArray(pArray) {}
+VectorRefArray::VectorRefArray() :
+    mpNumericArray(NULL),
+    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 ) :
-    mpNumericArray(pNumArray), mpStringArray(pStrArray) {}
+    mpNumericArray(pNumArray),
+    mpStringArray(pStrArray),
+    mbValid(true) {}
 
 bool VectorRefArray::isValid() const
 {
-    return mpNumericArray || mpStringArray;
+    return mbValid;
 }
 
 SingleVectorRefToken::SingleVectorRefToken( const VectorRefArray& rArray, size_t nReqLength, size_t nArrayLength ) :
diff --git a/include/formula/vectortoken.hxx b/include/formula/vectortoken.hxx
index 125dd40..0c28f7e 100644
--- a/include/formula/vectortoken.hxx
+++ b/include/formula/vectortoken.hxx
@@ -34,10 +34,15 @@ namespace formula {
  */
 struct FORMULA_DLLPUBLIC VectorRefArray
 {
+    enum InitInvalid { Invalid };
+
     const double* mpNumericArray;
     rtl_uString** mpStringArray;
 
+    bool mbValid;
+
     VectorRefArray();
+    VectorRefArray( InitInvalid );
     VectorRefArray( const double* pArray );
     VectorRefArray( rtl_uString** pArray );
     VectorRefArray( const double* pNumArray, rtl_uString** pStrArray );
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 56fe643..d6019be 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -2426,7 +2426,7 @@ bool hasNonEmpty( const sc::FormulaGroupContext::StrArrayType& rArray, SCROW nRo
 formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2 )
 {
     if (nRow1 > nRow2)
-        return formula::VectorRefArray();
+        return formula::VectorRefArray(formula::VectorRefArray::Invalid);
 
     // See if the requested range is already cached.
     sc::FormulaGroupContext& rCxt = pDocument->GetFormulaGroupContext();
@@ -2470,13 +2470,13 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
             pColArray = rCxt.setCachedColArray(nTab, nCol, &rArray, NULL);
             if (!pColArray)
                 // 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.
             size_t nPos = itBlk->size;
             ++itBlk;
             if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end()))
-                return formula::VectorRefArray();
+                return formula::VectorRefArray(formula::VectorRefArray::Invalid);
 
             if (pColArray->mpStrArray)
                 return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]);
@@ -2507,7 +2507,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
             size_t nPos = itBlk->size;
             ++itBlk;
             if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end()))
-                return formula::VectorRefArray();
+                return formula::VectorRefArray(formula::VectorRefArray::Invalid);
 
             if (pColArray->mpNumArray)
                 return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]);
@@ -2524,7 +2524,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
                 pColArray = copyFirstFormulaBlock(rCxt, itBlk, nRow2+1, nTab, nCol);
                 if (!pColArray)
                     // Failed to insert a new cached column array.
-                    return formula::VectorRefArray();
+                    return formula::VectorRefArray(formula::VectorRefArray::Invalid);
 
                 const double* pNum = NULL;
                 rtl_uString** pStr = NULL;
@@ -2539,12 +2539,12 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
             pColArray = copyFirstFormulaBlock(rCxt, itBlk, nRow2+1, nTab, nCol);
             if (!pColArray)
                 // Failed to insert a new cached column array.
-                return formula::VectorRefArray();
+                return formula::VectorRefArray(formula::VectorRefArray::Invalid);
 
             size_t nPos = itBlk->size;
             ++itBlk;
             if (!appendToBlock(pDocument, rCxt, *pColArray, nPos, nRow2+1, itBlk, maCells.end()))
-                return formula::VectorRefArray();
+                return formula::VectorRefArray(formula::VectorRefArray::Invalid);
 
             const double* pNum = NULL;
             rtl_uString** pStr = NULL;
@@ -2564,7 +2564,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
             pColArray = rCxt.setCachedColArray(nTab, nCol, &rArray, NULL);
             if (!pColArray)
                 // 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)
                 return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1]);
@@ -2573,7 +2573,7 @@ formula::VectorRefArray ScColumn::FetchVectorRefArray( SCROW nRow1, SCROW nRow2
             size_t nPos = itBlk->size;
             ++itBlk;
             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))
                 return formula::VectorRefArray(&(*pColArray->mpNumArray)[nRow1], &(*pColArray->mpStrArray)[nRow1]);
@@ -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 )
diff --git a/sc/source/core/data/grouptokenconverter.cxx b/sc/source/core/data/grouptokenconverter.cxx
index a43efb0..537bd21 100644
--- a/sc/source/core/data/grouptokenconverter.cxx
+++ b/sc/source/core/data/grouptokenconverter.cxx
@@ -119,6 +119,9 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode)
                     if (nTrimLen)
                         aArray = mrDoc.FetchVectorRefArray(aRefPos, nTrimLen);
 
+                    if (!aArray.isValid())
+                        return false;
+
                     formula::SingleVectorRefToken aTok(aArray, nLen, nTrimLen);
                     mrGroupTokens.AddToken(aTok);
                 }
@@ -188,6 +191,9 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode)
                     if (nArrayLength)
                         aArray = mrDoc.FetchVectorRefArray(aRefPos, nArrayLength);
 
+                    if (!aArray.isValid())
+                        return false;
+
                     aArrays.push_back(aArray);
                 }
 


More information about the Libreoffice-commits mailing list