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

Tor Lillqvist tml at collabora.com
Fri Feb 6 00:05:32 PST 2015


 include/opencl/openclwrapper.hxx         |    6 
 opencl/source/openclwrapper.cxx          |   58 +
 sc/source/core/opencl/formulagroupcl.cxx |  186 ++-
 sc/source/core/opencl/op_addin.cxx       |   16 
 sc/source/core/opencl/op_financial.cxx   |  601 -----------
 sc/source/core/opencl/op_logical.cxx     |   12 
 sc/source/core/opencl/op_math.cxx        |  233 ----
 sc/source/core/opencl/op_statistical.cxx | 1680 -------------------------------
 sc/source/core/opencl/opbase.cxx         |   87 -
 sc/source/core/opencl/opbase.hxx         |    7 
 10 files changed, 186 insertions(+), 2700 deletions(-)

New commits:
commit 641835ec3234da3744a4ea3c15ff3c4e3aef1528
Author: Tor Lillqvist <tml at collabora.com>
Date:   Fri Feb 6 02:32:15 2015 +0200

    Report errors from clRelease*() APIs
    
    Change-Id: Id30afe5bf954e26515bf8cca6f1ee8bc018fb835

diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index d508141..9804c72 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -1062,7 +1062,9 @@ public:
     {
         if (mpClmem2)
         {
-            clReleaseMemObject(mpClmem2);
+            cl_int err;
+            err = clReleaseMemObject(mpClmem2);
+            SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err));
             mpClmem2 = NULL;
         }
     }
@@ -1571,7 +1573,8 @@ public:
                 SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err));
             if (mpClmem2)
             {
-                clReleaseMemObject(mpClmem2);
+                err = clReleaseMemObject(mpClmem2);
+                SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err));
                 mpClmem2 = NULL;
             }
             mpClmem2 = clCreateBuffer(kEnv.mpkContext,
@@ -1592,7 +1595,9 @@ public:
     {
         if (mpClmem2)
         {
-            clReleaseMemObject(mpClmem2);
+            cl_int err;
+            err = clReleaseMemObject(mpClmem2);
+            SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err));
             mpClmem2 = NULL;
         }
     }
@@ -2314,10 +2319,14 @@ public:
                     global_work_size, local_work_size, 0, NULL, NULL);
                 if (CL_SUCCESS != err)
                     throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__);
+
                 err = clFinish(kEnv.mpkCmdQueue);
                 if (CL_SUCCESS != err)
                     throw OpenCLError("clFinish", err, __FILE__, __LINE__);
-                clReleaseKernel(redKernel);
+
+                err = clReleaseKernel(redKernel);
+                SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseKernel failed: " << ::opencl::errorString(err));
+
                 // Pass mpClmem2 to the "real" kernel
                 SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << mpClmem2);
                 err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&mpClmem2);
@@ -2431,7 +2440,9 @@ public:
     {
         if (mpClmem2)
         {
-            clReleaseMemObject(mpClmem2);
+            cl_int err;
+            err = clReleaseMemObject(mpClmem2);
+            SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err));
             mpClmem2 = NULL;
         }
     }
@@ -3597,13 +3608,16 @@ DynamicKernel::DynamicKernel( const FormulaTreeNodeRef& r, int nResultSize ) :
 
 DynamicKernel::~DynamicKernel()
 {
+    cl_int err;
     if (mpResClmem)
     {
-        clReleaseMemObject(mpResClmem);
+        err = clReleaseMemObject(mpResClmem);
+        SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err));
     }
     if (mpKernel)
     {
-        clReleaseKernel(mpKernel);
+        err = clReleaseKernel(mpKernel);
+        SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseKernel failed: " << ::opencl::errorString(err));
     }
     // mpProgram is not going to be released here -- it's cached.
 }
@@ -3706,7 +3720,8 @@ void DynamicKernel::CreateKernel()
 
         if (lastSecondProgram)
         {
-            clReleaseProgram(lastSecondProgram);
+            err = clReleaseProgram(lastSecondProgram);
+            SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseProgram failed: " << ::opencl::errorString(err));
         }
         if (::opencl::buildProgramFromBinary("",
                 &::opencl::gpuEnv, KernelHash.c_str(), 0))
diff --git a/sc/source/core/opencl/opbase.cxx b/sc/source/core/opencl/opbase.cxx
index 671987e..ac97249 100644
--- a/sc/source/core/opencl/opbase.cxx
+++ b/sc/source/core/opencl/opbase.cxx
@@ -107,7 +107,9 @@ VectorRef::~VectorRef()
 {
     if (mpClmem)
     {
-        clReleaseMemObject(mpClmem);
+        cl_int err;
+        err = clReleaseMemObject(mpClmem);
+        SAL_WARN_IF(err != CL_SUCCESS, "sc.opencl", "clReleaseMemObject failed: " << ::opencl::errorString(err));
     }
 }
 
commit e0f78c7faf6a9d1fd30944d77a3f93102a652939
Author: Tor Lillqvist <tml at collabora.com>
Date:   Fri Feb 6 02:12:30 2015 +0200

    Unmap the host buffer only after done accessing it
    
    Most likely 64c479e9da02f724e1870649c99fac92f5f27cd3 accidentally made the
    code unmap the host buffer before it is accessed, but the code continued to
    work by accident in many (most?) cases. Either because in the case of OpenCL
    devices that share memory with the CPU, the host buffer *is* the OpenCL
    buffer, so even if the host buffer is "unmapped", it still exists. In the
    case of GPU device with separate memory, using the host buffer after unmapping
    corresponds simply to a case of use after free of a heap-allocated buffer,
    which often happens to work.
    
    Found by code reading.
    
    Change-Id: I9e2b4574077a267938702c0f81c4b1cba9c9a183

diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index 381fb1d..d508141 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -3965,13 +3965,6 @@ public:
             mpResBuf = NULL;
             return;
         }
-
-        err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpCLResBuf, mpResBuf, 0, NULL, NULL);
-        if (err != CL_SUCCESS)
-        {
-            SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err));
-            mpResBuf = NULL;
-        }
     }
 
     bool pushResultToDocument( ScDocument& rDoc, const ScAddress& rTopPos )
@@ -3980,6 +3973,20 @@ public:
             return false;
 
         rDoc.SetFormulaResults(rTopPos, mpResBuf, mnGroupLength);
+
+        // Obtain cl context
+        ::opencl::KernelEnv kEnv;
+        ::opencl::setKernelEnv(&kEnv);
+
+        cl_int err;
+        err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpCLResBuf, mpResBuf, 0, NULL, NULL);
+
+        if (err != CL_SUCCESS)
+        {
+            SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err));
+            return false;
+        }
+
         return true;
     }
 };
commit 6a2576150b5152244dc3f8c31b745fa634b31a47
Author: Tor Lillqvist <tml at collabora.com>
Date:   Fri Feb 6 00:15:04 2015 +0200

    Improve OpenCL error messages
    
    Add the name of the function that failed to the OpenCLError class. Log OpenCL
    failure in a couple of more places (where OpenCLError is not thrown). Print
    OpenCL errors symbolically instead of numerically where applicable.
    
    Change-Id: I60f910e9ea7b75af7ec506553d7a73ad99ba4366

diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index 18aed00..381fb1d 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -169,7 +169,7 @@ size_t VectorRef::Marshal( cl_kernel k, int argno, int, cl_program )
             szHostBuffer,
             pHostBuffer, &err);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__);
         SAL_INFO("sc.opencl", "Created buffer " << mpClmem << " size " << szHostBuffer << " using host buffer " << pHostBuffer);
     }
     else
@@ -181,24 +181,28 @@ size_t VectorRef::Marshal( cl_kernel k, int argno, int, cl_program )
             (cl_mem_flags)CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR,
             szHostBuffer, NULL, &err);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__);
         SAL_INFO("sc.opencl", "Created buffer " << mpClmem << " size " << szHostBuffer);
 
         double* pNanBuffer = (double*)clEnqueueMapBuffer(
             kEnv.mpkCmdQueue, mpClmem, CL_TRUE, CL_MAP_WRITE, 0,
             szHostBuffer, 0, NULL, NULL, &err);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clEnqueueMapBuffer", err, __FILE__, __LINE__);
+
         for (size_t i = 0; i < szHostBuffer / sizeof(double); i++)
             pNanBuffer[i] = NAN;
         err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpClmem,
             pNanBuffer, 0, NULL, NULL);
+        // FIXME: Is it intentional to not throw an OpenCLError even if the clEnqueueUnmapMemObject() fails?
+        if (CL_SUCCESS != err)
+            SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err));
     }
 
     SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << mpClmem);
     err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&mpClmem);
     if (CL_SUCCESS != err)
-        throw OpenCLError(err, __FILE__, __LINE__);
+        throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
     return 1;
 }
 
@@ -257,7 +261,7 @@ public:
         SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_uint: " << hashCode);
         cl_int err = clSetKernelArg(k, argno, sizeof(cl_uint), (void*)&hashCode);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
         return 1;
     }
 };
@@ -307,7 +311,7 @@ public:
         SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": double: " << tmp);
         cl_int err = clSetKernelArg(k, argno, sizeof(double), (void*)&tmp);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
         return 1;
     }
 };
@@ -347,7 +351,7 @@ public:
         SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": double: " << tmp);
         cl_int err = clSetKernelArg(k, argno, sizeof(double), (void*)&tmp);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
         return 1;
     }
 };
@@ -707,7 +711,7 @@ threefry2x32 (threefry2x32_ctr_t in, threefry2x32_key_t k)\n\
         SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_int: " << seed);
         cl_int err = clSetKernelArg(k, argno, sizeof(cl_int), (void*)&seed);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
         return 1;
     }
 };
@@ -767,14 +771,14 @@ size_t DynamicKernelStringArgument::Marshal( cl_kernel k, int argno, int, cl_pro
             (cl_mem_flags)CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR,
             szHostBuffer, NULL, &err);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__);
         SAL_INFO("sc.opencl", "Created buffer " << mpClmem << " size " << szHostBuffer);
 
         pHashBuffer = (cl_uint*)clEnqueueMapBuffer(
             kEnv.mpkCmdQueue, mpClmem, CL_TRUE, CL_MAP_WRITE, 0,
             szHostBuffer, 0, NULL, NULL, &err);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clEnqueueMapBuffer", err, __FILE__, __LINE__);
 
         for (size_t i = 0; i < nStrings; i++)
         {
@@ -798,14 +802,14 @@ size_t DynamicKernelStringArgument::Marshal( cl_kernel k, int argno, int, cl_pro
             (cl_mem_flags)CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR,
             szHostBuffer, NULL, &err);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__);
         SAL_INFO("sc.opencl", "Created buffer " << mpClmem << " size " << szHostBuffer);
 
         pHashBuffer = (cl_uint*)clEnqueueMapBuffer(
             kEnv.mpkCmdQueue, mpClmem, CL_TRUE, CL_MAP_WRITE, 0,
             szHostBuffer, 0, NULL, NULL, &err);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clEnqueueMapBuffer", err, __FILE__, __LINE__);
 
         for (size_t i = 0; i < szHostBuffer / sizeof(cl_int); i++)
             pHashBuffer[i] = 0;
@@ -813,12 +817,12 @@ size_t DynamicKernelStringArgument::Marshal( cl_kernel k, int argno, int, cl_pro
     err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpClmem,
         pHashBuffer, 0, NULL, NULL);
     if (CL_SUCCESS != err)
-        throw OpenCLError(err, __FILE__, __LINE__);
+        throw OpenCLError("clEnqueueUnmapMemObject", err, __FILE__, __LINE__);
 
     SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << mpClmem);
     err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&mpClmem);
     if (CL_SUCCESS != err)
-        throw OpenCLError(err, __FILE__, __LINE__);
+        throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
     return 1;
 }
 
@@ -1449,7 +1453,7 @@ public:
             CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR,
             sizeof(double) * w, NULL, NULL);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__);
         SAL_INFO("sc.opencl", "Created buffer " << mpClmem2 << " size " << sizeof(double) << "*" << w << "=" << (sizeof(double)*w));
 
         // reproduce the reduction function name
@@ -1460,7 +1464,7 @@ public:
             kernelName = Base::GetName() + "_sum_reduction";
         cl_kernel redKernel = clCreateKernel(mpProgram, kernelName.c_str(), &err);
         if (err != CL_SUCCESS)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clCreateKernel", err, __FILE__, __LINE__);
         // set kernel arg of reduction kernel
         // TODO(Wei Wei): use unique name for kernel
         cl_mem buf = Base::GetCLBuffer();
@@ -1468,22 +1472,22 @@ public:
         err = clSetKernelArg(redKernel, 0, sizeof(cl_mem),
             (void*)&buf);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
 
         SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 1 << ": cl_mem: " << mpClmem2);
         err = clSetKernelArg(redKernel, 1, sizeof(cl_mem), (void*)&mpClmem2);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
 
         SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 2 << ": cl_int: " << nInput);
         err = clSetKernelArg(redKernel, 2, sizeof(cl_int), (void*)&nInput);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
 
         SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 3 << ": cl_int: " << nCurWindowSize);
         err = clSetKernelArg(redKernel, 3, sizeof(cl_int), (void*)&nCurWindowSize);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
 
         // set work group size and execute
         size_t global_work_size[] = { 256, (size_t)w };
@@ -1492,10 +1496,10 @@ public:
         err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, redKernel, 2, NULL,
             global_work_size, local_work_size, 0, NULL, NULL);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__);
         err = clFinish(kEnv.mpkCmdQueue);
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clFinish", err, __FILE__, __LINE__);
         if (dynamic_cast<OpAverage*>(mpCodeGen.get()))
         {
             /*average need more reduction kernel for count computing*/
@@ -1506,40 +1510,40 @@ public:
                 sizeof(double) * w, 0, NULL, NULL,
                 &err);
             if (err != CL_SUCCESS)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clEnqueueMapBuffer", err, __FILE__, __LINE__);
 
             for (int i = 0; i < w; i++)
                 pAllBuffer[i] = resbuf[i];
             err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpClmem2, resbuf, 0, NULL, NULL);
             if (err != CL_SUCCESS)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clEnqueueUnmapMemObject", err, __FILE__, __LINE__);
 
             kernelName = Base::GetName() + "_count_reduction";
             redKernel = clCreateKernel(mpProgram, kernelName.c_str(), &err);
             if (err != CL_SUCCESS)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clCreateKernel", err, __FILE__, __LINE__);
             // set kernel arg of reduction kernel
             buf = Base::GetCLBuffer();
             SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 0 << ": cl_mem: " << buf);
             err = clSetKernelArg(redKernel, 0, sizeof(cl_mem),
                 (void*)&buf);
             if (CL_SUCCESS != err)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
 
             SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 1 << ": cl_mem: " << mpClmem2);
             err = clSetKernelArg(redKernel, 1, sizeof(cl_mem), (void*)&mpClmem2);
             if (CL_SUCCESS != err)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
 
             SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 2 << ": cl_int: " << nInput);
             err = clSetKernelArg(redKernel, 2, sizeof(cl_int), (void*)&nInput);
             if (CL_SUCCESS != err)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
 
             SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << 3 << ": cl_int: " << nCurWindowSize);
             err = clSetKernelArg(redKernel, 3, sizeof(cl_int), (void*)&nCurWindowSize);
             if (CL_SUCCESS != err)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
 
             // set work group size and execute
             size_t global_work_size1[] = { 256, (size_t)w };
@@ -1548,20 +1552,23 @@ public:
             err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, redKernel, 2, NULL,
                 global_work_size1, local_work_size1, 0, NULL, NULL);
             if (CL_SUCCESS != err)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__);
             err = clFinish(kEnv.mpkCmdQueue);
             if (CL_SUCCESS != err)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clFinish", err, __FILE__, __LINE__);
             resbuf = (double*)clEnqueueMapBuffer(kEnv.mpkCmdQueue,
                 mpClmem2,
                 CL_TRUE, CL_MAP_READ, 0,
                 sizeof(double) * w, 0, NULL, NULL,
                 &err);
             if (err != CL_SUCCESS)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clEnqueueMapBuffer", err, __FILE__, __LINE__);
             for (int i = 0; i < w; i++)
                 pAllBuffer[i + w] = resbuf[i];
             err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpClmem2, resbuf, 0, NULL, NULL);
+            // FIXME: Is it intentional to not throw an OpenCLError even if the clEnqueueUnmapMemObject() fails?
+            if (CL_SUCCESS != err)
+                SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err));
             if (mpClmem2)
             {
                 clReleaseMemObject(mpClmem2);
@@ -1571,14 +1578,14 @@ public:
                 (cl_mem_flags)CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
                 w * sizeof(double) * 2, pAllBuffer.get(), &err);
             if (CL_SUCCESS != err)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__);
             SAL_INFO("sc.opencl", "Created buffer " << mpClmem2 << " size " << w << "*" << sizeof(double) << "=" << (w*sizeof(double)) << " copying host buffer " << pAllBuffer.get());
         }
         // set kernel arg
         SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << mpClmem2);
         err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&(mpClmem2));
         if (CL_SUCCESS != err)
-            throw OpenCLError(err, __FILE__, __LINE__);
+            throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
         return 1;
     }
     ~ParallelReductionVectorRef()
@@ -2192,13 +2199,13 @@ public:
                 pClmem2 = clCreateBuffer(kEnv.mpkContext, CL_MEM_READ_WRITE,
                     sizeof(double) * nVectorWidth, NULL, &err);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__);
                 SAL_INFO("sc.opencl", "Created buffer " << pClmem2 << " size " << sizeof(double) << "*" << nVectorWidth << "=" << (sizeof(double)*nVectorWidth));
 
                 std::string kernelName = "GeoMean_reduction";
                 cl_kernel redKernel = clCreateKernel(pProgram, kernelName.c_str(), &err);
                 if (err != CL_SUCCESS)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clCreateKernel", err, __FILE__, __LINE__);
                 // set kernel arg of reduction kernel
                 for (size_t j = 0; j < vclmem.size(); j++)
                 {
@@ -2207,12 +2214,12 @@ public:
                         vclmem[j] ? sizeof(cl_mem) : sizeof(double),
                         (void*)&vclmem[j]);
                     if (CL_SUCCESS != err)
-                        throw OpenCLError(err, __FILE__, __LINE__);
+                        throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
                 }
                 SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << vclmem.size() << ": cl_mem: " << pClmem2);
                 err = clSetKernelArg(redKernel, vclmem.size(), sizeof(cl_mem), (void*)&pClmem2);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
 
                 // set work group size and execute
                 size_t global_work_size[] = { 256, (size_t)nVectorWidth };
@@ -2221,16 +2228,16 @@ public:
                 err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, redKernel, 2, NULL,
                     global_work_size, local_work_size, 0, NULL, NULL);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__);
                 err = clFinish(kEnv.mpkCmdQueue);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clFinish", err, __FILE__, __LINE__);
 
                 // Pass pClmem2 to the "real" kernel
                 SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << pClmem2);
                 err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&pClmem2);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
             }
         }
         if (OpSumIfs* OpSumCodeGen = dynamic_cast<OpSumIfs*>(mpCodeGen.get()))
@@ -2263,13 +2270,13 @@ public:
                 mpClmem2 = clCreateBuffer(kEnv.mpkContext, CL_MEM_READ_WRITE,
                     sizeof(double) * nVectorWidth, NULL, &err);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__);
                 SAL_INFO("sc.opencl", "Created buffer " << mpClmem2 << " size " << sizeof(double) << "*" << nVectorWidth << "=" << (sizeof(double)*nVectorWidth));
 
                 std::string kernelName = mvSubArguments[0]->GetName() + "_SumIfs_reduction";
                 cl_kernel redKernel = clCreateKernel(pProgram, kernelName.c_str(), &err);
                 if (err != CL_SUCCESS)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clCreateKernel", err, __FILE__, __LINE__);
 
                 // set kernel arg of reduction kernel
                 for (size_t j = 0; j < vclmem.size(); j++)
@@ -2283,22 +2290,22 @@ public:
                         vclmem[j].mCLMem ? (void*)&vclmem[j].mCLMem :
                                            (void*)&vclmem[j].mConst);
                     if (CL_SUCCESS != err)
-                        throw OpenCLError(err, __FILE__, __LINE__);
+                        throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
                 }
                 SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << vclmem.size() << ": cl_mem: " << mpClmem2);
                 err = clSetKernelArg(redKernel, vclmem.size(), sizeof(cl_mem), (void*)&mpClmem2);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
 
                 SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << (vclmem.size() + 1) << ": cl_int: " << nInput);
                 err = clSetKernelArg(redKernel, vclmem.size() + 1, sizeof(cl_int), (void*)&nInput);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
 
                 SAL_INFO("sc.opencl", "Kernel " << redKernel << " arg " << (vclmem.size() + 2) << ": cl_int: " << nCurWindowSize);
                 err = clSetKernelArg(redKernel, vclmem.size() + 2, sizeof(cl_int), (void*)&nCurWindowSize);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
                 // set work group size and execute
                 size_t global_work_size[] = { 256, (size_t)nVectorWidth };
                 size_t local_work_size[] = { 256, 1 };
@@ -2306,16 +2313,16 @@ public:
                 err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, redKernel, 2, NULL,
                     global_work_size, local_work_size, 0, NULL, NULL);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__);
                 err = clFinish(kEnv.mpkCmdQueue);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clFinish", err, __FILE__, __LINE__);
                 clReleaseKernel(redKernel);
                 // Pass mpClmem2 to the "real" kernel
                 SAL_INFO("sc.opencl", "Kernel " << k << " arg " << argno << ": cl_mem: " << mpClmem2);
                 err = clSetKernelArg(k, argno, sizeof(cl_mem), (void*)&mpClmem2);
                 if (CL_SUCCESS != err)
-                    throw OpenCLError(err, __FILE__, __LINE__);
+                    throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
             }
         }
         return i;
@@ -3712,7 +3719,7 @@ void DynamicKernel::CreateKernel()
             mpProgram = clCreateProgramWithSource(kEnv.mpkContext, 1,
                 &src, NULL, &err);
             if (err != CL_SUCCESS)
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clCreateProgramWithSource", err, __FILE__, __LINE__);
             err = clBuildProgram(mpProgram, 1,
                 ::opencl::gpuEnv.mpArryDevsID, "", NULL, NULL);
             if (err != CL_SUCCESS)
@@ -3729,7 +3736,7 @@ void DynamicKernel::CreateKernel()
                         e != CL_SUCCESS, "sc.opencl",
                         "after CL_BUILD_PROGRAM_FAILURE,"
                         " clGetProgramBuildInfo(CL_PROGRAM_BUILD_STATUS)"
-                        " fails with " << e);
+                        " fails with " << ::opencl::errorString(e));
                     if (e == CL_SUCCESS)
                     {
                         size_t n;
@@ -3740,7 +3747,7 @@ void DynamicKernel::CreateKernel()
                             e != CL_SUCCESS || n == 0, "sc.opencl",
                             "after CL_BUILD_PROGRAM_FAILURE,"
                             " clGetProgramBuildInfo(CL_PROGRAM_BUILD_LOG)"
-                            " fails with " << e << ", n=" << n);
+                            " fails with " << ::opencl::errorString(e) << ", n=" << n);
                         if (e == CL_SUCCESS && n != 0)
                         {
                             std::vector<char> log(n);
@@ -3751,7 +3758,7 @@ void DynamicKernel::CreateKernel()
                                 e != CL_SUCCESS || n == 0, "sc.opencl",
                                 "after CL_BUILD_PROGRAM_FAILURE,"
                                 " clGetProgramBuildInfo("
-                                "CL_PROGRAM_BUILD_LOG) fails with " << e);
+                                "CL_PROGRAM_BUILD_LOG) fails with " << ::opencl::errorString(e));
                             if (e == CL_SUCCESS)
                                 SAL_WARN(
                                     "sc.opencl",
@@ -3761,7 +3768,7 @@ void DynamicKernel::CreateKernel()
                     }
                 }
 #endif
-                throw OpenCLError(err, __FILE__, __LINE__);
+                throw OpenCLError("clBuildProgram", err, __FILE__, __LINE__);
             }
             // Generate binary out of compiled kernel.
             ::opencl::generatBinFromKernelSource(mpProgram,
@@ -3774,7 +3781,7 @@ void DynamicKernel::CreateKernel()
     }
     mpKernel = clCreateKernel(mpProgram, kname.c_str(), &err);
     if (err != CL_SUCCESS)
-        throw OpenCLError(err, __FILE__, __LINE__);
+        throw OpenCLError("clCreateKernel", err, __FILE__, __LINE__);
 }
 
 void DynamicKernel::Launch( size_t nr )
@@ -3788,13 +3795,13 @@ void DynamicKernel::Launch( size_t nr )
         (cl_mem_flags)CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR,
         nr * sizeof(double), NULL, &err);
     if (CL_SUCCESS != err)
-        throw OpenCLError(err, __FILE__, __LINE__);
+        throw OpenCLError("clCreateBuffer", err, __FILE__, __LINE__);
     SAL_INFO("sc.opencl", "Created buffer " << mpResClmem << " size " << nr << "*" << sizeof(double) << "=" << (nr*sizeof(double)));
 
     SAL_INFO("sc.opencl", "Kernel " << mpKernel << " arg " << 0 << ": cl_mem: " << mpResClmem);
     err = clSetKernelArg(mpKernel, 0, sizeof(cl_mem), (void*)&mpResClmem);
     if (CL_SUCCESS != err)
-        throw OpenCLError(err, __FILE__, __LINE__);
+        throw OpenCLError("clSetKernelArg", err, __FILE__, __LINE__);
     // The rest of buffers
     mSyms.Marshal(mpKernel, nr, mpProgram);
     size_t global_work_size[] = { nr };
@@ -3802,10 +3809,10 @@ void DynamicKernel::Launch( size_t nr )
     err = clEnqueueNDRangeKernel(kEnv.mpkCmdQueue, mpKernel, 1, NULL,
         global_work_size, NULL, 0, NULL, NULL);
     if (CL_SUCCESS != err)
-        throw OpenCLError(err, __FILE__, __LINE__);
+        throw OpenCLError("clEnqueueNDRangeKernel", err, __FILE__, __LINE__);
     err = clFlush(kEnv.mpkCmdQueue);
     if (CL_SUCCESS != err)
-        throw OpenCLError(err, __FILE__, __LINE__);
+        throw OpenCLError("clFlush", err, __FILE__, __LINE__);
 }
 
 // Symbol lookup. If there is no such symbol created, allocate one
@@ -3954,7 +3961,7 @@ public:
 
         if (err != CL_SUCCESS)
         {
-            SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error: " << err);
+            SAL_WARN("sc.opencl", "clEnqueueMapBuffer failed:: " << ::opencl::errorString(err));
             mpResBuf = NULL;
             return;
         }
@@ -3962,7 +3969,7 @@ public:
         err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpCLResBuf, mpResBuf, 0, NULL, NULL);
         if (err != CL_SUCCESS)
         {
-            SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error: " << err);
+            SAL_WARN("sc.opencl", "clEnqueueUnmapMemObject failed: " << ::opencl::errorString(err));
             mpResBuf = NULL;
         }
     }
@@ -4023,7 +4030,7 @@ public:
         }
         catch (const OpenCLError& oce)
         {
-            SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error: " << oce.mError << " at " << oce.mFile << ":" << oce.mLineNumber);
+            SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error from " << oce.mFunction << ": " << ::opencl::errorString(oce.mError) << " at " << oce.mFile << ":" << oce.mLineNumber);
             return CLInterpreterResult();
         }
         catch (const Unhandled& uh)
@@ -4088,6 +4095,9 @@ bool waitForResults()
     ::opencl::setKernelEnv(&kEnv);
 
     cl_int err = clFinish(kEnv.mpkCmdQueue);
+    if (err != CL_SUCCESS)
+        SAL_WARN("sc.opencl", "clFinish failed: " << ::opencl::errorString(err));
+
     return err == CL_SUCCESS;
 }
 
diff --git a/sc/source/core/opencl/opbase.cxx b/sc/source/core/opencl/opbase.cxx
index 1c24c12..671987e 100644
--- a/sc/source/core/opencl/opbase.cxx
+++ b/sc/source/core/opencl/opbase.cxx
@@ -19,10 +19,14 @@ UnhandledToken::UnhandledToken(
     formula::FormulaToken* t, const char* m, const std::string& fn, int ln ) :
     mToken(t), mMessage(m), mFile(fn), mLineNumber(ln) {}
 
-OpenCLError::OpenCLError( cl_int err, const std::string& fn, int ln ) :
-    mError(err), mFile(fn), mLineNumber(ln)
+OpenCLError::OpenCLError( const std::string function, cl_int error, const std::string& file, int line ) :
+    mFunction(function), mError(error), mFile(file), mLineNumber(line)
 {
-    SAL_INFO("sc.opencl", "OpenCL error: " << ::opencl::errorString(mError));
+    // Not sure if this SAL_INFO() is useful; the place in
+    // CLInterpreterContext::launchKernel() where OpenCLError is
+    // caught already uses SAL_WARN() to display it.
+
+    // SAL_INFO("sc.opencl", "OpenCL error: " << ::opencl::errorString(mError));
 }
 
 Unhandled::Unhandled( const std::string& fn, int ln ) :
diff --git a/sc/source/core/opencl/opbase.hxx b/sc/source/core/opencl/opbase.hxx
index b4c4493..5c7228d 100644
--- a/sc/source/core/opencl/opbase.hxx
+++ b/sc/source/core/opencl/opbase.hxx
@@ -42,8 +42,9 @@ public:
 class OpenCLError
 {
 public:
-    OpenCLError( cl_int err, const std::string& fn, int ln );
+    OpenCLError( const std::string function, cl_int error, const std::string& file, int line );
 
+    std::string mFunction;
     cl_int mError;
     std::string mFile;
     int mLineNumber;
commit 43617f14485b79609079c55c872ac088e231db3c
Author: Tor Lillqvist <tml at collabora.com>
Date:   Thu Feb 5 23:42:30 2015 +0200

    Move OpenCLError::strerror() from sc to opencl, and rename to errorString()
    
    There is nothing Calc-specific in this function, and surely it will be good to
    output OpenCL errors symbolically also in the opencl module.
    
    Change-Id: Ibe7d0d036f24dd87e06b8290224e1033dda0f3d1

diff --git a/include/opencl/openclwrapper.hxx b/include/opencl/openclwrapper.hxx
index 9fde5d6..75ecbc8 100644
--- a/include/opencl/openclwrapper.hxx
+++ b/include/opencl/openclwrapper.hxx
@@ -79,6 +79,12 @@ OPENCL_DLLPUBLIC void getOpenCLDeviceInfo(size_t& rDeviceId, size_t& rPlatformId
  */
 OPENCL_DLLPUBLIC void setOpenCLCmdQueuePosition( int nPos );
 
+/**
+ * Return a textual representation of an OpenCL error code.
+ * (Currently the symbolic name sans the CL_ prefix.)
+ */
+OPENCL_DLLPUBLIC const char* errorString(cl_int nError);
+
 }
 
 #endif
diff --git a/opencl/source/openclwrapper.cxx b/opencl/source/openclwrapper.cxx
index db53a04..658e275 100644
--- a/opencl/source/openclwrapper.cxx
+++ b/opencl/source/openclwrapper.cxx
@@ -854,6 +854,64 @@ void setOpenCLCmdQueuePosition( int nPos )
     gpuEnv.mnCmdQueuePos = nPos;
 }
 
+const char* errorString(cl_int nError)
+{
+#define CASE(val) case CL_##val: return #val
+    switch (nError)
+    {
+        CASE(SUCCESS);
+        CASE(DEVICE_NOT_FOUND);
+        CASE(DEVICE_NOT_AVAILABLE);
+        CASE(COMPILER_NOT_AVAILABLE);
+        CASE(MEM_OBJECT_ALLOCATION_FAILURE);
+        CASE(OUT_OF_RESOURCES);
+        CASE(OUT_OF_HOST_MEMORY);
+        CASE(PROFILING_INFO_NOT_AVAILABLE);
+        CASE(MEM_COPY_OVERLAP);
+        CASE(IMAGE_FORMAT_MISMATCH);
+        CASE(IMAGE_FORMAT_NOT_SUPPORTED);
+        CASE(BUILD_PROGRAM_FAILURE);
+        CASE(MAP_FAILURE);
+        CASE(INVALID_VALUE);
+        CASE(INVALID_DEVICE_TYPE);
+        CASE(INVALID_PLATFORM);
+        CASE(INVALID_DEVICE);
+        CASE(INVALID_CONTEXT);
+        CASE(INVALID_QUEUE_PROPERTIES);
+        CASE(INVALID_COMMAND_QUEUE);
+        CASE(INVALID_HOST_PTR);
+        CASE(INVALID_MEM_OBJECT);
+        CASE(INVALID_IMAGE_FORMAT_DESCRIPTOR);
+        CASE(INVALID_IMAGE_SIZE);
+        CASE(INVALID_SAMPLER);
+        CASE(INVALID_BINARY);
+        CASE(INVALID_BUILD_OPTIONS);
+        CASE(INVALID_PROGRAM);
+        CASE(INVALID_PROGRAM_EXECUTABLE);
+        CASE(INVALID_KERNEL_NAME);
+        CASE(INVALID_KERNEL_DEFINITION);
+        CASE(INVALID_KERNEL);
+        CASE(INVALID_ARG_INDEX);
+        CASE(INVALID_ARG_VALUE);
+        CASE(INVALID_ARG_SIZE);
+        CASE(INVALID_KERNEL_ARGS);
+        CASE(INVALID_WORK_DIMENSION);
+        CASE(INVALID_WORK_GROUP_SIZE);
+        CASE(INVALID_WORK_ITEM_SIZE);
+        CASE(INVALID_GLOBAL_OFFSET);
+        CASE(INVALID_EVENT_WAIT_LIST);
+        CASE(INVALID_EVENT);
+        CASE(INVALID_OPERATION);
+        CASE(INVALID_GL_OBJECT);
+        CASE(INVALID_BUFFER_SIZE);
+        CASE(INVALID_MIP_LEVEL);
+        CASE(INVALID_GLOBAL_WORK_SIZE);
+        default:
+            return "Unknown OpenCL error code";
+    }
+#undef CASE
+}
+
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/opencl/opbase.cxx b/sc/source/core/opencl/opbase.cxx
index bf3f8d8..1c24c12 100644
--- a/sc/source/core/opencl/opbase.cxx
+++ b/sc/source/core/opencl/opbase.cxx
@@ -7,6 +7,8 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
+#include <opencl/openclwrapper.hxx>
+
 #include "opbase.hxx"
 
 using namespace formula;
@@ -20,65 +22,7 @@ UnhandledToken::UnhandledToken(
 OpenCLError::OpenCLError( cl_int err, const std::string& fn, int ln ) :
     mError(err), mFile(fn), mLineNumber(ln)
 {
-    SAL_INFO("sc.opencl", "OpenCLError:" << mError << ": " << strerror(mError));
-}
-
-const char* OpenCLError::strerror( cl_int i ) const
-{
-#define CASE(val) case val: return #val
-    switch (i)
-    {
-        CASE(CL_SUCCESS);
-        CASE(CL_DEVICE_NOT_FOUND);
-        CASE(CL_DEVICE_NOT_AVAILABLE);
-        CASE(CL_COMPILER_NOT_AVAILABLE);
-        CASE(CL_MEM_OBJECT_ALLOCATION_FAILURE);
-        CASE(CL_OUT_OF_RESOURCES);
-        CASE(CL_OUT_OF_HOST_MEMORY);
-        CASE(CL_PROFILING_INFO_NOT_AVAILABLE);
-        CASE(CL_MEM_COPY_OVERLAP);
-        CASE(CL_IMAGE_FORMAT_MISMATCH);
-        CASE(CL_IMAGE_FORMAT_NOT_SUPPORTED);
-        CASE(CL_BUILD_PROGRAM_FAILURE);
-        CASE(CL_MAP_FAILURE);
-        CASE(CL_INVALID_VALUE);
-        CASE(CL_INVALID_DEVICE_TYPE);
-        CASE(CL_INVALID_PLATFORM);
-        CASE(CL_INVALID_DEVICE);
-        CASE(CL_INVALID_CONTEXT);
-        CASE(CL_INVALID_QUEUE_PROPERTIES);
-        CASE(CL_INVALID_COMMAND_QUEUE);
-        CASE(CL_INVALID_HOST_PTR);
-        CASE(CL_INVALID_MEM_OBJECT);
-        CASE(CL_INVALID_IMAGE_FORMAT_DESCRIPTOR);
-        CASE(CL_INVALID_IMAGE_SIZE);
-        CASE(CL_INVALID_SAMPLER);
-        CASE(CL_INVALID_BINARY);
-        CASE(CL_INVALID_BUILD_OPTIONS);
-        CASE(CL_INVALID_PROGRAM);
-        CASE(CL_INVALID_PROGRAM_EXECUTABLE);
-        CASE(CL_INVALID_KERNEL_NAME);
-        CASE(CL_INVALID_KERNEL_DEFINITION);
-        CASE(CL_INVALID_KERNEL);
-        CASE(CL_INVALID_ARG_INDEX);
-        CASE(CL_INVALID_ARG_VALUE);
-        CASE(CL_INVALID_ARG_SIZE);
-        CASE(CL_INVALID_KERNEL_ARGS);
-        CASE(CL_INVALID_WORK_DIMENSION);
-        CASE(CL_INVALID_WORK_GROUP_SIZE);
-        CASE(CL_INVALID_WORK_ITEM_SIZE);
-        CASE(CL_INVALID_GLOBAL_OFFSET);
-        CASE(CL_INVALID_EVENT_WAIT_LIST);
-        CASE(CL_INVALID_EVENT);
-        CASE(CL_INVALID_OPERATION);
-        CASE(CL_INVALID_GL_OBJECT);
-        CASE(CL_INVALID_BUFFER_SIZE);
-        CASE(CL_INVALID_MIP_LEVEL);
-        CASE(CL_INVALID_GLOBAL_WORK_SIZE);
-        default:
-            return "Unknown OpenCL error code";
-    }
-#undef CASE
+    SAL_INFO("sc.opencl", "OpenCL error: " << ::opencl::errorString(mError));
 }
 
 Unhandled::Unhandled( const std::string& fn, int ln ) :
diff --git a/sc/source/core/opencl/opbase.hxx b/sc/source/core/opencl/opbase.hxx
index 866d7dd..b4c4493 100644
--- a/sc/source/core/opencl/opbase.hxx
+++ b/sc/source/core/opencl/opbase.hxx
@@ -41,9 +41,6 @@ public:
 /// Failed in marshaling
 class OpenCLError
 {
-private:
-    const char* strerror( cl_int i ) const;
-
 public:
     OpenCLError( cl_int err, const std::string& fn, int ln );
 
commit 7d7076446efa50a4a4997289272934bd35fa4d58
Author: Tor Lillqvist <tml at collabora.com>
Date:   Thu Feb 5 22:57:26 2015 +0200

    The ISNAN ifdefs can go away
    
    ISNAN was defined unconditionally since long, and even the original authors of
    this stuff started removing those conditionals last summer.
    
    for F in `git grep -l ISNAN sc`; do unifdef -DISNAN -B -o $F $F; done
    
    Change-Id: I61df4066d0ecc23b6ce26bac8f3fbdfaf4aceac4

diff --git a/sc/source/core/opencl/op_addin.cxx b/sc/source/core/opencl/op_addin.cxx
index e3e5787..3bb7c60 100644
--- a/sc/source/core/opencl/op_addin.cxx
+++ b/sc/source/core/opencl/op_addin.cxx
@@ -50,17 +50,13 @@ void OpBesselj::GenSlidingWindowFunction(std::stringstream &ss,
         {
             const formula::SingleVectorRefToken*tmpCurSVR0 =
                 static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
-#ifdef  ISNAN
             ss << "    if (gid0 < " << tmpCurSVR0->GetArrayLength() << ")\n";
             ss << "    {\n";
-#endif
             ss << "        x = ";
             ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
-#ifdef  ISNAN
             ss << "        if (isNan(x))\n";
             ss << "            x = 0.0;\n";
             ss << "    }\n";
-#endif
         }
         else if(tmpCur0->GetType() == formula::svDouble)
         {
@@ -86,17 +82,13 @@ void OpBesselj::GenSlidingWindowFunction(std::stringstream &ss,
         {
             const formula::SingleVectorRefToken*tmpCurSVR1 =
                 static_cast<const formula::SingleVectorRefToken *>(tmpCur1);
-#ifdef  ISNAN
             ss << "    if (gid0 < " << tmpCurSVR1->GetArrayLength() << ")\n";
             ss << "    {\n";
-#endif
             ss << "        N = ";
             ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n";
-#ifdef  ISNAN
             ss << "        if (isNan(N))\n";
             ss << "            N = 0.0;\n";
             ss << "    }\n";
-#endif
         }
         else if(tmpCur1->GetType() == formula::svDouble)
         {
@@ -220,25 +212,18 @@ void OpGestep::GenSlidingWindowFunction(
         assert(pCur);
         if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken& rSVR =
             dynamic_cast< const formula::SingleVectorRefToken& >(*pCur);
             ss << "    if (gid0 < " << rSVR.GetArrayLength() << ")\n";
             ss << "    {\n";
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "    {\n";
-#endif
         }
         else
         {
-#ifdef  ISNAN
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss << "        if (isNan(";
@@ -255,7 +240,6 @@ void OpGestep::GenSlidingWindowFunction(
             ss << "tmp"<<i<<" ="<<vSubArguments[i]->GenSlidingWindowDeclRef();
             ss <<";\n";
         }
-#endif
     }
     ss << "    tmp =tmp0 >= tmp1 ? 1 : 0;\n";
     ss << "    return tmp;\n";
diff --git a/sc/source/core/opencl/op_financial.cxx b/sc/source/core/opencl/op_financial.cxx
index 2c249fa..2e3c59f 100644
--- a/sc/source/core/opencl/op_financial.cxx
+++ b/sc/source/core/opencl/op_financial.cxx
@@ -41,7 +41,6 @@ void RRI::GenSlidingWindowFunction(
     ss << "    double fv;\n";
     ss << "    double pv;\n";
     ss << "    double nper;\n";
-#ifdef ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
     formula::SingleVectorRefToken *>(tmpCur0);
@@ -65,34 +64,27 @@ void RRI::GenSlidingWindowFunction(
     ss<< "    int buffer_fv_len = ";
     ss<< tmpCurDVR2->GetArrayLength();
     ss << ";\n";
-#endif
 
-#ifdef ISNAN
     ss<<"    if(gid0>=buffer_nper_len || isNan(";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<"))\n";
     ss<<"        nper = 0;\n\telse \n";
-#endif
     ss<<"        nper = ";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<";\n";
 
-#ifdef ISNAN
     ss<<"    if(gid0>=buffer_pv_len || isNan(";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<"))\n";
     ss<<"        pv = 0;\n\telse \n";
-#endif
     ss<<"        pv = ";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<";\n";
 
-#ifdef ISNAN
     ss<<"    if(gid0>=buffer_pv_len || isNan(";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<"))\n";
     ss<<"        fv = 0;\n\telse \n";
-#endif
     ss<<"        fv = ";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<";\n";
@@ -124,25 +116,17 @@ vSubArguments)
         assert(pCur);
         if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
                 const formula::SingleVectorRefToken* pSVR =
                 static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#else
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "{\n";
-#endif
         }
         else
         {
-#ifdef  ISNAN
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss <<"    temp="<<vSubArguments[i]->GenSlidingWindowDeclRef();
@@ -159,10 +143,6 @@ vSubArguments)
 );
             ss <<";\n";
         }
-#else
-    ss <<"    tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-#endif
     }
     ss<<"if(tmp1==0)\n\t";
     ss<<"\treturn 0;\n\t";
@@ -190,7 +170,6 @@ void OpDollarde::GenSlidingWindowFunction(
     ss << "double fInt = " << GetBottom() <<";\n\t";
     ss << "double dollar;\n\t";
     ss << "double fFrac;\n\t";
-#ifdef ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
     formula::SingleVectorRefToken *>(tmpCur0);
@@ -203,22 +182,17 @@ void OpDollarde::GenSlidingWindowFunction(
     ss<< "int buffer_frac_len = ";
     ss<< tmpCurDVR1->GetArrayLength();
     ss << ";\n\t";
-#endif
-#ifdef ISNAN
     ss<<"if((gid0)>=buffer_dollar_len || isNan(";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"dollar = 0;\n\telse \n\t\t";
-#endif
     ss<<"dollar = ";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
-#ifdef ISNAN
     ss<<"if((gid0)>=buffer_frac_len || isNan(";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"fFrac = 0;\n\telse \n\t\t";
-#endif
     ss<<"fFrac = ";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
@@ -247,7 +221,6 @@ void OpDollarfr::GenSlidingWindowFunction(std::stringstream &ss,
     ss << "double fInt = " << GetBottom() <<";\n\t";
     ss << "double dollar;\n\t";
     ss << "double fFrac;\n\t";
-#ifdef  ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
     formula::SingleVectorRefToken *>(tmpCur0);
@@ -260,22 +233,17 @@ void OpDollarfr::GenSlidingWindowFunction(std::stringstream &ss,
     ss<< "int buffer_frac_len = ";
     ss<< tmpCurDVR1->GetArrayLength();
     ss << ";\n\t";
-#endif
-#ifdef  ISNAN
     ss<<"if((gid0)>=buffer_dollar_len || isNan(";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"dollar = 0;\n\telse \n\t\t";
-#endif
     ss<<"dollar = ";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
-#ifdef  ISNAN
     ss<<"if((gid0)>=buffer_frac_len || isNan(";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"fFrac = 0;\n\telse \n\t\t";
-#endif
     ss<<"fFrac = ";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
@@ -321,19 +289,14 @@ void OpDISC::GenSlidingWindowFunction(std::stringstream& ss,
         assert(pCur);
         if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
                 static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "    {\n";
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss << "        if (isNan(";
@@ -350,10 +313,6 @@ void OpDISC::GenSlidingWindowFunction(std::stringstream& ss,
             ss << "    arg" << i << " = ";
             ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
         }
-#else
-        ss << "    arg" << i;
-        ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-#endif
     }
     ss << "    int nNullDate = 693594;\n";
     ss << "    tmp = 1.0 - arg2 / arg3;\n";
@@ -401,19 +360,14 @@ void OpINTRATE::GenSlidingWindowFunction(std::stringstream& ss,
         assert(pCur);
         if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
                 static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "    {\n";
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss << "        if (isNan(";
@@ -430,10 +384,6 @@ void OpINTRATE::GenSlidingWindowFunction(std::stringstream& ss,
             ss << "    arg" << i << " = ";
             ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
         }
-#else
-        ss << "    arg" << i;
-        ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-#endif
     }
     ss << "    int nNullDate = GetNullDate();\n";
     ss << "    tmp = arg3 * pow(arg2,-1) - 1.0;\n";
@@ -476,7 +426,6 @@ void OpFV::GenSlidingWindowFunction(std::stringstream& ss,
         assert(pCur);
         if(pCur->GetType() == formula::svSingleVectorRef)
             {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
             static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if(gid0 >= " << pSVR->GetArrayLength() << " || isNan(";
@@ -484,7 +433,6 @@ void OpFV::GenSlidingWindowFunction(std::stringstream& ss,
             ss << "))\n";
             ss << "        arg" << j << " = " <<GetBottom() << ";\n";
             ss << "    else\n";
-#endif
             ss << "        arg" << j << " = ";
             ss << vSubArguments[j]->GenSlidingWindowDeclRef();
             ss << ";\n";
@@ -529,7 +477,6 @@ void OpIPMT::GenSlidingWindowFunction(std::stringstream& ss,
         assert(pCur);
         if(pCur->GetType() == formula::svSingleVectorRef)
             {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
             static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if(gid0 >= " << pSVR->GetArrayLength() << " || isNan(";
@@ -537,7 +484,6 @@ void OpIPMT::GenSlidingWindowFunction(std::stringstream& ss,
             ss << "))\n";
             ss << "        arg" << j << " = " <<GetBottom() << ";\n";
             ss << "    else\n";
-#endif
             ss << "        arg" << j << " = ";
             ss << vSubArguments[j]->GenSlidingWindowDeclRef();
             ss << ";\n";
@@ -596,19 +542,14 @@ void OpISPMT::GenSlidingWindowFunction(std::stringstream& ss,
         assert(pCur);
         if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
                 static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "    {\n";
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss << "        if (isNan(";
@@ -625,10 +566,6 @@ void OpISPMT::GenSlidingWindowFunction(std::stringstream& ss,
             ss << "    arg" << i << " = ";
             ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
         }
-#else
-        ss << "    arg" << i;
-        ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-#endif
     }
     ss << "    tmp = arg3 * arg0 * ( arg1 - arg2) * pow(arg2, -1);\n";
     ss << "    return tmp;\n";
@@ -658,19 +595,14 @@ void OpDuration::GenSlidingWindowFunction(std::stringstream& ss,
         assert(pCur);
         if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
                 static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "    {\n";
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss << "        if (isNan(";
@@ -687,10 +619,6 @@ void OpDuration::GenSlidingWindowFunction(std::stringstream& ss,
             ss << "    arg" << i << " = ";
             ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
         }
-#else
-        ss << "    arg" << i;
-        ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-#endif
     }
     ss << "    tmp = log(arg2 * pow( arg1,-1)) / log(arg0 + 1.0);\n";
     ss << "    return tmp;\n";
@@ -737,7 +665,6 @@ void OpDuration_ADD::GenSlidingWindowFunction(std::stringstream& ss,
         assert(pCur);
         if(pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef ISNAN
             const formula::SingleVectorRefToken* pSVR =
                 static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if(gid0 >= " << pSVR->GetArrayLength() << " || isNan(";
@@ -745,7 +672,6 @@ void OpDuration_ADD::GenSlidingWindowFunction(std::stringstream& ss,
             ss << "))\n";
             ss << "        arg" << j << " = " <<GetBottom() << ";\n";
             ss << "    else\n";
-#endif
             ss << "        arg" << j << " = ";
             ss << vSubArguments[j]->GenSlidingWindowDeclRef();
             ss << ";\n";
@@ -798,19 +724,14 @@ void OpMDuration::GenSlidingWindowFunction(std::stringstream& ss,
         assert(pCur);
         if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
                 static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "    {\n";
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss << "        if (isNan(";
@@ -827,10 +748,6 @@ void OpMDuration::GenSlidingWindowFunction(std::stringstream& ss,
             ss << "    arg" << i << " = ";
             ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
         }
-#else
-        ss << "    arg" << i;
-        ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-#endif
     }
     ss << "    int nNullDate = 693594;\n";
     ss << "    tmp = GetDuration_new( nNullDate, (int)arg0, (int)arg1, arg2,";
@@ -860,24 +777,16 @@ void Fvschedule::GenSlidingWindowFunction(
     ss << "int gid0 = get_global_id(0);\n\t";
     ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss << ";\n\t";
-#ifdef ISNAN
     ss << "if (isNan(arg0))\n\t\t";
     ss << "arg0 = 0;\n\t";
-#endif
     ss << "double arg1;\n\t";
     ss << "int arrayLength = " << pCurDVR->GetArrayLength() << ";\n\t";
-#ifdef ISNAN
     ss << "for (int i = 0; i + gid0 < arrayLength &&";
     ss << " i < " << nCurWindowSize << "; i++){\n\t\t";
-#else
-    ss << "for (int i = 0; i < " << nCurWindowSize << "; i++){\n\t\t";
-#endif
     ss << "arg1 = ";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n\t\t\t";
-#ifdef ISNAN
     ss << "if (isNan(arg1))\n\t\t\t\t";
     ss << "arg1 = 0;\n\t\t\t";
-#endif
     ss << "tmp *= arg1 + 1.0;\n\t\t";
     ss << "}\n\t";
     ss << "return (double)tmp * arg0";
@@ -905,15 +814,12 @@ vSubArguments)
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double fRate,fVal;\n";
     ss << "    int nStartPer,nEndPer,nNumPeriods,nPayType;\n";
-#ifdef ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
     FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
     FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
     FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
     FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
-#endif
-#ifdef ISNAN
     if(tmpCur0->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
@@ -923,10 +829,8 @@ vSubArguments)
         ss <<"))\n";
         ss <<"        fRate = 0;\n    else\n";
     }
-#endif
     ss <<"        fRate = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     if(tmpCur1->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
@@ -936,11 +840,9 @@ vSubArguments)
         ss <<"))\n";
         ss <<"        nNumPeriods = 0;\n    else\n";
     }
-#endif
     ss <<"        nNumPeriods = (int)";
     ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     if(tmpCur2->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
@@ -950,10 +852,8 @@ vSubArguments)
         ss <<"))\n";
         ss <<"        fVal  = 0;\n    else\n";
     }
-#endif
     ss <<"        fVal = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     if(tmpCur3->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
@@ -963,11 +863,9 @@ vSubArguments)
         ss <<"))\n";
         ss <<"        nStartPer = 0;\n    else\n";
     }
-#endif
     ss <<"        nStartPer = (int)";
     ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     if(tmpCur4->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
@@ -977,12 +875,10 @@ vSubArguments)
         ss <<"))\n";
         ss <<"        nEndPer = 0;\n    else\n";
     }
-#endif
     ss <<"        nEndPer = (int)";
     ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
     ss <<";\n";
 
-#ifdef ISNAN
     if(tmpCur5->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
@@ -992,7 +888,6 @@ vSubArguments)
         ss <<"))\n";
         ss <<"        nPayType = 0;\n    else\n";
     }
-#endif
     ss <<"    nPayType = (int)"<<vSubArguments[5]->GenSlidingWindowDeclRef();
     ss <<";\n";
     ss <<"    double fRmz;\n";
@@ -1041,7 +936,6 @@ void IRR::GenSlidingWindowFunction(std::stringstream &ss,
     ss << "    double nCount = 0.0;\n";
     if (pSur->GetType() == formula::svSingleVectorRef)
     {
-#ifdef  ISNAN
         const formula::SingleVectorRefToken* pSVR =
             static_cast< const formula::SingleVectorRefToken* >(pSur);
         ss << "    if (gid0 >= " << pSVR->GetArrayLength() << ")\n";
@@ -1049,15 +943,12 @@ void IRR::GenSlidingWindowFunction(std::stringstream &ss,
         ss << "    if (isNan(fSchaetzwert))\n";
         ss << "        x = 0.1;\n";
         ss << "    else\n";
-#endif
     }
     else if (pSur->GetType() == formula::svDouble)
     {
-#ifdef  ISNAN
         ss << "    if (isNan(fSchaetzwert))\n";
         ss << "        x = 0.1;\n";
         ss << "    else\n";
-#endif
     }
     ss << "        x = fSchaetzwert;\n";
     ss << "    unsigned short nItCount = 0;\n";
@@ -1072,148 +963,96 @@ void IRR::GenSlidingWindowFunction(std::stringstream &ss,
     size_t nCurWindowSize = pDVR->GetRefRowSize();
     ss << "        for ( ";
     if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
-#ifdef  ISNAN
         ss << "i = gid0; i < " << pDVR->GetArrayLength();
         ss << " && i < " << nCurWindowSize << " /2*2; i++){\n";
-#else
-        ss << "i = gid0; i < " << nCurWindowSize << " /2*2; i++)\n";
-#endif
         ss << "            arg0 = ";
         ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
         ss << "            i++;;\n";
         ss << "            arg1 = ";
         ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
-#ifdef  ISNAN
         ss << "            if (!isNan(arg0)){\n";
-#endif
         ss << "            fZaehler += arg0 / pow(1.0 + x, nCount);\n";
         ss << "            fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
         ss << "            nCount += 1;\n";
         ss << "            }\n";
-#ifdef  ISNAN
         ss << "            if (!isNan(arg1)){\n";
-#endif
         ss << "                fZaehler += arg1 / pow(1.0 + x, nCount);\n";
         ss << "            fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
         ss << "                nCount += 1;\n";
         ss << "            }\n";
-#ifdef ISNAN
         ss << "        }\n";
         ss << "if(i < " << pDVR->GetArrayLength();
         ss << " && i < " << nCurWindowSize << ") ;{\n";
-#else
-        ss << " i < " << nCurWindowSize << "){\n";
-#endif
     }
     else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
-#ifdef  ISNAN
         ss << "; i < " << pDVR->GetArrayLength();
         ss << " && i < (gid0+" << nCurWindowSize << " )/2*2; i++){\n";
-#else
-        ss << "; i < gid0+" << nCurWindowSize << " /2*2; i++)\n";
-#endif
         ss << "            arg0 = ";
         ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
-#ifdef  ISNAN
         ss << "            if (!isNan(arg0)){\n";
-#endif
         ss << "            fZaehler += arg0 / pow(1.0 + x, nCount);\n";
         ss << "            fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
         ss << "            nCount += 1;\n";
-#ifdef  ISNAN
         ss << "            }\n";
-#endif
         ss << "            i++;\n";
         ss << "            arg1 = ";
         ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
-#ifdef  ISNAN
         ss << "            if (!isNan(arg1)){\n";
-#endif
         ss << "                fZaehler += arg1 / pow(1.0 + x, nCount);\n";
         ss << "            fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
         ss << "                nCount+=1;\n";
         ss << "            }\n";
-#ifdef ISNAN
         ss << "        }\n";
         ss << "        if(i < " << pDVR->GetArrayLength();
         ss << " && i < gid0+" << nCurWindowSize << "){\n";
-#else
-        ss << " i < " << nCurWindowSize << "){\n";
-#endif
     }
     else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
-#ifdef  ISNAN
         ss << " ; i + gid0 < " << pDVR->GetArrayLength();
         ss << " &&  i < " << nCurWindowSize << " /2*2; i++){\n";
-#else
-        ss << "; i < " << nCurWindowSize << " /2*2; i++)\n";
-#endif
         ss << "            arg0 = ";
         ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
         ss << "            i++;;\n";
         ss << "            arg1 = ";
         ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
-#ifdef  ISNAN
         ss << "            if (!isNan(arg0)){\n";
-#endif
         ss << "            fZaehler += arg0 / pow(1.0 + x, nCount);\n";
         ss << "            fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
         ss << "            nCount += 1;\n";
         ss << "            }\n";
-#ifdef  ISNAN
         ss << "            if (!isNan(arg1)){\n";
-#endif
         ss << "                fZaehler += arg1 / pow(1.0 + x, nCount);\n";
         ss << "            fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
         ss << "                nCount+=1;\n";
         ss << "            }\n";
-#ifdef ISNAN
         ss << "        }\n";
         ss << "        if(i + gid0 < " << pDVR->GetArrayLength() << " &&";
         ss << " i < " << nCurWindowSize << "){\n";
-#else
-        ss << " i < " << nCurWindowSize << "){\n";
-#endif
 
     } else {
-#ifdef  ISNAN
         ss << "; i < " << nCurWindowSize << " /2*2; i++){\n";
-#else
-        ss << "; i < " << nCurWindowSize << " /2*2; i++)\n";
-#endif
         ss << "            arg0 = ";
         ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
         ss << "            i++;;\n";
         ss << "            arg1 = ";
         ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
-#ifdef  ISNAN
         ss << "            if (!isNan(arg0)){\n";
-#endif
         ss << "            fZaehler += arg0 / pow(1.0 + x, nCount);\n";
         ss << "            fNenner+=-1*nCount*arg0/pow(1.0+x,nCount+1.0);\n";
         ss << "            nCount += 1;\n";
         ss << "            }\n";
-#ifdef  ISNAN
         ss << "            if (!isNan(arg1)){\n";
-#endif
         ss << "                fZaehler += arg1 / pow(1.0 + x, nCount);\n";
         ss << "            fNenner+=-1*nCount*arg1/pow(1.0+x,nCount+1.0);\n";
         ss << "                nCount+=1;\n";
         ss << "            }\n";
-#ifdef ISNAN
         ss << "        }\n";
         ss << "if(i<" << nCurWindowSize << "){\n";
-#else
-        ss << " i < " << nCurWindowSize << "){\n";
-#endif
 
     }
     ss << "            arg0 = ";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n";
-#ifdef  ISNAN
     ss << "        if (isNan(arg0))\n";
     ss << "            continue;\n";
-#endif
     ss << "        fZaehler += arg0 / pow(1.0+x, nCount);\n";
     ss << "        fNenner  += -nCount * arg0 / pow(1.0+x,nCount+1.0);\n";
     ss << "        nCount+=1;\n";
@@ -1363,7 +1202,6 @@ void PriceMat::GenSlidingWindowFunction(
     ss <<"double rate;\n\t";
     ss <<"double yield;\n\t";
     ss <<"int  nBase;\n\t";
-#ifdef ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
     formula::SingleVectorRefToken *>(tmpCur0);
@@ -1401,58 +1239,45 @@ void PriceMat::GenSlidingWindowFunction(
     ss<< "int buffer_base_len = ";
     ss<< tmpCurDVR5->GetArrayLength();
     ss << ";\n\t";
-#endif
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_settle_len || isNan(";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"settle = 0;\n\telse \n\t\t";
-#endif
     ss<<"settle = ";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_mat_len || isNan(";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"mat = 0;\n\telse \n\t\t";
-#endif
     ss<<"mat = ";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_issue_len || isNan(";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"issue = 0;\n\telse \n\t\t";
-#endif
     ss<<"issue = ";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_rate_len || isNan(";
     ss << vSubArguments[3]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"rate = 0;\n\telse \n\t\t";
-#endif
     ss<<"rate = ";
     ss << vSubArguments[3]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_yield_len || isNan(";
     ss << vSubArguments[4]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"yield = 0;\n\telse \n\t\t";
-#endif
     ss<<"yield = ";
     ss << vSubArguments[4]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_base_len || isNan(";
     ss << vSubArguments[5]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"nBase = 0;\n\telse \n\t\t";
-#endif
     ss<<"nBase = ";
     ss << vSubArguments[5]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
@@ -1485,7 +1310,6 @@ void OpSYD::GenSlidingWindowFunction(std::stringstream &ss,
     ss << "    double salvage;\n";
     ss << "    double life;\n";
     ss << "    double period;\n";
-#ifdef ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
     formula::SingleVectorRefToken *>(tmpCur0);
@@ -1516,41 +1340,32 @@ void OpSYD::GenSlidingWindowFunction(std::stringstream &ss,
     ss << "    int buffer_period_len = ";
     ss << tmpCurDVR3->GetArrayLength();
     ss << ";\n";
-#endif
 
-#ifdef ISNAN
     ss <<"    if(gid0>=buffer_cost_len || isNan(";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss <<"))\n";
     ss <<"        cost = 0;\n\telse \n";
-#endif
     ss <<"        cost = ";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     ss <<"    if(gid0>=buffer_salvage_len || isNan(";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss <<"))\n";
     ss <<"        salvage = 0;\n\telse \n";
-#endif
     ss <<"        salvage = ";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     ss <<"    if(gid0>=buffer_life_len || isNan(";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss <<"))\n";
     ss <<"        life = 0;\n\telse \n";
-#endif
     ss <<"        life = ";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     ss <<"    if(gid0>=buffer_period_len || isNan(";
     ss << vSubArguments[3]->GenSlidingWindowDeclRef();
     ss <<"))\n";
     ss <<"        period = 0;\n\telse \n";
-#endif
     ss <<"        period = ";
     ss << vSubArguments[3]->GenSlidingWindowDeclRef();
     ss <<";\n";
@@ -1598,7 +1413,6 @@ void MIRR::GenSlidingWindowFunction(
     ss << ";\n\t";
     ss << "int argLen1 = " << pSVR1->GetArrayLength() << ";\n\t";
     ss << "int argLen2 = " << pSVR2->GetArrayLength() << ";\n\t";
-#ifdef  ISNAN
     ss << "if (gid0 >= argLen1)\n\t\t";
     ss << "arg1 = 0.0;\n\t";
     ss << "if (gid0 >= argLen2)\n\t\t";
@@ -1607,7 +1421,6 @@ void MIRR::GenSlidingWindowFunction(
     ss << "arg1 = 0.0;\n\t";
     ss << "if (isNan(arg2))\n\t\t";
     ss << "arg2 = 0.0;\n\t";
-#endif
     ss << "double invest = arg1 + 1.0;\n\t";
     ss << "double reinvest = arg2 + 1.0;\n\t";
     ss << "double NPV_invest = 0.0;\n\t";
@@ -1616,18 +1429,12 @@ void MIRR::GenSlidingWindowFunction(
     ss << "double Pow_reinvest = 1.0;\n\t";
     ss << "int nCount = 0;\n\t";
     ss << "int arrayLength = " << pCurDVR->GetArrayLength() << ";\n\t";
-#ifdef  ISNAN
     ss << "for (int i = 0; i + gid0 < arrayLength &&";
     ss << " i < " << nCurWindowSize << "; i++){\n\t\t";
-#else
-    ss << "for (int i = 0; i < " << nCurWindowSize << "; i++){\n\t\t";
-#endif
     ss << "arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss << ";\n\t\t";
-#ifdef ISNAN
     ss << "if (isNan(arg0))\n\t\t\t";
     ss << "continue;\n\t\t";
-#endif
     ss << "if (arg0 > 0.0)\n\t\t\t";
     ss << "NPV_reinvest += arg0 * Pow_reinvest;\n\t\t";
     ss << "else if (arg0 < 0.0)\n\t\t\t";
@@ -1665,19 +1472,14 @@ void OpEffective::GenSlidingWindowFunction(std::stringstream& ss,
         assert(pCur);
         if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
                 static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "    {\n";
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss << "        if (isNan(";
@@ -1694,10 +1496,6 @@ void OpEffective::GenSlidingWindowFunction(std::stringstream& ss,
             ss << "    arg" << i << " = ";
             ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
         }
-#else
-        ss << "    arg" << i;
-        ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
-#endif
     }
     ss << "    tmp = pow(1.0 + arg0 * pow(arg1, -1), arg1)-1.0;\n";
     ss << "    return tmp;\n";
@@ -1734,7 +1532,6 @@ void OpTbilleq::GenSlidingWindowFunction(
     ss << "double tmp001;\n\t";
     ss << "double tmp002;\n\t";
 
-#ifdef ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
     formula::SingleVectorRefToken *>(tmpCur0);
@@ -1758,34 +1555,27 @@ void OpTbilleq::GenSlidingWindowFunction(
     ss<< "int buffer_tmp002_len = ";
     ss<< tmpCurDVR2->GetArrayLength();
     ss << ";\n\t";
-#endif
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp000_len || isNan(";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp000 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp000 = ";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp001_len || isNan(";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp001 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp001 = ";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp002_len || isNan(";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp002 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp002 = ";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
@@ -1818,15 +1608,12 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss,
     ss << "    int gid0 = get_global_id(0);\n";
     ss << "    double fRate,fVal;\n";
     ss << "    int nStartPer,nEndPer,nNumPeriods,nPayType;\n";
-#ifdef ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
     FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken();
     FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
     FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
     FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
-#endif
-#ifdef ISNAN
     if(tmpCur0->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
@@ -1836,10 +1623,8 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss,
         ss <<"))\n";
         ss <<"        fRate = 0;\n    else\n";
     }
-#endif
     ss <<"        fRate = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     if(tmpCur1->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const
@@ -1849,11 +1634,9 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss,
         ss <<"))\n";
         ss <<"        nNumPeriods = 0;\n    else\n";
     }
-#endif
     ss <<"        nNumPeriods = (int)";
     ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     if(tmpCur2->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR2= static_cast<const
@@ -1863,10 +1646,8 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss,
         ss <<"))\n";
         ss <<"        fVal  = 0;\n    else\n";
     }
-#endif
     ss <<"        fVal = "<<vSubArguments[2]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     if(tmpCur3->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR3= static_cast<const
@@ -1876,11 +1657,9 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss,
         ss <<"))\n";
         ss <<"        nStartPer = 0;\n    else\n";
     }
-#endif
     ss <<"        nStartPer = (int)";
     ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     if(tmpCur4->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR4= static_cast<const
@@ -1890,12 +1669,10 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss,
         ss <<"))\n";
         ss <<"        nEndPer = 0;\n    else\n";
     }
-#endif
     ss <<"        nEndPer = (int)";
     ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
     ss <<";\n";
 
-#ifdef ISNAN
     if(tmpCur5->GetType() == formula::svSingleVectorRef)
     {
         const formula::SingleVectorRefToken*tmpCurDVR5= static_cast<const
@@ -1905,7 +1682,6 @@ void OpCumprinc::GenSlidingWindowFunction(std::stringstream &ss,
         ss <<"))\n";
         ss <<"        nPayType = 0;\n    else\n";
     }
-#endif
     ss <<"        nPayType = (int)";
     ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
     ss <<";\n";
@@ -1959,7 +1735,6 @@ void OpAccrint::GenSlidingWindowFunction(
     ss << "    int nStartDate,nEndDate,mode,freq;\n";
     ss << "    int nDays1stYear=0;\n";
     ss << "    double fVal,fRate;\n";
-#ifdef ISNAN
     FormulaToken* tmpCur0 = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
         formula::SingleVectorRefToken *>(tmpCur0);
@@ -1996,58 +1771,45 @@ void OpAccrint::GenSlidingWindowFunction(
     ss<< "    int buffer_nMode_len = ";
     ss<< tmpCurDVR6->GetArrayLength();
     ss << ";\n";
-#endif
-#ifdef ISNAN
     ss<<"    if(gid0 >= buffer_nIssue_len || isNan(";
     ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
     ss <<"))\n";
     ss <<"        nStartDate = 0;\n    else\n";
-#endif
     ss <<"        nStartDate=(int)";
     ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     ss <<"    if(gid0 >= buffer_nSettle_len || isNan(";
     ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
     ss <<"))\n";
     ss <<"        nEndDate = 0;\n    else\n";
-#endif
     ss <<"        nEndDate=(int)";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss << ";\n";
-#ifdef ISNAN
     ss <<"    if(gid0 >= buffer_fRate_len || isNan(";
     ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
     ss <<"))\n";
     ss <<"        fRate = 0;\n    else\n";
-#endif
     ss <<"        fRate=";
     ss << vSubArguments[3]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     ss <<"    if(gid0 >= buffer_fVal_len || isNan(";
     ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
     ss <<"))\n";
     ss <<"        fVal = 0;\n    else\n";
-#endif
     ss <<"        fVal=";
     ss << vSubArguments[4]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     ss <<"    if(gid0 >= buffer_nFreq_len || isNan(";
     ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
     ss <<"))\n";
     ss <<"        freq = 0;\n    else\n";
-#endif
     ss <<"        freq= (int)";
     ss << vSubArguments[5]->GenSlidingWindowDeclRef();
     ss <<";\n";
-#ifdef ISNAN
     ss <<"    if(gid0 >= buffer_nMode_len || isNan(";
     ss <<vSubArguments[6]->GenSlidingWindowDeclRef();
     ss <<"))\n";
     ss <<"        mode = 0;\n    else\n";
-#endif
     ss <<"        mode = (int)";
     ss << vSubArguments[6]->GenSlidingWindowDeclRef();
     ss <<";\n";
@@ -2086,7 +1848,6 @@ void OpAccrintm::GenSlidingWindowFunction(
     ss << "double tmp = " << GetBottom() <<";\n\t";
     ss << "int nStartDate,nEndDate,mode;\n\t";
     ss << "double fRate,fVal;\n\t";
-#ifdef ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
     formula::SingleVectorRefToken *>(tmpCur0);
@@ -2124,50 +1885,39 @@ void OpAccrintm::GenSlidingWindowFunction(
     ss<< "int buffer_nMode_len = ";
     ss<< tmpCurDVR4->GetArrayLength();
     ss << ";\n\t";
-#endif
-#ifdef ISNAN
      ss <<"if(gid0 >= buffer_nIssue_len || isNan(";
      ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
      ss <<"))\n\t\t";
      ss <<"nStartDate = 0;\n\telse\n\t\t";
-#endif
     ss << "nStartDate=(int)";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss <<";\n\t";
-#ifdef ISNAN
     ss <<"if(gid0 >= buffer_nSettle_len || isNan(";
     ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
     ss <<"))\n\t\t";
     ss <<"nEndDate = 0;\n\telse\n\t\t";
-#endif
     ss << "nEndDate=(int)";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss << ";\n\t";
 
-#ifdef ISNAN
     ss <<"if(gid0 >= buffer_fRate_len || isNan(";
     ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
     ss <<"))\n\t\t";
     ss <<"fRate = 0;\n\telse\n\t\t";
-#endif
     ss << "fRate=";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss <<";\n\t";
-#ifdef ISNAN
     ss <<"if(gid0 >= buffer_fVal_len || isNan(";
     ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
     ss <<"))\n\t\t";
     ss <<"fVal = 0;\n\telse\n\t\t";
-#endif
     ss << "fVal=";
     ss << vSubArguments[3]->GenSlidingWindowDeclRef();
     ss << ";\n\t";
-#ifdef ISNAN
     ss <<"if(gid0 >= buffer_nMode_len || isNan(";
     ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
     ss <<"))\n\t\t";
     ss <<"mode = 0;\n\telse\n\t\t";
-#endif
     ss << "mode = (int)";
     ss << vSubArguments[4]->GenSlidingWindowDeclRef();
     ss << ";\n\t";
@@ -2231,7 +1981,6 @@ void OpYield::GenSlidingWindowFunction(
     ss << "double tmp005;\n\t";
     ss << "double tmp006;\n\t";
 
-#ifdef ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
     formula::SingleVectorRefToken *>(tmpCur0);
@@ -2287,74 +2036,59 @@ void OpYield::GenSlidingWindowFunction(
     ss<< "int buffer_tmp006_len = ";
     ss<< tmpCurDVR6->GetArrayLength();
     ss << ";\n\t";
-#endif
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp000_len || isNan(";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp000 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp000 = ";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp001_len || isNan(";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp001 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp001 = ";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp002_len || isNan(";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp002 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp002 = ";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp003_len || isNan(";
     ss << vSubArguments[3]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp003 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp003 = ";
     ss << vSubArguments[3]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp004_len || isNan(";
     ss << vSubArguments[4]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp004 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp004 = ";
     ss << vSubArguments[4]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp005_len || isNan(";
     ss << vSubArguments[5]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp005 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp005 = ";
     ss << vSubArguments[5]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp006_len || isNan(";
     ss << vSubArguments[6]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp006 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp006 = ";
     ss << vSubArguments[6]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
@@ -2383,7 +2117,6 @@ void OpSLN::GenSlidingWindowFunction(std::stringstream &ss,
     ss << "    double rest;\n";
     ss << "    double dauer;\n";
 
-#ifdef ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR0=
         static_cast<const formula::SingleVectorRefToken *>(tmpCur0);
@@ -2402,31 +2135,24 @@ void OpSLN::GenSlidingWindowFunction(std::stringstream &ss,
     ss<< "    int buffer_dauer_len = ";
     ss<< tmpCurDVR2->GetArrayLength();
     ss << ";\n";
-#endif
-#ifdef ISNAN
     ss<<"    if(gid0>=buffer_wert_len || isNan(";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<"))\n";
     ss<<"        wert = 0;\n\telse \n";
-#endif
     ss<<"        wert = ";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<";\n";
-#ifdef ISNAN
     ss<<"    if(gid0>=buffer_rest_len || isNan(";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<"))\n";
     ss<<"        rest = 0;\n\telse \n";
-#endif
     ss<<"        rest = ";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<";\n";
-#ifdef ISNAN
     ss<<"    if(gid0>=buffer_dauer_len || isNan(";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<"))\n";
     ss<<"        dauer = 0;\n\telse \n";
-#endif
     ss<<"        dauer = ";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<";\n";
@@ -2470,7 +2196,6 @@ void OpYieldmat::GenSlidingWindowFunction(
     ss << "double tmp004;\n\t";
     ss << "double tmp005;\n\t";
 
-#ifdef ISNAN
     FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
     const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const
     formula::SingleVectorRefToken *>(tmpCur0);
@@ -2519,64 +2244,50 @@ void OpYieldmat::GenSlidingWindowFunction(
     ss<< tmpCurDVR5->GetArrayLength();
     ss << ";\n\t";
 
-#endif
-
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp000_len || isNan(";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp000 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp000 = ";
     ss << vSubArguments[0]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp001_len || isNan(";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp001 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp001 = ";
     ss << vSubArguments[1]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp002_len || isNan(";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp002 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp002 = ";
     ss << vSubArguments[2]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp003_len || isNan(";
     ss << vSubArguments[3]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp003 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp003 = ";
     ss << vSubArguments[3]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp004_len || isNan(";
     ss << vSubArguments[4]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp004 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp004 = ";
     ss << vSubArguments[4]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
 
-#ifdef ISNAN
     ss<<"if(gid0>=buffer_tmp005_len || isNan(";
     ss << vSubArguments[5]->GenSlidingWindowDeclRef();
     ss<<"))\n\t\t";
     ss<<"tmp005 = 0;\n\telse \n\t\t";
-#endif
     ss<<"tmp005 = ";
     ss << vSubArguments[5]->GenSlidingWindowDeclRef();
     ss<<";\n\t";
@@ -2613,25 +2324,17 @@ void OpPMT::GenSlidingWindowFunction(std::stringstream &ss,
         assert(pCur);
         if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
                 const formula::SingleVectorRefToken* pSVR =
                 static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#else
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "{\n";
-#endif
         }
         else
         {
-#ifdef  ISNAN
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss <<"    temp="<<vSubArguments[i]->GenSlidingWindowDeclRef();
@@ -2648,11 +2351,6 @@ void OpPMT::GenSlidingWindowFunction(std::stringstream &ss,
 );
             ss <<";\n";
         }
-#else
-    ss <<"    tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-
-#endif
     }
     ss<<"    if(tmp0==0.0)\n";
     ss<<"        return -(tmp2+tmp3)/tmp1;\n";
@@ -2694,57 +2392,33 @@ void OpNPV::GenSlidingWindowFunction(std::stringstream &ss,
             size_t nCurWindowSize = pDVR->GetRefRowSize();
             ss << "    for (int i = ";
             if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
-#ifdef  ISNAN
                 ss << "gid0; i < " << pDVR->GetArrayLength();
                 ss << " && i < " << nCurWindowSize  << "; i++){\n";
-#else
-                ss << "gid0; i < "<< nCurWindowSize << "; i++)\n";
-#endif
             } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
-#ifdef  ISNAN
                 ss << "0; i < " << pDVR->GetArrayLength();
                 ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
-#else
-                ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n";
-#endif
             } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
-#ifdef  ISNAN
                 ss << "0; i + gid0 < " << pDVR->GetArrayLength();
                 ss << " &&  i < "<< nCurWindowSize << "; i++){\n";
-#else
-                ss << "0; i < "<< nCurWindowSize << "; i++)\n";
-#endif
             }
             else {
-#ifdef  ISNAN
                 ss << "0; i < "<< nCurWindowSize << "; i++){\n";
-#else
-                ss << "0; i < "<< nCurWindowSize << "; i++)\n";
-#endif
             }
         }
         else if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
             static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#else
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "{\n";
-#endif
         }
         else
         {
-#ifdef  ISNAN
             ss << "nCount += 1;\n";
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss << "        double temp=";
@@ -2776,12 +2450,6 @@ void OpNPV::GenSlidingWindowFunction(std::stringstream &ss,
             ss << "            tmp +=temp/ temp1;\n";
             ss << "        nCount += 1;\n";
         }
-#else
-            ss << "tmp +="<<vSubArguments[i]->GenSlidingWindowDeclRef();
-            ss <<" / pow(1.0f+ arg0 ,";
-            ss <<" (double)nCount );\n";
-            ss << "        nCount += 1;\n";
-#endif
     }
         ss << "    return tmp;\n";
         ss << "}";
@@ -2851,25 +2519,17 @@ void OpPrice::GenSlidingWindowFunction(std::stringstream &ss,
         assert(pCur);
         if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
                 static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#else
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "{\n";
-#endif
         }
         else
         {
-#ifdef  ISNAN
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss << "        if (isNan(";
@@ -2887,11 +2547,6 @@ void OpPrice::GenSlidingWindowFunction(std::stringstream &ss,
             ss << vSubArguments[i]->GenSlidingWindowDeclRef();
             ss <<";\n";
         }
-#else
-        ss << "        tmp"<<i<<"=";
-        ss<<vSubArguments[i]->GenSlidingWindowDeclRef();
-        ss <<";\n";
-#endif
     }
     ss << "    if(tmp4*tmp5 == 0) return NAN;\n";
     ss << "    tmp = getPrice_(tmp0,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6);\n";
@@ -2947,56 +2602,32 @@ void OpOddlprice::GenSlidingWindowFunction(std::stringstream &ss,
             size_t nCurWindowSize = pDVR->GetRefRowSize();
             ss << "    for (int i = ";
             if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
-#ifdef  ISNAN
                 ss << "gid0; i < " << pDVR->GetArrayLength();
                 ss << " && i < " << nCurWindowSize  << "; i++){\n";
-#else
-                ss << "gid0; i < "<< nCurWindowSize << "; i++)\n";
-#endif
             } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
-#ifdef  ISNAN
                 ss << "0; i < " << pDVR->GetArrayLength();
                 ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
-#else
-                ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n";
-#endif
             } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
-#ifdef  ISNAN
                 ss << "0; i + gid0 < " << pDVR->GetArrayLength();
                 ss << " &&  i < "<< nCurWindowSize << "; i++){\n";
-#else
-                ss << "0; i < "<< nCurWindowSize << "; i++)\n";
-#endif
             }
             else {
-#ifdef  ISNAN
                 ss << "0; i < "<< nCurWindowSize << "; i++){\n";
-#else
-                ss << "0; i < "<< nCurWindowSize << "; i++)\n";
-#endif
             }
         }
         else if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
             static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#else
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "{\n";
-#endif
         }
         else
         {
-#ifdef  ISNAN
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss << "        if (isNan(";
@@ -3015,10 +2646,6 @@ void OpOddlprice::GenSlidingWindowFunction(std::stringstream &ss,
             ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
             ss <<";\n";
         }
-#else
-    ss << "        tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
-    ss <<";\n";
-#endif
     }
     ss <<"    int nNullDate = GetNullDate();\n";
     ss <<"    tmp = GetOddlprice(nNullDate,tmp0,tmp1,";
@@ -3074,56 +2701,32 @@ void OpOddlyield::GenSlidingWindowFunction(std::stringstream &ss,
             size_t nCurWindowSize = pDVR->GetRefRowSize();
             ss << "    for (int i = ";
             if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
-#ifdef  ISNAN
                 ss << "gid0; i < " << pDVR->GetArrayLength();
                 ss << " && i < " << nCurWindowSize  << "; i++){\n";
-#else
-                ss << "gid0; i < "<< nCurWindowSize << "; i++)\n";
-#endif
             } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
-#ifdef  ISNAN
                 ss << "0; i < " << pDVR->GetArrayLength();
                 ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
-#else
-                ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n";
-#endif
             } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
-#ifdef  ISNAN
                 ss << "0; i + gid0 < " << pDVR->GetArrayLength();
                 ss << " &&  i < "<< nCurWindowSize << "; i++){\n";
-#else
-                ss << "0; i < "<< nCurWindowSize << "; i++)\n";
-#endif
             }
             else {
-#ifdef  ISNAN
                 ss << "0; i < "<< nCurWindowSize << "; i++){\n";
-#else
-                ss << "0; i < "<< nCurWindowSize << "; i++)\n";
-#endif
             }
         }
         else if (pCur->GetType() == formula::svSingleVectorRef)
         {
-#ifdef  ISNAN
             const formula::SingleVectorRefToken* pSVR =
             static_cast< const formula::SingleVectorRefToken* >(pCur);
             ss << "    if (gid0 < " << pSVR->GetArrayLength() << "){\n";
-#else
-#endif
         }
         else if (pCur->GetType() == formula::svDouble)
         {
-#ifdef  ISNAN
             ss << "{\n";
-#endif
         }
         else
         {
-#ifdef  ISNAN
-#endif
         }
-#ifdef  ISNAN
         if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
         {
             ss << "        if (isNan(";
@@ -3142,10 +2745,6 @@ void OpOddlyield::GenSlidingWindowFunction(std::stringstream &ss,
             ss <<vSubArguments[i]->GenSlidingWindowDeclRef();
             ss <<";\n";
         }
-#else

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list