* Bug 16449 fixed: insertion of implicit vector in cell was crashing 73/21473/5
mottelet [Fri, 29 May 2020 15:04:13 +0000 (17:04 +0200)]
https://bugzilla.scilab.org/show_bug.cgi?id=16449

Change-Id: Iaca5c586c0060017aef6e8205dc788cb10c9684d

scilab/CHANGES.md
scilab/modules/ast/src/cpp/ast/run_AssignExp.hpp
scilab/modules/ast/src/cpp/types/cell.cpp
scilab/modules/ast/tests/nonreg_tests/bug_16449.tst [new file with mode: 0644]

index 3eb57ad..4bc08da 100644 (file)
@@ -293,11 +293,11 @@ Bug Fixes
 * [#16406](https://bugzilla.scilab.org/16406): `edit_curv` yielded an error when reading data.
 * [#16408](https://bugzilla.scilab.org/16408): toJSON(var, indent, filename) is the right call sequence. Documentation has been udpated.
 * [#16445](https://bugzilla.scilab.org/16445): `colorbar(..)` ignored how to guess `umin` and `umax` for a Champ object (with .colored="on").
+* [#16449](https://bugzilla.scilab.org/16449): Insertion of implicit vector in Cell was crahsing Scilab
 * [#16452](https://bugzilla.scilab.org/16452): `setdiff(sparse([1 3 0 2]), sparse([3 7]))` missed returning 0, and wrongly returned 3.
 * [#16454](https://bugzilla.scilab.org/16454): `gsort` yielded an error when sorting any sparse vector including some NaN.
 * [#16473](https://bugzilla.scilab.org/16473): Deleting rows in a sparse squared the matrix with padding zeros (Scilab 6 regression).
 
-
 ### Bugs fixed in 6.1.0:
 * [#2694](https://bugzilla.scilab.org/2694): `bitget` did not accept positive integers of types int8, int16 or int32.
 * [#5824](https://bugzilla.scilab.org/5824): The `datafit` algorithm was not documented.
index ae123c9..ec8249b 100644 (file)
@@ -131,7 +131,7 @@ void RunVisitorT<T>::visitprivate(const AssignExp  &e)
                 ostr << L" " << wstrName << L"  = " << std::endl;
                 if (ConfigVariable::isPrintCompact() == false)
                 {
-                    ostr << std::endl;                
+                    ostr << std::endl;
                 }
                 scilabWriteW(ostr.str().c_str());
                 std::wostringstream ostrName;
@@ -191,6 +191,17 @@ void RunVisitorT<T>::visitprivate(const AssignExp  &e)
                 throw ast::InternalError(os.str(), 999, e.getRightExp().getLocation());
             }
 
+            if (pITR->isImplicitList())
+            {
+                if (pITR->getAs<types::ImplicitList>()->isComputable())
+                {
+                    types::InternalType *pTemp = pITR->getAs<types::ImplicitList>()->extractFullMatrix();
+                    delete pITR;
+                    setResult(NULL);
+                    pITR = pTemp;
+                }
+            }
+
             try
             {
                 pOut = evaluateFields(pCell, fields, pITR);
@@ -230,7 +241,7 @@ void RunVisitorT<T>::visitprivate(const AssignExp  &e)
                     ostr << L" " << *getStructNameFromExp(pCell) << L"  = " << std::endl;
                     if (ConfigVariable::isPrintCompact() == false)
                     {
-                        ostr << std::endl;                
+                        ostr << std::endl;
                     }
                     scilabWriteW(ostr.str().c_str());
 
@@ -403,7 +414,7 @@ void RunVisitorT<T>::visitprivate(const AssignExp  &e)
                 ostr << L" " << *getStructNameFromExp(&pCall->getName()) << L"  = " << std::endl;
                 if (ConfigVariable::isPrintCompact() == false)
                 {
-                    ostr << std::endl;                
+                    ostr << std::endl;
                 }
                 scilabWriteW(ostr.str().c_str());
 
@@ -549,7 +560,7 @@ void RunVisitorT<T>::visitprivate(const AssignExp  &e)
                 ostr << L" " << *pstName << L"  = " << std::endl;
                 if (ConfigVariable::isPrintCompact() == false)
                 {
-                    ostr << std::endl;                
+                    ostr << std::endl;
                 }
                 scilabWriteW(ostr.str().c_str());
 
index 1748bb6..eb94fd3 100644 (file)
@@ -367,8 +367,7 @@ bool Cell::subMatrixToString(std::wostringstream& ostr, int* _piDims, int /*_iDi
                     else
                     {
                         //types non derived from ArrayOf.
-                        int iSize = static_cast<int>(log10(static_cast<double>(pIT->getAs<GenericType>()->getRows())) + 1);
-                        piSizeLen[j] = std::max(piSizeLen[j], iSize);
+                        piSizeLen[j] = std::max(piSizeLen[j], 1);
                     }
                 }
                 else
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_16449.tst b/scilab/modules/ast/tests/nonreg_tests/bug_16449.tst
new file mode 100644 (file)
index 0000000..4745502
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// 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 16449 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16449
+//
+// <-- Short Description -->
+// insertion of implicit vector in cell crashes Scilab
+
+b = cell(1,1);
+b{1} = 1:3;
+disp(b)