* Bug 15566 fixed: now matrix insertion checks all dimensions of source 29/20029/5
St├ęphane MOTTELET [Wed, 16 May 2018 22:07:56 +0000 (00:07 +0200)]
http://bugzilla.scilab.org/15566

Change-Id: I7ab429075e5c5665e312e8c0381c7b83e1615dc0

scilab/CHANGES.md
scilab/modules/ast/src/cpp/types/arrayof.cpp
scilab/modules/ast/tests/nonreg_tests/bug_15566.tst [new file with mode: 0644]
scilab/modules/ast/tests/unit_tests/colon_insert.dia.ref [deleted file]
scilab/modules/ast/tests/unit_tests/colon_insert.tst

index a653d48..7872657 100644 (file)
@@ -438,6 +438,7 @@ Known issues
 * [#15549](http://bugzilla.scilab.org/show_bug.cgi?id=15549): unary minus incorrectly acted as the negation operator on %t.
 * [#15551](http://bugzilla.scilab.org/show_bug.cgi?id=15551): arithmetic operators gave wrong results with booleans.
 * [#15563](http://bugzilla.scilab.org/show_bug.cgi?id=15563): poly(A,v) was broken when A is a matrix.
+* [#15566](http://bugzilla.scilab.org/show_bug.cgi?id=15566): matrix insertion checked overall size but not individual dimensions.
 
 
 
index 3191e02..93fd4a6 100644 (file)
@@ -99,6 +99,73 @@ ArrayOf<T>* ArrayOf<T>::insert(typed_list* _pArgs, InternalType* _pSource)
         //if complex continue
     }
 
+    typed_list pArg;
+    int iDims = (int)_pArgs->size();
+    int* piMaxDim = new int[iDims];
+    int* piCountDim = new int[iDims];
+    //evaluate each argument and replace by appropriate value and compute the count of combinations
+    int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
+
+    if (iSeqCount == 0)
+    {
+        //free pArg content
+        delete[] piCountDim;
+        delete[] piMaxDim;
+        cleanIndexesArguments(_pArgs, &pArg);
+        return this;
+    }
+
+    ArrayOf* pSource = _pSource->getAs<ArrayOf>();
+
+    //only scalar can be used to ".=" operation
+    if (iSeqCount != pSource->getSize() && pSource->isScalar() == false)
+    {
+        return NULL;
+    }
+
+    //remove last dimension at size 1
+    //remove last dimension if are == 1
+    for (int i = (iDims - 1); i >= m_iDims; i--)
+    {
+        if (piMaxDim[i] == 1)
+        {
+            iDims--;
+            pArg.back()->killMe();
+            pArg.pop_back();
+        }
+        else
+        {
+            break;
+        }
+    }
+
+
+    //insertion of a scalar is always possible regardless of index dimensions
+    if (pSource->isScalar() == false)
+    {
+        int *piSourceDims = pSource->getDimsArray();
+        int sDims = pSource->getDims();
+        int j=0;
+
+        for (int i=0; i<iDims; i++)
+        {
+            if (piCountDim[i]==1)
+            {
+                continue;
+            }
+            while (j<sDims && piSourceDims[j]==1) j++;
+            if (piSourceDims[j] != piCountDim[i])
+            {
+                delete[] piCountDim;
+                delete[] piMaxDim;
+                //free pArg content
+                cleanIndexesArguments(_pArgs, &pArg);
+                return NULL;
+            }
+            j++;
+        }
+    }
+
     std::vector<int> indexes;
     std::vector<int> dims;
     if (getImplicitIndex(this, _pArgs, indexes, dims))
@@ -190,54 +257,14 @@ ArrayOf<T>* ArrayOf<T>::insert(typed_list* _pArgs, InternalType* _pSource)
     }
 
     bool bNeedToResize = false;
-    int iDims = (int)_pArgs->size();
     int iDimsOrigine = m_iDims;
-    typed_list pArg;
-
-    int* piMaxDim = new int[iDims];
-    int* piCountDim = new int[iDims];
 
     //on case of resize
     int* piNewDims = NULL;
     int iNewDims = 0;
-    ArrayOf* pSource = _pSource->getAs<ArrayOf>();
 
     bool bIsColon = false;
 
-    //evaluate each argument and replace by appropriate value and compute the count of combinations
-    int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
-    if (iSeqCount == 0)
-    {
-        //free pArg content
-        delete[] piCountDim;
-        delete[] piMaxDim;
-        cleanIndexesArguments(_pArgs, &pArg);
-        return this;
-    }
-
-    //only scalar can be used to ".=" operation
-    if (iSeqCount != pSource->getSize() && pSource->isScalar() == false)
-    {
-        return NULL;
-    }
-
-    //remove last dimension at size 1
-    //remove last dimension if are == 1
-    for (int i = (iDims - 1); i >= m_iDims; i--)
-    {
-        if (piMaxDim[i] == 1)
-        {
-            iDims--;
-            pArg.back()->killMe();
-            pArg.pop_back();
-        }
-        else
-        {
-            break;
-        }
-    }
-
-
     if (iDims >= m_iDims)
     {
         //all case are good, we can do almost everything
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_15566.tst b/scilab/modules/ast/tests/nonreg_tests/bug_15566.tst
new file mode 100644 (file)
index 0000000..7e00905
--- /dev/null
@@ -0,0 +1,31 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - St├ęphane Mottelet
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 15566 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=15566
+//
+// <-- Short Description -->
+// matrix insertion checked overall size but not individual dimensions
+
+scalar = 5;
+vect = 1:5;
+vect2 = 6:10;
+mat = [1,2,3,4;5,6,7,8];
+hm = zeros(3,4,2); hm(:) = 1:24;
+
+assert_checkerror("a=mat; a(:,:,2) = 9:16", "Submatrix incorrectly defined.");
+assert_checkerror("a=mat; a(:,:,:,2) = 9:16", "Submatrix incorrectly defined.");
+assert_checkerror("a=hm; a(:,:) = hm(:)", "Submatrix incorrectly defined.");
+assert_checkerror("a=hm; a(:,:,:,2) = hm(:)", "Submatrix incorrectly defined.");
+assert_checkerror("a=mat; a(:,:) = mat(:)", "Submatrix incorrectly defined.");
+assert_checkerror("a=mat; a(:,:,2) = mat(:)", "Submatrix incorrectly defined.");
+assert_checkerror("a=mat; a(:,:,:,2) = mat(:)", "Submatrix incorrectly defined.");
diff --git a/scilab/modules/ast/tests/unit_tests/colon_insert.dia.ref b/scilab/modules/ast/tests/unit_tests/colon_insert.dia.ref
deleted file mode 100644 (file)
index 0e431bb..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
-//
-// Copyright (C) 2012 - 2016 - Scilab Enterprises
-//
-// This file is hereby licensed under the terms of the GNU GPL v2.0,
-// pursuant to article 5.3.4 of the CeCILL v.2.1.
-// This file was originally licensed under the terms of the CeCILL v2.1,
-// and continues to be available under such terms.
-// For more information, see the COPYING file which you should have received
-// along with this program.
-//
-//
-// <-- CLI SHELL MODE -->
-scalar = 5;
-vect = 1:5;
-vect2 = 6:10;
-mat = [1,2,3,4;5,6,7,8];
-hm = zeros(3,4,2); hm(:) = 1:24;
-// scalar
-clear a; a(:) = scalar;
-assert_checkequal(a, scalar);
-clear a; a(:,:) = scalar;
-assert_checkequal(a, scalar);
-clear a; a(:,:,:) = scalar;
-assert_checkequal(a, scalar);
-clear a; a(:,:,2) = scalar;
-assert_checkequal(a, matrix([0;scalar], 1, 1, 2));
-//scalar insert
-a=scalar; a(:) = scalar;
-assert_checkequal(a, scalar);
-a=scalar; a(:,:) = scalar;
-assert_checkequal(a, scalar);
-a=scalar; a(:,:,2) = scalar;
-assert_checkequal(a, matrix([scalar; scalar], 1, 1, 2));
-//vector
-a=vect; a(:) = scalar;
-assert_checkequal(a, [scalar scalar scalar scalar scalar]);
-a=vect; a(:,:) = scalar;
-assert_checkequal(a, [scalar scalar scalar scalar scalar]);
-a=vect; a(:,:,:) = scalar;
-assert_checkequal(a, [scalar scalar scalar scalar scalar]);
-a=vect; a(:,:,2) = scalar;
-assert_checkequal(a, matrix([vect, scalar,scalar,scalar,scalar,scalar], 1, 5, 2));
-//matrix
-a=mat; a(:) = scalar;
-assert_checkequal(a, matrix([scalar,scalar,scalar,scalar,scalar,scalar,scalar,scalar], 2, 4));
-a=mat; a(:,:) = scalar;
-assert_checkequal(a, matrix([scalar,scalar,scalar,scalar,scalar,scalar,scalar,scalar], 2, 4));
-a=mat; a(:,:,:) = scalar;
-assert_checkequal(a, matrix([scalar,scalar,scalar,scalar,scalar,scalar,scalar,scalar], 2, 4));
-a=mat; a(:,:,2) = scalar;
-assert_checkequal(a, matrix([mat(:)' scalar scalar scalar scalar scalar scalar scalar scalar], 2, 4, 2));
-//hypermatrix
-a=hm; a(:) = scalar;
-assert_checkequal(a, matrix([scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar], 3, 4, 2));
-a=hm; a(:,:) = scalar;
-assert_checkequal(a, matrix([scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar], 3, 4, 2));
-a=hm; a(:,:,:) = scalar;
-assert_checkequal(a, matrix([scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar], 3, 4, 2));
-a=hm; a(:,:,2) = scalar;
-assert_checkequal(a, matrix([(hm(:,:,1)(:))' scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar scalar], 3, 4, 2));
-//vector new insert
-clear a; a(:) = vect;
-assert_checkequal(a, vect);
-clear a; a(:,:) = vect;
-assert_checkequal(a, vect);
-clear a; a(:,:,:) = vect;
-assert_checkequal(a, vect);
-clear a; a(:,:,2) = vect;
-assert_checkequal(a, matrix([0 0 0 0 0 vect], 1, 5, 2));
-clear a; a(:,:,:,2) = vect;
-assert_checkequal(a, matrix([0 0 0 0 0 vect], 1, 5, 1, 2));
-clear a; a(:) = vect';
-assert_checkequal(a, vect');
-clear a; a(:,:) = vect';
-assert_checkequal(a, vect');
-clear a; a(:,:,:) = vect';
-assert_checkequal(a, vect');
-clear a; a(:,:,2) = vect';
-assert_checkequal(a, matrix([0 0 0 0 0 vect], 5, 1, 2));
-clear a; a(:,:,:,2) = vect';
-assert_checkequal(a, matrix([0 0 0 0 0 vect], 5, 1, 1, 2));
-clear a; a(:,1,:) = vect;
-assert_checkequal(a, matrix(vect, 1, 1, 5));
-clear a; a(:,1,:) = vect';
-assert_checkequal(a, vect');
-a=vect; a(:) = vect2;
-assert_checkequal(a, vect2);
-a=vect; a(:,:) = vect2;
-assert_checkequal(a, vect2);
-a=vect; a(:,:,:) = vect2;
-assert_checkequal(a, vect2);
-a=vect; a(:,:,2) = vect2;
-assert_checkequal(a, matrix([vect vect2], 1, 5, 2));
-a=vect; a(:,:,:,2) = vect2;
-assert_checkequal(a, matrix([vect vect2], 1, 5, 1, 2));
-a=mat; a(:,:,2) = 9:16;
-assert_checkequal(a, matrix([mat(:)', 9:16], 2, 4, 2));
-a=mat; a(:,:,:,2) = 9:16;
-assert_checkequal(a, matrix([mat(:)', 9:16], 2, 4, 1, 2));
-a=hm; a(:) = hm(:);
-assert_checkequal(a, hm);
-a=hm; a(:,:) = hm(:);
-assert_checkequal(a, hm);
-a=hm; a(:,:,2) = hm(:,:,1);
-assert_checkequal(a, matrix([hm(:,:,1)(:);hm(:,:,1)(:)], 3, 4, 2));
-a=hm; a(:,:,:,2) = hm(:);
-assert_checkequal(a, matrix([hm(:);hm(:)], 3,4,2,2));
-//matrix
-clear a; a(:) = mat;
-assert_checkequal(a, mat);
-clear a; a(:,:) = mat;
-assert_checkequal(a, mat);
-clear a; a(:,:,:) = mat;
-assert_checkequal(a, mat);
-clear a; a(:,:,2) = mat;
-assert_checkequal(a, matrix([zeros(mat(:));mat(:)], 2, 4, 2));
-clear a; a(:,:,:,2) = mat;
-assert_checkequal(a, matrix([zeros(mat(:));mat(:)], 2, 4, 1, 2));
-clear a; a(:,1,:) = mat;
-assert_checkequal(a, matrix(mat, 2, 1, 4));
-a=mat; a(:) = mat(:);
-assert_checkequal(a, mat);
-a=mat; a(:,:) = mat(:);
-assert_checkequal(a, mat);
-a=mat; a(:,:,2) = mat(:);
-assert_checkequal(a, matrix([mat(:);mat(:)], 2, 4, 2));
-a=mat; a(:,:,:,2) = mat(:)
- a  = 
-(:,:,1,1)
-   1.   2.   3.   4.
-   5.   6.   7.   8.
-(:,:,1,2)
-   1.   2.   3.   4.
-   5.   6.   7.   8.
-assert_checkequal(a, matrix([mat(:);mat(:)], 2, 4, 1, 2));
-//hypermatrix
-clear a; a(:) = hm;
-assert_checkequal(a, hm);
-clear a; a(:,:) = hm;
-assert_checkequal(a, hm);
-clear a; a(:,:,:) = hm;
-assert_checkequal(a, hm);
-clear a; a(:,:,:, 2) = hm;
-assert_checkequal(a, matrix([zeros(hm)(:);hm(:)], 3, 4, 2, 2));
-clear a; a(:,1,:,:) = hm;
-assert_checkequal(a, matrix(hm, 3, 1, 4, 2));
index 63ef4c3..0cc02e4 100644 (file)
@@ -11,7 +11,7 @@
 // along with this program.
 //
 //
-
+// <-- NO CHECK REF -->
 // <-- CLI SHELL MODE -->
 
 scalar = 5;
@@ -134,22 +134,22 @@ assert_checkequal(a, matrix([vect vect2], 1, 5, 2));
 a=vect; a(:,:,:,2) = vect2;
 assert_checkequal(a, matrix([vect vect2], 1, 5, 1, 2));
 
-a=mat; a(:,:,2) = 9:16;
+a=mat; a(:,:,2) = matrix(9:16,2,4);
 assert_checkequal(a, matrix([mat(:)', 9:16], 2, 4, 2));
 
-a=mat; a(:,:,:,2) = 9:16;
+a=mat; a(:,:,:,2) = matrix(9:16,2,4);
 assert_checkequal(a, matrix([mat(:)', 9:16], 2, 4, 1, 2));
 
 a=hm; a(:) = hm(:);
 assert_checkequal(a, hm);
 
-a=hm; a(:,:) = hm(:);
+a=hm; a(:,:) = hm(:,:);
 assert_checkequal(a, hm);
 
 a=hm; a(:,:,2) = hm(:,:,1);
 assert_checkequal(a, matrix([hm(:,:,1)(:);hm(:,:,1)(:)], 3, 4, 2));
 
-a=hm; a(:,:,:,2) = hm(:);
+a=hm; a(:,:,:,2) = hm(:,:,:);
 assert_checkequal(a, matrix([hm(:);hm(:)], 3,4,2,2));
 
 
@@ -175,13 +175,13 @@ assert_checkequal(a, matrix(mat, 2, 1, 4));
 a=mat; a(:) = mat(:);
 assert_checkequal(a, mat);
 
-a=mat; a(:,:) = mat(:);
+a=mat; a(:,:) = mat(:,:);
 assert_checkequal(a, mat);
 
-a=mat; a(:,:,2) = mat(:);
+a=mat; a(:,:,2) = mat(:,:);
 assert_checkequal(a, matrix([mat(:);mat(:)], 2, 4, 2));
 
-a=mat; a(:,:,:,2) = mat(:)
+a=mat; a(:,:,:,2) = mat(:,:)
 assert_checkequal(a, matrix([mat(:);mat(:)], 2, 4, 1, 2));
 
 //hypermatrix