Kaydet (Commit) 7e91726f authored tarafından Tor Lillqvist's avatar Tor Lillqvist

Treat an array of null string pointers as no strings for OpenCL

For some reason, at least in the case of the "Test OpenCL" thing, we get here
an mpStringArray that is non-null but where all the elements (rtl_uString
pointers) in it are null. Treat that case as if the mpStringArray was null.

This makes the tests "Test OpenCL" actually use OpenCL. Maybe it has other
useful effects, too. (But for normal spreadsheet use, the mpStringArray that
gets handled here *is* null when all the cells used by a formula group are
numbers. At least it seemed so in a simple test.)

Also add more useful (?) SAL_INFO calls in the area.

Change-Id: I1388786a3a0765af6eb01a63da31e5b83c7a616d
üst 737e2061
...@@ -152,6 +152,19 @@ std::string linenumberify(const std::string& s) ...@@ -152,6 +152,19 @@ std::string linenumberify(const std::string& s)
} }
#endif #endif
bool AllStringsAreNull(const rtl_uString* const* pStringArray, size_t nLength)
{
if (pStringArray == nullptr)
return true;
for (size_t i = 0; i < nLength; i++)
if (pStringArray[i] != nullptr)
return false;
return true;
}
} // anonymous namespace } // anonymous namespace
/// Map the buffer used by an argument and do necessary argument setting /// Map the buffer used by an argument and do necessary argument setting
...@@ -2615,8 +2628,10 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config, ...@@ -2615,8 +2628,10 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config,
for (size_t j = 0; j < pDVR->GetArrays().size(); ++j) for (size_t j = 0; j < pDVR->GetArrays().size(); ++j)
{ {
SAL_INFO("sc.opencl", "j=" << j << " mpNumericArray=" << pDVR->GetArrays()[j].mpNumericArray << SAL_INFO("sc.opencl", "i=" << i << " j=" << j <<
" mpNumericArray=" << pDVR->GetArrays()[j].mpNumericArray <<
" mpStringArray=" << pDVR->GetArrays()[j].mpStringArray << " mpStringArray=" << pDVR->GetArrays()[j].mpStringArray <<
" allStringsAreNull=" << (AllStringsAreNull(pDVR->GetArrays()[j].mpStringArray, pDVR->GetArrayLength())?"YES":"NO") <<
" takeNumeric=" << (pCodeGen->takeNumeric()?"YES":"NO") << " takeNumeric=" << (pCodeGen->takeNumeric()?"YES":"NO") <<
" takeString=" << (pCodeGen->takeString()?"YES":"NO")); " takeString=" << (pCodeGen->takeString()?"YES":"NO"));
...@@ -2629,6 +2644,8 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config, ...@@ -2629,6 +2644,8 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config,
pDVR->GetArrays()[j].mpStringArray && pDVR->GetArrays()[j].mpStringArray &&
pCodeGen->takeString()) pCodeGen->takeString())
{ {
// Function takes numbers or strings, there are both
SAL_INFO("sc.opencl", "Numbers and strings and that is OK");
mvSubArguments.push_back( mvSubArguments.push_back(
DynamicKernelArgumentRef( DynamicKernelArgumentRef(
new DynamicKernelMixedSlidingArgument(mCalcConfig, new DynamicKernelMixedSlidingArgument(mCalcConfig,
...@@ -2636,16 +2653,22 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config, ...@@ -2636,16 +2653,22 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config,
} }
else else
{ {
// Not sure I can figure out what case this exactly is;)
SAL_INFO("sc.opencl", "The other case");
mvSubArguments.push_back( mvSubArguments.push_back(
DynamicKernelArgumentRef(VectorRefFactory<VectorRef>(mCalcConfig, DynamicKernelArgumentRef(VectorRefFactory<VectorRef>(mCalcConfig,
ts, ft->Children[i], mpCodeGen, j))); ts, ft->Children[i], mpCodeGen, j)));
} }
} }
else else
{
// Ditto here. This is such crack.
SAL_INFO("sc.opencl", "The outer other case (can't figure out what it exactly means)");
mvSubArguments.push_back( mvSubArguments.push_back(
DynamicKernelArgumentRef(VectorRefFactory DynamicKernelArgumentRef(VectorRefFactory
<DynamicKernelStringArgument>(mCalcConfig, <DynamicKernelStringArgument>(mCalcConfig,
ts, ft->Children[i], mpCodeGen, j))); ts, ft->Children[i], mpCodeGen, j)));
}
} }
} }
else if (pChild->GetType() == formula::svSingleVectorRef) else if (pChild->GetType() == formula::svSingleVectorRef)
...@@ -2653,8 +2676,10 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config, ...@@ -2653,8 +2676,10 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config,
const formula::SingleVectorRefToken* pSVR = const formula::SingleVectorRefToken* pSVR =
static_cast<const formula::SingleVectorRefToken*>(pChild); static_cast<const formula::SingleVectorRefToken*>(pChild);
SAL_INFO("sc.opencl", "mpNumericArray=" << pSVR->GetArray().mpNumericArray << SAL_INFO("sc.opencl", "i=" << i <<
" mpNumericArray=" << pSVR->GetArray().mpNumericArray <<
" mpStringArray=" << pSVR->GetArray().mpStringArray << " mpStringArray=" << pSVR->GetArray().mpStringArray <<
" allStringsAreNull=" << (AllStringsAreNull(pSVR->GetArray().mpStringArray, pSVR->GetArrayLength())?"YES":"NO") <<
" takeNumeric=" << (pCodeGen->takeNumeric()?"YES":"NO") << " takeNumeric=" << (pCodeGen->takeNumeric()?"YES":"NO") <<
" takeString=" << (pCodeGen->takeString()?"YES":"NO")); " takeString=" << (pCodeGen->takeString()?"YES":"NO"));
...@@ -2664,17 +2689,19 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config, ...@@ -2664,17 +2689,19 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config,
pCodeGen->takeString()) pCodeGen->takeString())
{ {
// Function takes numbers or strings, there are both // Function takes numbers or strings, there are both
SAL_INFO("sc.opencl", "Numbers and strings and that is OK");
mvSubArguments.push_back( mvSubArguments.push_back(
DynamicKernelArgumentRef(new DynamicKernelMixedArgument(mCalcConfig, DynamicKernelArgumentRef(new DynamicKernelMixedArgument(mCalcConfig,
ts, ft->Children[i]))); ts, ft->Children[i])));
} }
else if (pSVR->GetArray().mpNumericArray && else if (pSVR->GetArray().mpNumericArray &&
pCodeGen->takeNumeric() && pCodeGen->takeNumeric() &&
(pSVR->GetArray().mpStringArray == NULL || mCalcConfig.meStringConversion == ScCalcConfig::StringConversion::ZERO)) (AllStringsAreNull(pSVR->GetArray().mpStringArray, pSVR->GetArrayLength()) || mCalcConfig.meStringConversion == ScCalcConfig::StringConversion::ZERO))
{ {
// Function takes numbers, and either there // Function takes numbers, and either there
// are no strings, or there are strings but // are no strings, or there are strings but
// they are to be treated as zero // they are to be treated as zero
SAL_INFO("sc.opencl", "Maybe strings even if want numbers but should be treated as zero");
mvSubArguments.push_back( mvSubArguments.push_back(
DynamicKernelArgumentRef(new VectorRef(mCalcConfig, ts, DynamicKernelArgumentRef(new VectorRef(mCalcConfig, ts,
ft->Children[i]))); ft->Children[i])));
...@@ -2686,6 +2713,7 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config, ...@@ -2686,6 +2713,7 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config,
{ {
// Function takes numbers, and there are only // Function takes numbers, and there are only
// strings, but they are to be treated as zero // strings, but they are to be treated as zero
SAL_INFO("sc.opencl", "Only strings even if want numbers but should be treated as zero");
mvSubArguments.push_back( mvSubArguments.push_back(
DynamicKernelArgumentRef(new VectorRef(mCalcConfig, ts, DynamicKernelArgumentRef(new VectorRef(mCalcConfig, ts,
ft->Children[i]))); ft->Children[i])));
...@@ -2693,28 +2721,32 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config, ...@@ -2693,28 +2721,32 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config,
else if (pSVR->GetArray().mpStringArray && else if (pSVR->GetArray().mpStringArray &&
pCodeGen->takeString()) pCodeGen->takeString())
{ {
// There are strings, and the function takes // There are strings, and the function takes strings.
// strings. SAL_INFO("sc.opencl", "Strings only");
mvSubArguments.push_back( mvSubArguments.push_back(
DynamicKernelArgumentRef(new DynamicKernelStringArgument(mCalcConfig, DynamicKernelArgumentRef(new DynamicKernelStringArgument(mCalcConfig,
ts, ft->Children[i]))); ts, ft->Children[i])));
} }
else if (pSVR->GetArray().mpStringArray == NULL && else if (AllStringsAreNull(pSVR->GetArray().mpStringArray, pSVR->GetArrayLength()) &&
pSVR->GetArray().mpNumericArray == NULL) pSVR->GetArray().mpNumericArray == NULL)
{ {
// There are only empty cells. Push as an // There are only empty cells. Push as an
// array of NANs // array of NANs
SAL_INFO("sc.opencl", "Only empty cells");
mvSubArguments.push_back( mvSubArguments.push_back(
DynamicKernelArgumentRef(new VectorRef(mCalcConfig, ts, DynamicKernelArgumentRef(new VectorRef(mCalcConfig, ts,
ft->Children[i]))); ft->Children[i])));
} }
else else
{
SAL_INFO("sc.opencl", "Fallback case, rejecting for OpenCL");
throw UnhandledToken(pChild, throw UnhandledToken(pChild,
"Got unhandled case here", __FILE__, __LINE__); "Got unhandled case here", __FILE__, __LINE__);
}
} }
else if (pChild->GetType() == formula::svDouble) else if (pChild->GetType() == formula::svDouble)
{ {
SAL_INFO("sc.opencl", "Constant number (?) case");
mvSubArguments.push_back( mvSubArguments.push_back(
DynamicKernelArgumentRef(new DynamicKernelConstantArgument(mCalcConfig, ts, DynamicKernelArgumentRef(new DynamicKernelConstantArgument(mCalcConfig, ts,
ft->Children[i]))); ft->Children[i])));
...@@ -2722,12 +2754,14 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config, ...@@ -2722,12 +2754,14 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(const ScCalcConfig& config,
else if (pChild->GetType() == formula::svString else if (pChild->GetType() == formula::svString
&& pCodeGen->takeString()) && pCodeGen->takeString())
{ {
SAL_INFO("sc.opencl", "Constant string (?) case");
mvSubArguments.push_back( mvSubArguments.push_back(
DynamicKernelArgumentRef(new ConstStringArgument(mCalcConfig, ts, DynamicKernelArgumentRef(new ConstStringArgument(mCalcConfig, ts,
ft->Children[i]))); ft->Children[i])));
} }
else else
{ {
SAL_INFO("sc.opencl", "Fallback case, rejecting for OpenCL");
throw UnhandledToken(pChild, ("unhandled operand " + StackVarEnumToString(pChild->GetType()) + " for ocPush").c_str()); throw UnhandledToken(pChild, ("unhandled operand " + StackVarEnumToString(pChild->GetType()) + " for ocPush").c_str());
} }
break; break;
......
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