* Bug 16474 fixed: imult(%z) crashed Scilab (6.0 regression) 33/21533/2
mottelet [Fri, 10 Jul 2020 12:00:26 +0000 (14:00 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=16474

Change-Id: Iaade4566e28e1ef77fff23a3a5315ada2bb0ba21

scilab/CHANGES.md
scilab/modules/elementary_functions/sci_gateway/cpp/sci_imult.cpp
scilab/modules/elementary_functions/tests/nonreg_tests/bug_16474.tst [new file with mode: 0644]

index 6897dea..4902d29 100644 (file)
@@ -313,6 +313,7 @@ Bug Fixes
 * [#16458](https://bugzilla.scilab.org/16458): `mean()` did not handle sparse numerical matrices.
 * [#16465](https://bugzilla.scilab.org/16465): Scinotes OpenRecent menu was not updated when it should.
 * [#16473](https://bugzilla.scilab.org/16473): Deleting rows in a sparse squared the matrix with padding zeros (Scilab 6 regression).
+* [#16474](https://bugzilla.scilab.org/16474): `imult(%z)` crashed Scilab.
 * [#16522](https://bugzilla.scilab.org/16522): `bitget(x,pos)` and `bitset(x,pos)` results could be wrong when `pos` is an encoded integer.
 
 
index ac20f44..48e1feb 100644 (file)
@@ -111,37 +111,32 @@ types::Function::ReturnValue sci_imult(types::typed_list &in, int _iRetCount, ty
     else if (in[0]->isPoly())
     {
         types::Polynom* pPolyIn = in[0]->getAs<types::Polynom>();
-        types::Polynom* pPolyOut = new types::Polynom(pPolyIn->getVariableName(), pPolyIn->getDims(), pPolyIn->getDimsArray());
+        types::Polynom* pPolyOut = pPolyIn->clone();
         pPolyOut->setComplex(true);
 
-        double* dataImg  = NULL;
-        double* dataReal = NULL;
-
-        for (int i = 0; i < pPolyIn->getSize(); i++)
+        for (int i = 0; i < pPolyOut->getSize(); i++)
         {
-            int rank = pPolyIn->get(i)->getRank();
-            types::SinglePoly* pSP = new types::SinglePoly(&dataReal, &dataImg, rank);
-
+            types::SinglePoly* pSP = pPolyOut->get(i);
+            double* dataReal = pSP->get();
+            double* dataImg = pSP->getImg();
+            int rank = pSP->getRank();
             if (pPolyIn->isComplex())
             {
                 for (int j = 0; j < rank + 1; j++)
                 {
-                    dataReal[j] = pPolyIn->get(i)->getImg()[j] * -1;
-                    dataImg[j]  = pPolyIn->get(i)->get()[j];
+                    double dblBuf = dataReal[j];
+                    dataReal[j] = -dataImg[j];
+                    dataImg[j] = dblBuf;
                 }
             }
             else
             {
                 for (int j = 0; j < rank + 1; j++)
                 {
+                    dataImg[j] = dataReal[j];
                     dataReal[j] = 0;
-                    dataImg[j]  = pPolyIn->get(i)->get()[j];
                 }
             }
-
-            pPolyOut->set(i, pSP);
-            delete pSP;
-            pSP = NULL;
         }
 
         out.push_back(pPolyOut);
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_16474.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_16474.tst
new file mode 100644 (file)
index 0000000..2703556
--- /dev/null
@@ -0,0 +1,19 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - 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 16474 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16474
+//
+// <-- Short Description -->
+// imult(%z) crashes Scilab 
+
+assert_checkequal(imult(%i+%s),-1+%i*%s)
\ No newline at end of file