diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2016-07-07 20:23:41 +0100 |
---|---|---|
committer | Jan Holesovsky <kendy@collabora.com> | 2016-07-11 12:23:45 +0000 |
commit | 9613bb90986277f3a222bea9a6d6d11f53a36622 (patch) | |
tree | 2d355407b3d38d60452000ce39ed226a2896e30a | |
parent | 88065eebdf9bc557b2c5d982b0beacb19ef2ad36 (diff) |
tdf#99512 - opencl - restrict scope of vlookup optimization to doubles.
Change-Id: Iab7316cb167f34c13adafe142af0fdd73eb7d04c
Reviewed-on: https://gerrit.libreoffice.org/27100
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
(cherry picked from commit dead5dc1ae3baab5e25d641322d138dd3d242bff)
Reviewed-on: https://gerrit.libreoffice.org/27105
Reviewed-by: Jan Holesovsky <kendy@collabora.com>
-rw-r--r-- | sc/source/core/opencl/op_spreadsheet.cxx | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/sc/source/core/opencl/op_spreadsheet.cxx b/sc/source/core/opencl/op_spreadsheet.cxx index c18b2ba87a52..243d2993bca3 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++); |