diff options
author | I-Jui (Ray) Sung <ray@multicorewareinc.com> | 2013-10-29 17:06:53 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-10-29 20:27:46 -0400 |
commit | 43a61b3dd74c059a690b9cf46d294c2908212557 (patch) | |
tree | 21acd54fd27d5691dac10950007adf14cb23300a /sc | |
parent | b3aadaa58c7a5c28132da3d085ce39378fe69ce8 (diff) |
Include a message for unhandled-token in OCL group interpreter.
Also added sanity checks for unhandled cases; i.e. mixed string/numeric
in SingleVectorRefs
Change-Id: I448536f45ec6cf9bc870671646c5ed4ee83ac9f8
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/opencl/formulagroupcl.cxx | 18 | ||||
-rw-r--r-- | sc/source/core/opencl/opbase.hxx | 4 |
2 files changed, 15 insertions, 7 deletions
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 229b639d78d0..c83715e04626 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -807,14 +807,19 @@ DynamicKernelSoPArguments<Op>::DynamicKernelSoPArguments(const std::string &s, const formula::SingleVectorRefToken* pSVR = dynamic_cast< const formula::SingleVectorRefToken* >(pChild); assert(pSVR); - if (pSVR->GetArray().mpNumericArray) + if (pSVR->GetArray().mpNumericArray && + !pSVR->GetArray().mpStringArray) mvSubArguments.push_back( SubArgument(new DynamicKernelArgument(ts, ft->Children[i]))); - else + else if (!pSVR->GetArray().mpNumericArray && + pSVR->GetArray().mpStringArray) mvSubArguments.push_back( SubArgument(new DynamicKernelStringArgument( ts, ft->Children[i]))); + else + throw UnhandledToken(pChild, + "Got both numeric and string vector"); } else if (pChild->GetType() == formula::svDouble) { mvSubArguments.push_back( SubArgument(new DynamicKernelConstantArgument(ts, @@ -824,7 +829,7 @@ DynamicKernelSoPArguments<Op>::DynamicKernelSoPArguments(const std::string &s, SubArgument(new ConstStringArgument(ts, ft->Children[i]))); } else { - throw UnhandledToken(pChild); + throw UnhandledToken(pChild, "unknown operand for ocPush"); } break; case ocDiv: @@ -1095,7 +1100,7 @@ DynamicKernelSoPArguments<Op>::DynamicKernelSoPArguments(const std::string &s, } break; default: - throw UnhandledToken(pChild); + throw UnhandledToken(pChild, "unhandled opcode"); }; } } @@ -1414,8 +1419,9 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, return true; } #undef NO_FALLBACK_TO_SWINTERP /* undef this for non-TDD runs */ - catch (const UnhandledToken&) { - std::cerr << "Dynamic formual compiler: unhandled token\n"; + catch (const UnhandledToken &ut) { + std::cerr << "\nDynamic formual compiler: unhandled token: "; + std::cerr << ut.mMessage << "\n"; #ifdef NO_FALLBACK_TO_SWINTERP assert(false); #else diff --git a/sc/source/core/opencl/opbase.hxx b/sc/source/core/opencl/opbase.hxx index 93f68208bce2..a858ede34cba 100644 --- a/sc/source/core/opencl/opbase.hxx +++ b/sc/source/core/opencl/opbase.hxx @@ -25,8 +25,10 @@ namespace sc { namespace opencl { class UnhandledToken { public: - UnhandledToken(formula::FormulaToken *t): mToken(t) {} + UnhandledToken(formula::FormulaToken *t, + const char *const m): mToken(t), mMessage(m) {} formula::FormulaToken *mToken; + std::string mMessage; }; /// Failed in marshaling |