[Libreoffice-commits] core.git: Branch 'libreoffice-5-2' - sc/source

Michael Meeks michael.meeks at collabora.com
Mon Jul 11 12:24:43 UTC 2016


 sc/source/core/opencl/op_spreadsheet.cxx |   31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

New commits:
commit f250c06228f4d79af849ebe2ada565e42d29b8cd
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Thu Jul 7 20:23:41 2016 +0100

    tdf#99512 - opencl - restrict scope of vlookup optimization to doubles.
    
    Change-Id: Iab7316cb167f34c13adafe142af0fdd73eb7d04c
    Reviewed-on: https://gerrit.libreoffice.org/27100
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    (cherry picked from commit dead5dc1ae3baab5e25d641322d138dd3d242bff)
    Reviewed-on: https://gerrit.libreoffice.org/27104
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/sc/source/core/opencl/op_spreadsheet.cxx b/sc/source/core/opencl/op_spreadsheet.cxx
index c18b2ba..243d299 100644
--- a/sc/source/core/opencl/op_spreadsheet.cxx
+++ b/sc/source/core/opencl/op_spreadsheet.cxx
@@ -45,12 +45,41 @@ void OpVLookup::GenSlidingWindowFunction(std::stringstream &ss,
     CheckSubArgumentIsNan(ss,vSubArguments,arg++);
     int secondParaWidth = 1;
 
+    // tdf#99512 - for now only allow non-dynamic indicees (the
+    // common-case) to validate consistent return types vs. the input.
+    int index = 0;
+    int indexArg = vSubArguments.size() - 2;
+    if (vSubArguments[indexArg]->GetFormulaToken()->GetType() == formula::svDouble)
+    {
+        const formula::FormulaDoubleToken *dblToken = static_cast<const FormulaDoubleToken *>(vSubArguments[indexArg]->GetFormulaToken());
+        index = ::rtl::math::approxFloor(dblToken->GetDouble());
+    }
+
     if (vSubArguments[1]->GetFormulaToken()->GetType() == formula::svDoubleVectorRef)
     {
         FormulaToken *tmpCur = vSubArguments[1]->GetFormulaToken();
         const formula::DoubleVectorRefToken*pCurDVR = static_cast<const formula::DoubleVectorRefToken *>(tmpCur);
-        secondParaWidth = pCurDVR->GetArrays().size();
+        const std::vector<VectorRefArray> items = pCurDVR->GetArrays();
+
+        secondParaWidth = items.size();
+
+        if (index < 1 || index > secondParaWidth)
+            throw Unhandled(__FILE__, __LINE__); // oob index.
+
+        if (items[index - 1].mpStringArray)
+        {
+            rtl_uString **pStrings = items[index - 1].mpStringArray;
+            for (size_t i = 0; i < pCurDVR->GetArrayLength(); ++i)
+            {
+                if (pStrings[i] != nullptr)
+                {   // TODO: the GroupTokenConverter should do better.
+                    throw Unhandled(__FILE__, __LINE__); // mixed arguments.
+                }
+            }
+        }
     }
+    else
+        throw Unhandled(__FILE__, __LINE__); // unusual vlookup.
 
     arg += secondParaWidth;
     CheckSubArgumentIsNan(ss,vSubArguments,arg++);


More information about the Libreoffice-commits mailing list