* Bug 16160 fixed: ppol changed values of third input variable 70/21070/5
St├ęphane MOTTELET [Tue, 20 Aug 2019 07:41:33 +0000 (09:41 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=16160

Change-Id: Idd4443a5d3b711c4f98072123e892358dbbfb2b9

scilab/CHANGES.md
scilab/modules/cacsd/sci_gateway/cpp/sci_ppol.cpp
scilab/modules/cacsd/tests/nonreg_tests/bug_16160.tst [new file with mode: 0644]

index df7149a..56953ef 100644 (file)
@@ -239,6 +239,7 @@ Bug Fixes
 * [#16144](http://bugzilla.scilab.org/show_bug.cgi?id=16144): Addition of sparse matrices gave incorrect results.
 * [#16152](http://bugzilla.scilab.org/show_bug.cgi?id=16152): For sparse or boolean sparse matrix `s`, `s([])` returned `[]` instead of `sparse([])`.
 * [#16158](http://bugzilla.scilab.org/show_bug.cgi?id=16158): When a multicolumn array of rationals was displayed wide column per column, columns #2:$ were replaced with its column #2.
+* [#16160](http://bugzilla.scilab.org/show_bug.cgi?id=16160): `ppol` changed values of third input variable.
 * [#16164](http://bugzilla.scilab.org/show_bug.cgi?id=16164): Help pages in elementary_functions/signal_processing were mislocated.
 * [#16174](http://bugzilla.scilab.org/show_bug.cgi?id=16174): `libraryinfo` yielded 0x0 matrix of strings for libs without macro
 * [#16200](http://bugzilla.scilab.org/show_bug.cgi?id=16200): Concatenation of transposed cells crashed Scilab.
@@ -256,4 +257,3 @@ Bug Fixes
 * [#16272](http://bugzilla.scilab.org/show_bug.cgi?id=16272): `spzeros(0,n)` and `spzeros(n,0)` were different from `sparse(0,0)`.
 * [#16275](http://bugzilla.scilab.org/show_bug.cgi?id=16275): `fsolve(x0, fun, tol)` no longer took `tol` into account.
 * [#16293](http://bugzilla.scilab.org/show_bug.cgi?id=16293): Some demos run in step-by-step console mode(4) did not focus user's attention to the console to proceed.
-
index ad38e50..fce2cb0 100644 (file)
@@ -43,8 +43,6 @@ types::Function::ReturnValue sci_ppol(types::typed_list &in, int _iRetCount, typ
     int iSizeP = 0;
     int iColB  = 0;
 
-    bool isDeletable = false;
-
     if (in.size() != 3)
     {
         Scierror(77, _("%s: Wrong number of input argument(s): %d expected.\n"), "ppol", 3);
@@ -75,7 +73,7 @@ types::Function::ReturnValue sci_ppol(types::typed_list &in, int _iRetCount, typ
         return types::Function::Error;
     }
 
-    pDblB = in[1]->clone()->getAs<types::Double>();
+    pDblB = in[1]->getAs<types::Double>();
 
     if (pDblB->isComplex())
     {
@@ -92,7 +90,7 @@ types::Function::ReturnValue sci_ppol(types::typed_list &in, int _iRetCount, typ
         return types::Function::Error;
     }
 
-    pDblA = in[0]->clone()->getAs<types::Double>();
+    pDblA = in[0]->getAs<types::Double>();
 
     if (pDblA->isComplex())
     {
@@ -119,6 +117,12 @@ types::Function::ReturnValue sci_ppol(types::typed_list &in, int _iRetCount, typ
     }
 
     /*** perform operations ***/
+
+    pDblA = pDblA->clone();
+    pDblB = pDblB->clone();
+    pDblP = pDblP->clone();
+    pDblP->setComplex(true);
+
     types::Double* pDblOut = new types::Double(iColB, iSizeP);
 
     double* pdblG   = pDblOut->get();
@@ -129,17 +133,7 @@ types::Function::ReturnValue sci_ppol(types::typed_list &in, int _iRetCount, typ
     int* piW        = new int[iSizeP];
 
     double* pdblPReal = pDblP->get();
-    double* pdblPImg  = NULL;
-    if (pDblP->isComplex())
-    {
-        pdblPImg = pDblP->getImg();
-    }
-    else
-    {
-        pdblPImg = new double[iSizeP];
-        memset(pdblPImg, 0x00, iSizeP * sizeof(double));
-        isDeletable = true;
-    }
+    double* pdblPImg  = pDblP->getImg();
 
     int idc = 0;
     int inc = 0;
@@ -154,12 +148,9 @@ types::Function::ReturnValue sci_ppol(types::typed_list &in, int _iRetCount, typ
         delete[] pdblZ;
         delete[] pdblW;
         delete[] piW;
-        if (isDeletable)
-        {
-            delete[] pdblPImg;
-        }
-        delete pDblA;
-        delete pDblB;
+        pDblA->killMe();
+        pDblB->killMe();
+        pDblP->killMe();
         pDblOut->killMe();
         return types::Function::Error;
     }
@@ -175,34 +166,22 @@ types::Function::ReturnValue sci_ppol(types::typed_list &in, int _iRetCount, typ
     C2F(polmc)( &iSizeP, &iColB, &iSizeP, &iColB, pDblA->get(), pDblB->get(), pdblG, pdblPReal, pdblPImg,
                 pdblZ, &inc, piW, &iErr, pdblW, pdblW + iColB, pdblW1, pdblW2, pdblW3, pdblW4, pdblW5);
 
-    if (iErr)
-    {
-        Scierror(999, _("%s: Uncontrollable system.\n"), "ppol");
-        delete[] pdblZ;
-        delete[] pdblW;
-        delete[] piW;
-        if (isDeletable)
-        {
-            delete[] pdblPImg;
-        }
-        delete pDblA;
-        delete pDblB;
-        pDblOut->killMe();
-        return types::Function::Error;
-    }
-
     // free memory
     delete[] pdblZ;
     delete[] pdblW;
     delete[] piW;
-    if (isDeletable)
+    pDblA->killMe();
+    pDblB->killMe();
+    pDblP->killMe();
+
+    if (iErr)
     {
-        delete[] pdblPImg;
+        Scierror(999, _("%s: Uncontrollable system.\n"), "ppol");
+        pDblOut->killMe();
+        return types::Function::Error;
     }
-    delete pDblA;
-    delete pDblB;
 
-    /*** retrun output arguments ***/
+    /*** return output arguments ***/
     out.push_back(pDblOut);
     return types::Function::OK;
 }
diff --git a/scilab/modules/cacsd/tests/nonreg_tests/bug_16160.tst b/scilab/modules/cacsd/tests/nonreg_tests/bug_16160.tst
new file mode 100644 (file)
index 0000000..fbacfdd
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - St├ęphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 16160 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16160
+//
+// <-- Short Description -->
+// ppol changes values of third input variable
+
+
+A=rand(6,6);
+B=rand(6,1);
+p=[1+%i*0.5 1-%i*0.5 3 -1+%i*0.5 -1-%i*0.5 5];
+K=ppol(A,B,p);
+assert_checkequal(p,[1+%i*0.5 1-%i*0.5 3 -1+%i*0.5 -1-%i*0.5 5]);
\ No newline at end of file