* Bug 14606 fixed: now `[names,mem]=who()` returns memory used by variables 66/20666/3
Stéphane Mottelet [Thu, 5 Jul 2018 17:04:04 +0000 (19:04 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=14606

Change-Id: Idabdfb047ac73cc60afb4950c7af2f0eeb3c6db5

52 files changed:
scilab/CHANGES.md
scilab/modules/ast/includes/symbol/context.hxx
scilab/modules/ast/includes/symbol/variables.hxx
scilab/modules/ast/includes/types/alltypes.hxx
scilab/modules/ast/includes/types/arrayof.hxx
scilab/modules/ast/includes/types/cell.hxx
scilab/modules/ast/includes/types/graphichandle.hxx
scilab/modules/ast/includes/types/implicitlist.hxx
scilab/modules/ast/includes/types/internal.hxx
scilab/modules/ast/includes/types/library.hxx
scilab/modules/ast/includes/types/list.hxx
scilab/modules/ast/includes/types/macro.hxx
scilab/modules/ast/includes/types/macrofile.hxx
scilab/modules/ast/includes/types/mlist.hxx
scilab/modules/ast/includes/types/polynom.hxx
scilab/modules/ast/includes/types/singlestruct.hxx
scilab/modules/ast/includes/types/sparse.hxx
scilab/modules/ast/includes/types/string.hxx
scilab/modules/ast/includes/types/struct.hxx
scilab/modules/ast/includes/types/tlist.hxx
scilab/modules/ast/includes/types/user.hxx
scilab/modules/ast/src/cpp/symbol/context.cpp
scilab/modules/ast/src/cpp/symbol/variables.cpp
scilab/modules/ast/src/cpp/types/arrayof.cpp
scilab/modules/ast/src/cpp/types/cell.cpp
scilab/modules/ast/src/cpp/types/graphichandle.cpp
scilab/modules/ast/src/cpp/types/implicitlist.cpp
scilab/modules/ast/src/cpp/types/library.cpp
scilab/modules/ast/src/cpp/types/list.cpp
scilab/modules/ast/src/cpp/types/macro.cpp
scilab/modules/ast/src/cpp/types/macrofile.cpp
scilab/modules/ast/src/cpp/types/mlist.cpp
scilab/modules/ast/src/cpp/types/polynom.cpp
scilab/modules/ast/src/cpp/types/singlestruct.cpp
scilab/modules/ast/src/cpp/types/sparse.cpp
scilab/modules/ast/src/cpp/types/string.cpp
scilab/modules/ast/src/cpp/types/struct.cpp
scilab/modules/ast/src/cpp/types/tlist.cpp
scilab/modules/ast/src/cpp/types/types_tools.cpp
scilab/modules/core/help/en_US/variables/who.xml
scilab/modules/core/help/fr_FR/variables/who.xml
scilab/modules/core/help/ja_JP/variables/who.xml
scilab/modules/core/help/pt_BR/variables/who.xml
scilab/modules/core/help/ru_RU/variables/who.xml
scilab/modules/core/macros/whos.sci
scilab/modules/core/sci_gateway/cpp/sci_checkNamedArguments.cpp
scilab/modules/core/sci_gateway/cpp/sci_who.cpp
scilab/modules/core/tests/nonreg_tests/bug_14606.linux.dia.ref [new file with mode: 0644]
scilab/modules/core/tests/nonreg_tests/bug_14606.macosx.dia.ref [new file with mode: 0644]
scilab/modules/core/tests/nonreg_tests/bug_14606.tst [new file with mode: 0644]
scilab/modules/core/tests/nonreg_tests/bug_14606.win.dia.ref [new file with mode: 0644]
scilab/modules/mexlib/src/cpp/mexlib.cpp

index b621a6d..74fb259 100644 (file)
@@ -130,6 +130,7 @@ Bug Fixes
 * [#8784](http://bugzilla.scilab.org/show_bug.cgi?id=8784): Automatic self-adjusting blocks `SCALE_CSCOPE` & `SCALE_CMSCOPE` in Xcos.
 * [#14604](http://bugzilla.scilab.org/show_bug.cgi?id=14604): `emptystr()` is 40x slower with 6.0.0 wrt 5.5.2
 * [#14605](http://bugzilla.scilab.org/show_bug.cgi?id=14605): fixed - `bench_run` was too strict about the specification of tests names.
+* [#14606](http://bugzilla.scilab.org/show_bug.cgi?id=14606): Memory used by variables returned by `[names,mem]=who()` was always zero.
 * [#14812](http://bugzilla.scilab.org/show_bug.cgi?id=14812): Minor typos in messages.
 * [#14863](http://bugzilla.scilab.org/show_bug.cgi?id=14863): In Xcos, the default ending time was unhandily high (100000), reduced it to 30.
 * [#14982](http://bugzilla.scilab.org/show_bug.cgi?id=14982): `msprintf` segmentation fault was caught due to wrong size
index 6b9df0e..a9ba868 100644 (file)
@@ -85,9 +85,9 @@ public:
     int getVarsName(std::list<std::wstring>& lst);
     int getMacrosName(std::list<std::wstring>& lst);
     int getFunctionsName(std::list<std::wstring>& lst);
-    int getVarsNameForWho(std::list<std::wstring>& lst, bool sorted);
-    int getGlobalNameForWho(std::list<std::wstring>& lst, bool sorted);
-    int getCurrentScope(std::list<std::wstring>& lst, bool sorted);
+    int getCurrentScope(std::list<std::pair<std::wstring, int>>& lst, bool bSorted);
+    int getVarsInfoForWho(std::list<std::pair<std::wstring, int>>& lst, bool bSorted);
+    int getGlobalInfoForWho(std::list<std::pair<std::wstring, int>>& lst, bool bSorted);
     int getWhereIs(std::list<std::wstring>& lst, const std::wstring& _str);
     int getLibrariesList(std::list<std::wstring>& lst);
     int getVarsToVariableBrowser(std::list<Variable*>& lst);
index c96549d..a18ef6b 100644 (file)
@@ -155,14 +155,14 @@ struct Variables
     bool remove(const Symbol& _key, int _iLevel);
     int getMacrosName(std::list<std::wstring>& lst);
     int getVarsName(std::list<std::wstring>& lst);
-    bool getVarsNameForWho(std::list<std::wstring>& lstVarName, int* iVarLenMax, bool bSorted = false) const;
-    bool getGlobalNameForWho(std::list<std::wstring>& lstVarName, int* iVarLenMax, bool bSorted = false) const;
+    bool getVarsInfoForWho(std::list<std::pair<std::wstring, int>>& lst, int* iVarLenMax, bool bSorted = false) const;
+    bool getGlobalInfoForWho(std::list<std::pair<std::wstring, int>>& lst, int* iVarLenMax, bool bSorted = false) const;
     int getProtectedVarsName(std::list<std::wstring>& lstVarName) const;
     int getFunctionsName(std::list<std::wstring>& lst);
     int getFunctionList(std::list<Symbol>& lst, std::wstring _stModuleName, int _iLevel);
     int getFunctionList(std::list<types::Callable *>& lst, std::wstring _stModuleName, int _iLevel);
     int getVarsToVariableBrowser(std::list<Variable*>& lst);
-    int getCurrentScope(std::list<std::wstring>& lst, int level, bool sorted);
+    int getCurrentScope(std::list<std::pair<std::wstring, int>>& lst, int level, bool sorted);
     bool putInPreviousScope(Variable* _var, types::InternalType* _pIT, int _iLevel);
 
     //globals
index 2290bde..93de298 100644 (file)
@@ -53,5 +53,6 @@
 #include "graphichandle.hxx"
 #include "void.hxx"
 #include "library.hxx"
+#include "user.hxx"
 
 #endif /* !ALL_TYPES_HXX */
index fe16ef8..84362c2 100644 (file)
@@ -500,6 +500,8 @@ public :
 
     void getIndexes(int _iIndex, int* _piIndexes);
 
+    virtual bool getMemory(int* _piSize, int* _piSizePlusType);
+
     ArrayOf<T>* getColumnValues(int _iPos)
     {
         ArrayOf<T>* pOut = NULL;
index 1f32ace..fd77016 100644 (file)
@@ -109,6 +109,8 @@ public :
 
     virtual bool transpose(InternalType *& out);
 
+    bool getMemory(int* _piSize, int* _piSizePlusType);
+
 private :
     virtual InternalType*   getNullValue();
     virtual Cell*           createEmpty(int _iDims, int* _piDims, bool _bComplex = false);
index cda1600..3f142de 100644 (file)
@@ -82,6 +82,8 @@ public :
 
     virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, const ast::Exp & e) override ;
 
+    bool getMemory(int* _piSize, int* _piSizePlusType);
+
 protected :
     inline ScilabType          getType(void)
     {
index 9826962..bed1897 100644 (file)
@@ -158,6 +158,9 @@ public :
     virtual bool transpose(InternalType *& out);
     virtual bool neg(InternalType *& out);
     virtual ast::Exp * getExp(const Location & loc);
+
+    bool getMemory(int* _piSize, int* _piSizePlusType);
+
 };
 }
 
index 3dd10a7..1e2b93e 100644 (file)
@@ -337,6 +337,14 @@ public :
     virtual bool hasInvokeOption() const;
     virtual int getInvokeNbIn();
     virtual int getInvokeNbOut();
+
+    virtual bool getMemory(int* _piSize, int* _piSizePlusType)
+    {
+        *_piSize = 0;
+        *_piSizePlusType = 0;
+        return false;
+    }
+
     /* return type as string ( double, int, cell, list, ... )*/
     virtual std::wstring            getTypeStr() const = 0;
     /* return type as short string ( s, i, ce, l, ... )*/
index ce30705..d8e86d2 100644 (file)
@@ -67,6 +67,7 @@ public :
     MacroFile* get(const std::wstring& _wstName);
     int getMacrosName(std::list<std::wstring>& lst);
     std::wstring getPath();
+    bool getMemory(int* _piSize, int* _piSizePlusType);
 private:
     std::wstring m_wstPath;
     typedef std::unordered_map<std::wstring, MacroFile*> MacroMap;
index 05d6c4c..066c3a6 100644 (file)
@@ -46,7 +46,9 @@ public :
     {
         return IdList;
     }
-
+    
+    bool                            getMemory(int* _piSize, int* _piSizePlusType);
+    
     /**
     ** append(InternalType *_typedValue)
     ** Append the given value to the end of the List
index 1b8d540..56c9b59 100644 (file)
@@ -66,6 +66,8 @@ public :
 
     ast::SeqExp*                getBody();
 
+    bool                        getMemory(int* _piSize, int* _piSizePlusType);
+
     /* return type as string ( double, int, cell, list, ... )*/
     virtual std::wstring        getTypeStr() const
     {
index 3a24844..81d3fe1 100644 (file)
@@ -58,6 +58,8 @@ public :
 
     void                    setLines(int _iFirstLine, int _iLastLine);
 
+    bool                    getMemory(int* _piSize, int* _piSizePlusType);
+
     /* return type as string ( double, int, cell, list, ... )*/
     virtual std::wstring    getTypeStr() const
     {
index 22f68f9..d3821ea 100644 (file)
@@ -49,6 +49,8 @@ public :
         return false;
     }
 
+    bool                            getMemory(int* _piSize, int* _piSizePlusType);
+
     virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, const ast::Exp & e) override;
 
 protected :
index 522e3b8..8fbd774 100644 (file)
@@ -119,6 +119,8 @@ public :
         return false;
     }
 
+    bool getMemory(int* _piSize, int* _piSizePlusType);
+
     bool transpose(InternalType *& out);
     bool adjoint(InternalType *& out);
 
index 7fffc9b..6e6fb1f 100644 (file)
@@ -85,6 +85,8 @@ public :
         return L"sst";
     }
 
+    bool                                    getMemory(int* _piSize, int* _piSizePlusType);
+
 private :
 
     std::unordered_map<std::wstring, int> m_wstFields;
index df7193e..3c19d3e 100644 (file)
@@ -80,6 +80,8 @@ struct EXTERN_AST Sparse : GenericType
         return true;
     }
     void finalize();
+    
+    bool getMemory(int *_piSize, int* _piSizePlusType);
 
     /*data management member function defined for compatibility with the Double API*/
     Sparse* set(int _iRows, int _iCols, double _dblReal, bool _bFinalize = true);
@@ -516,6 +518,8 @@ struct EXTERN_AST SparseBool : GenericType
     }
     void finalize();
 
+    bool getMemory(int *_piSize, int* _piSizePlusType);
+
     bool toString(std::wostringstream& ostr);
 
     /* Config management and GenericType methods overrides */
index a26a0dd..c6bcaff 100644 (file)
@@ -90,6 +90,8 @@ public :
         return false;
     }
 
+    bool getMemory(int* _piSize, int* _piSizePlusType);
+
     virtual bool neg(InternalType *& /*out*/)
     {
         return false;
index 964fb64..387e891 100644 (file)
@@ -133,6 +133,8 @@ public :
         return -1;
     }
 
+    bool                        getMemory(int* _piSize, int* _piSizePlusType);
+
 private :
     virtual SingleStruct*       getNullValue();
     virtual Struct*             createEmpty(int _iDims, int* _piDims, bool _bComplex = false);
index c4940a1..36829cd 100644 (file)
@@ -76,6 +76,8 @@ public :
 
     bool                            toString(std::wostringstream& ostr);
 
+    bool                            getMemory(int* _piSize, int* _piSizePlusType);
+
 private :
 };
 }
index e1c0185..a94cc26 100644 (file)
@@ -167,6 +167,13 @@ public :
     }
 
     //load must be done by overload %yourtype_load and must returns a pointer on your UserType
+
+    bool getMemory(int* _piSize, int* _piSizePlusType)
+    {
+        *_piSize = sizeof(UserType);
+        *_piSizePlusType = *_piSize;
+        return true;
+    }
 };
 }
 
index 30b3766..6e33528 100644 (file)
@@ -308,17 +308,17 @@ int Context::getFunctionsName(std::list<std::wstring>& lst)
     return variables.getFunctionsName(lst);
 }
 
-int Context::getVarsNameForWho(std::list<std::wstring>& lst, bool bSorted)
+int Context::getVarsInfoForWho(std::list<std::pair<std::wstring, int>>& lst, bool bSorted)
 {
     int iZero = 0;
-    variables.getVarsNameForWho(lst, &iZero, bSorted);
+    variables.getVarsInfoForWho(lst, &iZero, bSorted);
     return static_cast<int>(lst.size());
 }
 
-int Context::getGlobalNameForWho(std::list<std::wstring>& lst, bool bSorted)
+int Context::getGlobalInfoForWho(std::list<std::pair<std::wstring, int>>& lst, bool bSorted)
 {
     int iZero = 0;
-    variables.getGlobalNameForWho(lst, &iZero, bSorted);
+    variables.getGlobalInfoForWho(lst, &iZero, bSorted);
     return static_cast<int>(lst.size());
 }
 
@@ -499,13 +499,13 @@ void Context::removeGlobalAll()
 
 void Context::print(std::wostream& ostr, bool sorted) const
 {
-    std::list<std::wstring> lstVar;
-    std::list<std::wstring> lstGlobal;
+    std::list<std::pair<std::wstring, int>> lstVar;
+    std::list<std::pair<std::wstring, int>> lstGlobal;
     int iVarLenMax = 10; // initialise to the minimal value of padding
     int iGlobalLenMax = 10; // initialise to the minimal value of padding
-    variables.getVarsNameForWho(lstVar, &iVarLenMax);
-    variables.getGlobalNameForWho(lstGlobal, &iGlobalLenMax);
-    libraries.getVarsNameForWho(&lstVar, &iVarLenMax);
+    variables.getVarsInfoForWho(lstVar, &iVarLenMax);
+    variables.getGlobalInfoForWho(lstGlobal, &iGlobalLenMax);
+    //libraries.getVarsNameForWho(&lstVar, &iVarLenMax);
 
     if (sorted)
     {
@@ -513,6 +513,7 @@ void Context::print(std::wostream& ostr, bool sorted) const
         lstGlobal.sort();
     }
 
+
 #define strSize 64
     wchar_t wcsVarElem[strSize];
     wchar_t wcsVarVariable[strSize];
@@ -533,7 +534,7 @@ void Context::print(std::wostream& ostr, bool sorted) const
 #endif
 
     ostr << _W("Your variables are:") << std::endl << std::endl;
-    std::list<std::wstring>::const_iterator it = lstVar.begin();
+    std::list<std::pair<std::wstring, int>>::const_iterator it = lstVar.begin();
     int iWidth = ConfigVariable::getConsoleWidth();
     int iCurrentWidth = 0;
     for (int i = 1; it != lstVar.end(); ++it, i++)
@@ -543,7 +544,7 @@ void Context::print(std::wostream& ostr, bool sorted) const
             ostr << std::endl;
             iCurrentWidth = 0;
         }
-        ostr << std::setw(iVarLenMax + 1) << *it;
+        ostr << std::setw(iVarLenMax + 1) << it->first;
         iCurrentWidth += iVarLenMax + 1;
     }
 
@@ -557,7 +558,7 @@ void Context::print(std::wostream& ostr, bool sorted) const
     it = lstGlobal.begin();
     for (int i = 1; it != lstGlobal.end(); ++it, i++)
     {
-        ostr << std::setw(iGlobalLenMax + 1) << *it;
+        ostr << std::setw(iGlobalLenMax + 1) << it->first;
         if (i % 4 == 0)
         {
             ostr << std::endl;
@@ -631,9 +632,9 @@ int Context::getVarsToVariableBrowser(std::list<Variable*>& lst)
     return static_cast<int>(lst.size());
 }
 
-int Context::getCurrentScope(std::list<std::wstring>& lst, bool sorted)
+int Context::getCurrentScope(std::list<std::pair<std::wstring, int>>& lst, bool bSorted)
 {
-    return variables.getCurrentScope(lst, m_iLevel, sorted);
+    return variables.getCurrentScope(lst, m_iLevel, bSorted);
 }
 
 void Context::updateProtection(bool protect)
index a87fea2..33aa191 100644 (file)
@@ -18,6 +18,7 @@
 #include "configvariable.hxx"
 #include "macro.hxx"
 #include "macrofile.hxx"
+#include "types_tools.hxx"
 
 extern "C"
 {
@@ -301,45 +302,54 @@ int Variables::getVarsName(std::list<std::wstring>& lst)
     return static_cast<int>(lst.size());
 }
 
-bool Variables::getVarsNameForWho(std::list<std::wstring>& lstVarName, int* iVarLenMax, bool bSorted) const
+bool Variables::getVarsInfoForWho(std::list<std::pair<std::wstring, int>>& lstVar, int* iVarLenMax, bool bSorted) const
 {
     for (auto it : vars)
     {
-        std::wstring wstrVarName(it.first.getName().c_str());
         if (it.second->empty() == false)
         {
             types::InternalType* pIT = it.second->top()->m_pIT;
             if (pIT && pIT->isFunction() == false)
             {
-                lstVarName.push_back(wstrVarName);
+                std::wstring wstrVarName(it.first.getName().c_str());
                 *iVarLenMax = std::max(*iVarLenMax, (int)wstrVarName.size());
+                int iSize, iSizePlusType;
+                if (pIT->getMemory(&iSize, &iSizePlusType))
+                {
+                    lstVar.emplace_back(wstrVarName, iSizePlusType);
+                }
             }
         }
     }
 
     if (bSorted)
     {
-        lstVarName.sort();
+        lstVar.sort();
     }
 
     return true;
 }
 
-bool Variables::getGlobalNameForWho(std::list<std::wstring>& lstVarName, int* iVarLenMax, bool bSorted) const
+bool Variables::getGlobalInfoForWho(std::list<std::pair<std::wstring, int>>& lstVar, int* iVarLenMax, bool bSorted) const
 {
     for (auto it : vars)
     {
         if (it.second->isGlobal())
         {
             std::wstring wstrVarName(it.first.getName().c_str());
-            lstVarName.push_back(wstrVarName);
             *iVarLenMax = std::max(*iVarLenMax, (int)wstrVarName.size());
+            int iSize, iSizePlusType;
+            types::InternalType* pIT = it.second->empty() ? it.second->getGlobalValue() : it.second->top()->m_pIT;
+            if (pIT->getMemory(&iSize, &iSizePlusType))
+            {
+                lstVar.emplace_back(wstrVarName, iSizePlusType);
+            }
         }
     }
 
     if (bSorted)
     {
-        lstVarName.sort();
+        lstVar.sort();
     }
 
     return true;
@@ -443,7 +453,7 @@ int Variables::getVarsToVariableBrowser(std::list<Variable*>& lst)
     return static_cast<int>(lst.size());
 }
 
-int Variables::getCurrentScope(std::list<std::wstring>& lst, int level, bool sorted)
+int Variables::getCurrentScope(std::list<std::pair<std::wstring, int>>& lst, int level, bool sorted)
 {
     for (auto var : vars)
     {
@@ -451,8 +461,14 @@ int Variables::getCurrentScope(std::list<std::wstring>& lst, int level, bool sor
         {
             if (var.second->top()->m_iLevel == level)
             {
+                std::wstring wstrVarName(var.first.getName());
+                int iSize, iSizePlusType;
+
                 types::InternalType* pIT = var.second->top()->m_pIT;
-                lst.push_back(var.first.getName());
+                if (pIT->getMemory(&iSize, &iSizePlusType))
+                {
+                    lst.emplace_back(wstrVarName, iSizePlusType);
+                }
             }
         }
     }
index b7b5d10..ee296d5 100644 (file)
@@ -53,6 +53,14 @@ GenericType* ArrayOf<T>::createEmpty()
 }
 
 template <typename T>
+bool ArrayOf<T>::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = getSize() * sizeof(T) * (isComplex() ? 2 : 1);
+    *_piSizePlusType = *_piSize + sizeof(*this);
+    return true;
+}
+
+template <typename T>
 void ArrayOf<T>::getIndexes(int _iIndex, int* _piIndexes)
 {
     getIndexesWithDims(_iIndex, _piIndexes, m_piDims, m_iDims);
index 1ee2d04..6c3317c 100644 (file)
@@ -27,6 +27,7 @@
 #include "core_math.h"
 #include "list.hxx"
 #include "configvariable.hxx"
+#include "types_tools.hxx"
 
 namespace types
 {
@@ -50,6 +51,24 @@ Cell::Cell(int _iDims, const int* _piDims, InternalType** data)
     createCell(_iDims, _piDims, data);
 }
 
+bool Cell::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = 0;
+    *_piSizePlusType = 0;
+    InternalType** p = get();
+    for (int i = 0; i < getSize(); i++)
+    {
+        int piS, piSPT;
+        if (p[i]->getMemory(&piS, &piSPT))
+        {
+            *_piSize += piS;
+            *_piSizePlusType += piSPT;
+        }
+    }
+    *_piSizePlusType += sizeof(Cell);
+    return true;
+}
+
 void Cell::createCell(int _iDims, const int* _piDims, InternalType** data)
 {
     InternalType** pIT = NULL;
index 538c145..4ffce30 100644 (file)
@@ -206,4 +206,10 @@ bool GraphicHandle::transpose(InternalType *& out)
     return type_traits::transpose(*this, out);
 }
 
+bool GraphicHandle::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = sizeof(long long)*getSize();
+    *_piSizePlusType = *_piSize + sizeof(GraphicHandle);
+    return true;
+}
 }
index 02707ad..b15bf3a 100644 (file)
@@ -720,6 +720,13 @@ bool ImplicitList::isTrue()
     return false;
 }
 
+bool ImplicitList::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = sizeof(ImplicitList);
+    *_piSizePlusType = *_piSize;
+    return true;
+}
+
 }
 
 std::wstring printInLinePoly(types::SinglePoly* _pPoly, std::wstring _stVar)
index 1e929b7..b129a28 100644 (file)
@@ -133,4 +133,16 @@ std::wstring Library::getPath()
 {
     return m_wstPath;
 }
+
+bool Library::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = 0;
+    for (auto macro : m_macros)
+    {
+        *_piSize += macro.first.length()*sizeof(wchar_t) + sizeof(macro);
+    }
+
+    *_piSizePlusType = *_piSize + sizeof(Library);
+    return true;
+}
 }
index 3cc55de..1e2ae0a 100644 (file)
@@ -86,6 +86,24 @@ std::vector<InternalType *> *List::getData()
     return m_plData;
 }
 
+bool List::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = 0;
+    *_piSizePlusType = 0;
+    for (auto pData : *m_plData)
+    {
+        int piS, piSPT;
+        if (pData->getMemory(&piS, &piSPT))
+        {
+            *_piSize += piS;
+            *_piSizePlusType += piSPT;
+        }
+    }
+
+    *_piSizePlusType += sizeof(List);
+    return true;
+}
+
 /**
 ** size_get
 ** Return the number of elements in list
index 5e15652..bf81b6b 100644 (file)
@@ -456,6 +456,17 @@ int Macro::getNbOutputArgument(void)
     return (int)m_outputArgs->size();
 }
 
+bool Macro::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    ast::SerializeVisitor serialMacro(m_body);
+    unsigned char* macroSerial = serialMacro.serialize(false, false);
+    unsigned int macroSize = *((unsigned int*)macroSerial);
+
+    *_piSize = macroSize;
+    *_piSizePlusType = *_piSize + sizeof(Macro);
+    return true;
+}
+
 bool Macro::operator==(const InternalType& it)
 {
     if (const_cast<InternalType &>(it).isMacro() == false)
index 53d9a14..37fd32d 100644 (file)
@@ -208,6 +208,11 @@ void MacroFile::setLines(int _iFirstLine, int _iLastLine)
     getMacro()->setLines(_iFirstLine, _iLastLine);
 }
 
+bool MacroFile::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    return this->getMacro()->getMemory(_piSize, _piSizePlusType);
+}
+
 bool MacroFile::operator==(const InternalType& it)
 {
     if (const_cast<InternalType &>(it).isMacro() == false && const_cast<InternalType &>(it).isMacroFile() == false)
index 0cb50be..9c53cd4 100644 (file)
@@ -19,6 +19,7 @@
 #include "overload.hxx"
 #include "configvariable.hxx"
 #include "exp.hxx"
+#include "types_tools.hxx"
 
 #ifndef NDEBUG
 #include "inspector.hxx"
 
 namespace types
 {
+bool MList::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = 0;
+    *_piSizePlusType = 0;
+    for (auto pData : *m_plData)
+    {
+        int piS, piSPT;
+        if (pData->getMemory(&piS, &piSPT))
+        {
+            *_piSize += piS;
+            *_piSizePlusType += piSPT;
+        }
+    }
+
+    *_piSizePlusType += sizeof(MList);
+    return true;
+}
+
 bool MList::invoke(typed_list & in, optional_list & /*opt*/, int _iRetCount, typed_list & out, const ast::Exp & e)
 {
     if (in.size() == 0)
index 1c6c05a..380f02e 100644 (file)
@@ -63,6 +63,20 @@ Polynom::~Polynom()
 #endif
 }
 
+bool Polynom::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = 0;
+    for (int i = 0; i<getSize(); i++)
+    {
+        *_piSize += (get(i)->getRank()+1)*sizeof(double);
+    }
+    
+    *_piSize = *_piSize * (isComplex() ? 2 : 1);
+    *_piSizePlusType = *_piSize + getSize()*sizeof(SinglePoly *) + sizeof(*this);
+    return true;
+}
+
+
 void Polynom::createPoly(const std::wstring& _szVarName, int _iDims, const int* _piDims, const int *_piRank)
 {
     m_szVarName = _szVarName;
index 5665123..80ea671 100644 (file)
@@ -20,6 +20,7 @@
 #include "double.hxx"
 #include "localization.hxx"
 #include "scilabWrite.hxx"
+#include "types_tools.hxx"
 
 namespace types
 {
@@ -61,6 +62,24 @@ std::vector<InternalType *> & SingleStruct::getData()
     return m_Data;
 }
 
+bool SingleStruct::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = 0;
+    *_piSizePlusType = 0;
+    for (auto pData : m_Data)
+    {
+        int piS, piSPT;
+        if (pData->getMemory(&piS, &piSPT))
+        {
+            *_piSize += piS;
+            *_piSizePlusType += piSPT;
+        }
+    }
+
+    *_piSizePlusType += sizeof(SingleStruct);
+    return true;
+}
+
 std::unordered_map<std::wstring, int> & SingleStruct::getFields()
 {
     return m_wstFields;
index f5eba7d..997bfab 100644 (file)
@@ -519,6 +519,14 @@ Sparse::Sparse(int rows, int cols, int nonzeros, int* inner, int* outer, double*
     //finalize();
 }
 
+
+bool Sparse::getMemory(int *_piSize, int* _piSizePlusType)
+{
+    *_piSize = nonZeros()*sizeof(double)*(isComplex() ? 2 : 1);
+    *_piSizePlusType = *_piSize + sizeof(*this);
+    return true;
+}
+
 template<typename DestIter>
 void Sparse::create(int rows, int cols, Double SPARSE_CONST& src, DestIter o, std::size_t n)
 {
@@ -3221,6 +3229,13 @@ SparseBool::SparseBool(int rows, int cols, int trues, int* inner, int* outer)
     matrixBool->resizeNonZeros(trues);
 }
 
+bool SparseBool::getMemory(int *_piSize, int* _piSizePlusType)
+{
+    *_piSize = nbTrue()*sizeof(bool);
+    *_piSizePlusType = *_piSize + sizeof(*this);
+    return true;
+}
+
 void SparseBool::create2(int rows, int cols, Bool SPARSE_CONST& src, Double SPARSE_CONST& idx)
 {
     int nnz = src.getSize();
index de7555f..9e1097c 100644 (file)
@@ -102,6 +102,17 @@ String::String(int _iRows, int _iCols, wchar_t const* const* _pstData)
 #endif
 }
 
+bool String::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = getSize()*sizeof(wchar_t*);
+    for (int i = 0; i < getSize(); i++)
+    {
+        *_piSize += wcslen(get(i))*sizeof(wchar_t);
+    }
+    *_piSizePlusType = *_piSize + sizeof(*this);
+    return true;
+}
+
 String* String::clone()
 {
     String *pstClone = new String(getDims(), getDimsArray());
index 0ce7518..830f6c4 100644 (file)
@@ -106,6 +106,25 @@ Struct::Struct(Struct *_oStructCopyMe)
 #endif
 }
 
+bool Struct::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = 0;
+    *_piSizePlusType = 0;
+    SingleStruct** p = get();
+    for (int i = 0; i < getSize(); i++)
+    {
+        int piS, piSPT;
+        if (p[i]->getMemory(&piS, &piSPT))
+        {
+            *_piSize += piS;
+            *_piSizePlusType += piSPT;
+        }
+    }
+
+    *_piSizePlusType += sizeof(Struct);
+    return true;
+}
+
 Struct* Struct::clone()
 {
     return new Struct(this);
index 6677245..0b98744 100644 (file)
@@ -55,6 +55,24 @@ TList::~TList()
 #endif
 }
 
+bool TList::getMemory(int* _piSize, int* _piSizePlusType)
+{
+    *_piSize = 0;
+    *_piSizePlusType = 0;
+    for (auto pData : *m_plData)
+    {
+        int piS, piSPT;
+        if (pData->getMemory(&piS, &piSPT))
+        {
+            *_piSize += piS;
+            *_piSizePlusType += piSPT;
+        }
+    }
+
+    *_piSizePlusType += sizeof(TList);
+    return true;
+}
+
 /**
 ** Clone
 ** Create a new List and Copy all values.
index 4c97db4..da34162 100644 (file)
@@ -26,6 +26,7 @@ extern "C"
 #include "elem_common.h"
 #include "os_string.h"
 #include "more.h"
+#include "sciprint.h"
 }
 
 namespace types
@@ -143,7 +144,7 @@ bool getArgsDims(typed_list* _pArgsIn, std::vector<int>& dims)
                 return false;
             }
 
-            int size = pIL->getSize();
+            int size = (int)pIL->getSize();
             if (size <= 0)
             {
                 return false;
@@ -155,11 +156,11 @@ bool getArgsDims(typed_list* _pArgsIn, std::vector<int>& dims)
             if (step > 0)
             {
                 double real_end = start + step * (size - 1);
-                dims.push_back(real_end);
+                dims.push_back((int)real_end);
             }
             else if (step < 0)
             {
-                dims.push_back(start);
+                dims.push_back((int)start);
             }
             else
             {
@@ -289,7 +290,7 @@ bool getScalarImplicitIndex(GenericType* _pRef, typed_list* _pArgsIn, std::vecto
         double step = evalute(pIL->getStep(), sizeRef);
         double end = evalute(pIL->getEnd(), sizeRef);
 
-        if ((start < 1 && step > 0) || (end < 1 & step < 0))
+        if (start < 1 && step > 0 || end < 1 && step < 0)
         {
             wchar_t szError[bsiz];
             os_swprintf(szError, bsiz, _W("Invalid index.\n").c_str());
@@ -377,7 +378,7 @@ bool getImplicitIndex(GenericType* _pRef, typed_list* _pArgsIn, std::vector<int>
                 double step = evalute(pIL->getStep(), sizeRef);
                 double end = evalute(pIL->getEnd(), sizeRef);
 
-                int size = (end - start) / step + 1;
+                int size = (int)((end - start) / step + 1);
                 if (size <= 0)
                 {
                     //manage implicit that return []
@@ -387,7 +388,7 @@ bool getImplicitIndex(GenericType* _pRef, typed_list* _pArgsIn, std::vector<int>
 
                 std::vector<int> idx(size);
 
-                if ((start < 1 && step > 0) || (end < 1 & step < 0))
+                if (start < 1 && step > 0 || end < 1 && step < 0)
                 {
                     wchar_t szError[bsiz];
                     os_swprintf(szError, bsiz, _W("Invalid index.\n").c_str());
@@ -617,7 +618,7 @@ int checkIndexesArguments(InternalType* _pRef, typed_list* _pArgsIn, typed_list*
                 double step = getIndex(pIL->getStep());
                 double end = getIndex(pIL->getEnd());
 
-                pCurrentArg = ((start < 1 && step > 0) || (end < 1 & step < 0)) ? NULL : pIL->extractFullMatrix()->getAs<Double>();
+                pCurrentArg = (start < 1 && step > 0 || end < 1 && step < 0) ? NULL : pIL->extractFullMatrix()->getAs<Double>();
             }
 
             pIL->killMe();
index 02b8889..f6a1616 100644 (file)
@@ -45,7 +45,7 @@
             <varlistentry>
                 <term>mem</term>
                 <listitem>
-                    <para>Double matrix with variable sizes in doubles.</para>
+                    <para>Double matrix with variable used memory in bytes.</para>
                 </listitem>
             </varlistentry>
         </variablelist>
@@ -85,7 +85,7 @@ foo(1,2);
             <revision>
                 <revnumber>6.0.1</revnumber>
                 <revdescription>
-                    Ajout de l'option scope/current.
+                    Add "scope" or "current" mode.
                 </revdescription>
             </revision>
         </revhistory>
index 098cdf8..9b4bfa5 100644 (file)
@@ -45,7 +45,7 @@
             <varlistentry>
                 <term>mem</term>
                 <listitem>
-                    <para>Matrice réelle avec l'occupation mémoire des variables en nombre de doubles.</para>
+                    <para>Matrice réelle avec l'occupation mémoire des variables en octets.</para>
                 </listitem>
             </varlistentry>
         </variablelist>
@@ -85,7 +85,7 @@ foo(1,2);
             <revision>
                 <revnumber>6.0.1</revnumber>
                 <revdescription>
-                    Add scope/current option.
+                    Ajout de l'option scope/current.
                 </revdescription>
             </revision>
         </revhistory>
index 50c7b58..4195e08 100644 (file)
         </para>
         <para>
             <code>who('local')</code> または <code>who('get')</code> は,
-            カレントの変数名と倍精度ワード単位の使用メモリを返します.
+            現在の変数の名前と使用されているメモリをバイト単位で返します.
         </para>
         <para>
-            <code>who('global')</code> は,グローバル変数の名前と
-            倍精度ワード単位の使用メモリを返します.
+            <code>who('global')</code> は,
+            グローバル変数の名前と使用されるメモリをバイト単位で返します.
         </para>
         <para>
             <code>who('sorted')</code> は,
index 1a1d375..b14b731 100644 (file)
         </para>
         <para>
             <literal>who('local')</literal> ou <literal>who('get')</literal>
-            retorna os nomes de variáveis correntes e a memória utilizada em palavras
-            de dupla precisão.
+            retorna os nomes das variáveis atuais e a memória usada em bytes.
         </para>
         <para>
-            <literal>who('global')</literal> retorna os nomes de variáveis
-            globais e a memória utilizada em palavras de dupla precisão.
+            <literal>who('global')</literal>retorna os nomes de variáveis globais
+             e a memória utilizada em bytes.
         </para>
         <para>
             <literal>who('sorted')</literal> exibe todas as variáveis em ordem
index d5b939c..c83765b 100644 (file)
             <code>who()</code> выводит на экран имена текущих переменных.
         </para>
         <para>
-            <code>who('local')</code> или <code>who('get')</code> возвращает имена
-            текущих переменных и величину используемой памяти в количестве слов удвоенной точности.
+            <code>who('local')</code> или <code>who('get')</code> возвращает имена текущих
+            переменных и объем памяти, используемый в количестве байтов.
         </para>
         <para>
-            <code>who('global')</code> возвращает имена глобальных переменных и величину
-            используемой памяти в количестве слов удвоенной точности.
+            <code>who('global')</code> возвращает имена глобальных переменных и объем памяти,
+             используемый в количестве байтов.
         </para>
         <para>
             <code>who('sorted')</code> выводит на экран все переменные в алфавитном
index 3244f77..c2a182d 100644 (file)
@@ -21,8 +21,7 @@ function whos(%_opt,%_sel)
     // Gathering locals + globals
     %_nams_all = [%_nams ; %_nams_global];
     %_vol_all  = [%_vol ; %_vol_global];
-    %_LG_all   = [emptystr(size(%_vol,1),1)+"L" ; ..
-    emptystr(size(%_vol_global,1),1)+"G"];
+    %_LG_all   = [asciimat(76*ones(%_vol(:))) ; asciimat(71*ones(%_vol_global(:)))];
 
     // Sorting the whole set w/o.r.t. the case
     [trash, k] = gsort(convstr(%_nams_all,"l"),"g","i");
@@ -34,16 +33,16 @@ function whos(%_opt,%_sel)
     // getSizeAsString, writeWhosLine, doDisplayWhosLine defined only in whos
     // to remove some tmp variables defined on stack
     //=============================================================================
-    function sz = getSizeAsString(_varname, _type)
+    function sz = getSizeAsString(_varname, _type, _typn)
         sz = " ";
         if _type == 0 then
             sz = "?";
-        elseif _type <= 10 then
+        elseif _type <= 10 | _type == 15 | _typn== 'st' | _typn== 'ce' then
             execstr("sz = size(" + _varname + ");")
         elseif _type == 17 | _type == 16 then
             execstr("%_tt = getfield(1," + _varname + ")");
             %_tt = %_tt(1);
-            if execstr("sz = %" + %_tt + "size(" + _varname + ")", "errcatch") <> 0 then
+            if execstr("sz = %" + %_tt + "_size(" + _varname + ")", "errcatch") <> 0 then
                 sz = "?";
             end
         end
@@ -124,11 +123,11 @@ function whos(%_opt,%_sel)
         b_ok = doDisplayWhosLine(%_rhs, %_opt, %_nams_all(%_k), %_typn, %_sel);
 
         if b_ok then
-            %_sz = getSizeAsString(%_nams_all(%_k), %_typ);
+            %_sz = getSizeAsString(%_nams_all(%_k), %_typ, %_typn);
             if %_LG_all(%_k) == "G"
                 %_typn = %_typn + "*";
             end
-            writeWhosLine(%_nams_all(%_k), %_typn, %_sz, %_vol_all(%_k)*8);
+            writeWhosLine(%_nams_all(%_k), %_typn, %_sz, %_vol_all(%_k));
         end
         if  %_LG_all(%_k) == "G" then
             execstr("clear " + %_nams_all(%_k));
index 6967a5d..7a87029 100644 (file)
@@ -33,7 +33,7 @@ types::Function::ReturnValue sci_checkNamedArguments(types::typed_list &in, int
 {
     int size = 0;
     symbol::Context* ctx = symbol::Context::getInstance();
-    int rhs = static_cast<int>(in.size());             
+    int rhs = static_cast<int>(in.size());
     std::vector<std::wstring> proto;
 
     if (ctx->getScopeLevel() < 2)
@@ -73,20 +73,20 @@ types::Function::ReturnValue sci_checkNamedArguments(types::typed_list &in, int
         size = (int)proto.size();
     }
 
-    std::list<std::wstring> lst;
+    std::list<std::pair<std::wstring, int>> lst;
     int count = ctx->getCurrentScope(lst, true);
 
-       //remove nargin/nargout//varargin
-       lst.remove(L"nargin");
-       lst.remove(L"nargout");
-       lst.remove(L"varargin");
+    // remove nargin/nargout//varargin
+    lst.remove_if([](const auto & p) -> bool { return p.first == L"nargin"; });
+    lst.remove_if([](const auto & p) -> bool { return p.first == L"nargout"; });
+    lst.remove_if([](const auto & p) -> bool { return p.first == L"varargin"; });
 
-       for (int i = 0; i < size; ++i)
+    for (int i = 0; i < size; ++i)
     {
-               lst.remove(proto[i]);
+        lst.remove_if([&](const auto & p) -> bool { return p.first == proto[i]; });
     }
 
-       count = (int)lst.size();
+    count = (int)lst.size();
     if (count == 0)
     {
         out.push_back(types::Double::Empty());
@@ -97,7 +97,7 @@ types::Function::ReturnValue sci_checkNamedArguments(types::typed_list &in, int
     int i = 0;
     for (auto v : lst)
     {
-        pOut->set(i++, v.data());
+        pOut->set(i++, v.first.data());
     }
 
     out.push_back(pOut);
index 13412fd..653301a 100644 (file)
@@ -26,15 +26,14 @@ extern "C"
 {
 #include "Scierror.h"
 #include "localization.h"
+#include "sciprint.h"
 }
 
 types::Function::ReturnValue sci_who(types::typed_list& in, int _iRetCount, types::typed_list& out)
 {
     std::wstring wcsWhat(L"");
     bool bSorted = false;
-    types::String* pStrOut = NULL;
-    types::Double* pDblOut = NULL;
-    std::list<std::wstring> lstVar;
+    std::list<std::pair<std::wstring, int>> lstVarWithSize;
     int size = 0;
 
     if (in.size() > 2)
@@ -106,15 +105,15 @@ types::Function::ReturnValue sci_who(types::typed_list& in, int _iRetCount, type
 
     if (wcsWhat == L"local" || wcsWhat == L"get")
     {
-        size = symbol::Context::getInstance()->getVarsNameForWho(lstVar, bSorted);
+        size = symbol::Context::getInstance()->getVarsInfoForWho(lstVarWithSize, bSorted);
     }
     else if (wcsWhat == L"scope" || wcsWhat == L"current")
     {
-        size = symbol::Context::getInstance()->getCurrentScope(lstVar, bSorted);
+        size = symbol::Context::getInstance()->getCurrentScope(lstVarWithSize, bSorted);
     }
     else if (wcsWhat == L"global")
     {
-        size = symbol::Context::getInstance()->getGlobalNameForWho(lstVar, bSorted);
+        size = symbol::Context::getInstance()->getGlobalInfoForWho(lstVarWithSize, bSorted);
     }
     else if (bSorted == false && wcsWhat == L"sorted")
     {
@@ -139,7 +138,7 @@ types::Function::ReturnValue sci_who(types::typed_list& in, int _iRetCount, type
         return types::Function::Error;
     }
 
-    if (lstVar.empty())
+    if (lstVarWithSize.empty())
     {
         out.push_back(types::Double::Empty());
         if (_iRetCount == 2)
@@ -150,19 +149,22 @@ types::Function::ReturnValue sci_who(types::typed_list& in, int _iRetCount, type
         return types::Function::OK;
     }
 
-    pStrOut = new types::String(size, 1);
+    types::String* pStrOut = new types::String(size, 1);
     int i = 0;
-    for (auto it : lstVar)
+    for (auto it : lstVarWithSize)
     {
-        pStrOut->set(i++, it.c_str());
+        pStrOut->set(i++, it.first.c_str());
     }
-
     out.push_back(pStrOut);
 
     if (_iRetCount == 2)
     {
-        pDblOut = new types::Double(pStrOut->getDims(), pStrOut->getDimsArray());
-        memset(pDblOut->get(), 0x00, pDblOut->getSize() * sizeof(double));
+        types::Double* pDblOut = new types::Double(size, 1);
+        i = 0;
+        for (auto it : lstVarWithSize)
+        {
+            pDblOut->set(i++, it.second);
+        }
         out.push_back(pDblOut);
     }
 
diff --git a/scilab/modules/core/tests/nonreg_tests/bug_14606.linux.dia.ref b/scilab/modules/core/tests/nonreg_tests/bug_14606.linux.dia.ref
new file mode 100644 (file)
index 0000000..1227535
--- /dev/null
@@ -0,0 +1,91 @@
+// =============================================================================
+// 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.
+// =============================================================================
+//
+// <-- TEST WITH GRAPHIC -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 14606 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14606
+//
+// <-- Short Description -->
+// "who" doesn"t return memory size
+bug_14606_double = ones(10,10);
+bug_14606_uint8 = uint8(ones(10,10));
+bug_14606_uint16 = uint16(ones(10,10));
+bug_14606_uint32 = uint32(ones(10,10));
+bug_14606_uint64 = uint64(ones(10,10));
+bug_14606_int8 = int8(ones(10,10));
+bug_14606_int16 = int16(ones(10,10));
+bug_14606_int32 = int32(ones(10,10));
+bug_14606_int64 = int64(ones(10,10));
+bug_14606_bool = eye(10,10)==1;
+bug_14606_poly = [%s 1+%s;1 1];
+bug_14606_rat = 1./[%s 1+%s;1 1];
+bug_14606_list = list(bug_14606_double, bug_14606_uint64, bug_14606_poly);
+deff("out=%tlist_14606_size(x)","out=%nan");
+deff("out=%mlist_14606_size(x)","out=%nan");
+bug_14606_tlist = tlist(["tlist_14606","field1","field2"], 1:3, ["Scilab" "is" "not" "Basile"]);
+bug_14606_mlist = mlist(["mlist_14606","field1","field2"], 1:3, ["Scilab" "is" "not" "Basile"]);
+bug_14606_syslin=syslin('c',[0,1;0,0],[1;1],[1,1]);
+bug_14606_sparse= sparse([1 1;2 2;3 3],1:3,[3 3]);
+bug_14606_sparseboolean= sparse([1 1;2 2;3 3],1:3,[3 3]) > 1;
+bug_14606_struct=struct("list1",list("testlist",1,2), "matrix1", [1 2 3; 4 5 6], "boolean1", %t);
+bug_14606_struct=struct("list1",list("testlist",1,2), "matrix1", [1 2 3; 4 5 6], "boolean1", %t);
+bug_14606_cell={bug_14606_struct, bug_14606_sparseboolean, bug_14606_poly};
+bug_14606_handle=[sdf(),sda()];
+bug_14606_pointer=lufact(bug_14606_sparse);
+deff("out=bug_14606_macro(x,y)","out=x+y");
+libdir=TMPDIR+"/bug_14606";
+mkdir(libdir);
+mputl(["function out=bug_14606_macro_file(x,y)","out=x+y","endfunction"],libdir+"/bug_14606_macro_file.sci");
+genlib("bug_14606_lib",libdir,%f,%t);
+-- Creation of [bug_14606_lib] (Macros) --
+genlib: Processing file: bug_14606_macro_file.sci
+clear bug_14606_lib
+bug_14606_lib=lib(libdir); // output variable is compulsory otherwise Scilab crashes after next line
+bug_14606_macro_file(1,1);
+whos -name bug_14606
+Name                     Type           Size           Bytes        
+bug_14606_bool           boolean        10x10          608          
+bug_14606_cell           ce             1x3            2414         
+bug_14606_double         constant       10x10          1008         
+bug_14606_handle         handle         1x2            224          
+bug_14606_int16          int16          10x10          408          
+bug_14606_int32          int32          10x10          608          
+bug_14606_int64          int64          10x10          1008         
+bug_14606_int8           int8           10x10          308          
+bug_14606_lib            library                       400          
+bug_14606_list           list           3              2536         
+bug_14606_macro          function                      490          
+bug_14606_macro_file     function                      490          
+bug_14606_mlist          mlist_14606    Nan            1064         
+bug_14606_pointer        pointer                       192          
+bug_14606_poly           polynomial     2x2            320          
+bug_14606_rat            rational       2x2            1308         
+bug_14606_sparse         sparse         3x3            232          
+bug_14606_sparseboolean  boolean sparse 3x3            202          
+bug_14606_struct         st             1x1            1684         
+bug_14606_syslin         state-space    1x1            1856         
+bug_14606_tlist          tlist_14606    Nan            1064         
+bug_14606_uint16         uint16         10x10          408          
+bug_14606_uint32         uint32         10x10          608          
+bug_14606_uint64         uint64         10x10          1008         
+bug_14606_uint8          uint8          10x10          308          
+ludel(bug_14606_pointer)
+bug_14606_var=zeros(10,10);
+global bug_14606_var
+whos -name bug_14606_var
+Name                     Type           Size           Bytes        
+bug_14606_var            constant*      10x10          1008         
+clear bug_14606_var
+whos -name bug_14606_var
+Name                     Type           Size           Bytes        
diff --git a/scilab/modules/core/tests/nonreg_tests/bug_14606.macosx.dia.ref b/scilab/modules/core/tests/nonreg_tests/bug_14606.macosx.dia.ref
new file mode 100644 (file)
index 0000000..19a10c7
--- /dev/null
@@ -0,0 +1,93 @@
+// =============================================================================
+// 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.
+// =============================================================================
+//
+// <-- TEST WITH GRAPHIC -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 14606 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14606
+//
+// <-- Short Description -->
+// "who" doesn"t return memory size
+bug_14606_double = ones(10,10);
+bug_14606_uint8 = uint8(ones(10,10));
+bug_14606_uint16 = uint16(ones(10,10));
+bug_14606_uint32 = uint32(ones(10,10));
+bug_14606_uint64 = uint64(ones(10,10));
+bug_14606_int8 = int8(ones(10,10));
+bug_14606_int16 = int16(ones(10,10));
+bug_14606_int32 = int32(ones(10,10));
+bug_14606_int64 = int64(ones(10,10));
+bug_14606_bool = eye(10,10)==1;
+bug_14606_poly = [%s 1+%s;1 1];
+bug_14606_rat = 1./[%s 1+%s;1 1];
+bug_14606_list = list(bug_14606_double, bug_14606_uint64, bug_14606_poly);
+deff("out=%tlist_14606_size(x)","out=%nan");
+deff("out=%mlist_14606_size(x)","out=%nan");
+bug_14606_tlist = tlist(["tlist_14606","field1","field2"], 1:3, ["Scilab" "is" "not" "Basile"]);
+bug_14606_mlist = mlist(["mlist_14606","field1","field2"], 1:3, ["Scilab" "is" "not" "Basile"]);
+bug_14606_syslin=syslin('c',[0,1;0,0],[1;1],[1,1]);
+bug_14606_sparse= sparse([1 1;2 2;3 3],1:3,[3 3]);
+bug_14606_sparseboolean= sparse([1 1;2 2;3 3],1:3,[3 3]) > 1;
+bug_14606_struct=struct("list1",list("testlist",1,2), "matrix1", [1 2 3; 4 5 6], "boolean1", %t);
+bug_14606_struct=struct("list1",list("testlist",1,2), "matrix1", [1 2 3; 4 5 6], "boolean1", %t);
+bug_14606_cell={bug_14606_struct, bug_14606_sparseboolean, bug_14606_poly};
+bug_14606_handle=[sdf(),sda()];
+bug_14606_pointer=lufact(bug_14606_sparse);
+deff("out=bug_14606_macro(x,y)","out=x+y");
+libdir=TMPDIR+"/bug_14606";
+mkdir(libdir);
+mputl(["function out=bug_14606_macro_file(x,y)","out=x+y","endfunction"],libdir+"/bug_14606_macro_file.sci");
+genlib("bug_14606_lib",libdir,%f,%t);
+-- Creation of [bug_14606_lib] (Macros) --
+genlib: Processing file: bug_14606_macro_file.sci
+clear bug_14606_lib
+bug_14606_lib=lib(libdir); // output variable is compulsory otherwise Scilab crashes after next line
+bug_14606_macro_file(1,1);
+whos -name bug_14606
+Name                     Type           Size           Bytes        
+bug_14606_bool           boolean        10x10          0            
+bug_14606_cell           ce             1x3            0            
+bug_14606_double         constant       10x10          0            
+bug_14606_handle         handle         1x2            0            
+bug_14606_int16          int16          10x10          0            
+bug_14606_int32          int32          10x10          0            
+bug_14606_int64          int64          10x10          0            
+bug_14606_int8           int8           10x10          0            
+bug_14606_lib            library                       0            
+bug_14606_list           list           3              0            
+bug_14606_macro          function                      0            
+bug_14606_macro_file     function                      0            
+bug_14606_mlist          mlist_14606    Nan            0            
+bug_14606_pointer        pointer                       0            
+bug_14606_poly           polynomial     2x2            0            
+bug_14606_rat            rational       2x2            0            
+bug_14606_sparse         sparse         3x3            0            
+bug_14606_sparseboolean  boolean sparse 3x3            0            
+bug_14606_struct         st             1x1            0            
+bug_14606_syslin         state-space    1x1            0            
+bug_14606_tlist          tlist_14606    Nan            0            
+bug_14606_uint16         uint16         10x10          0            
+bug_14606_uint32         uint32         10x10          0            
+bug_14606_uint64         uint64         10x10          0            
+bug_14606_uint8          uint8          10x10          0            
+ludel(bug_14606_pointer)
+bug_14606_var=zeros(10,10);
+global bug_14606_var
+whos -name bug_14606_var
+Name                     Type           Size           Bytes        
+bug_14606_var            constant       10x10          0            
+bug_14606_var            constant*      10x10          0            
+clear bug_14606_var
+whos -name bug_14606_var
+Name                     Type           Size           Bytes        
+bug_14606_var            constant*      10x10          0            
diff --git a/scilab/modules/core/tests/nonreg_tests/bug_14606.tst b/scilab/modules/core/tests/nonreg_tests/bug_14606.tst
new file mode 100644 (file)
index 0000000..76b2bce
--- /dev/null
@@ -0,0 +1,59 @@
+// =============================================================================
+// 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.
+// =============================================================================
+//
+// <-- TEST WITH GRAPHIC -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 14606 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14606
+//
+// <-- Short Description -->
+// "who" doesn"t return memory size
+
+bug_14606_double = ones(10,10);
+bug_14606_uint8 = uint8(ones(10,10));
+bug_14606_uint16 = uint16(ones(10,10));
+bug_14606_uint32 = uint32(ones(10,10));
+bug_14606_uint64 = uint64(ones(10,10));
+bug_14606_int8 = int8(ones(10,10));
+bug_14606_int16 = int16(ones(10,10));
+bug_14606_int32 = int32(ones(10,10));
+bug_14606_int64 = int64(ones(10,10));
+bug_14606_bool = eye(10,10)==1;
+bug_14606_poly = [%s 1+%s;1 1];
+bug_14606_rat = 1./[%s 1+%s;1 1];
+bug_14606_list = list(bug_14606_double, bug_14606_uint64, bug_14606_poly);
+deff("out=%tlist_14606_size(x)","out=%nan");
+deff("out=%mlist_14606_size(x)","out=%nan");
+bug_14606_tlist = tlist(["tlist_14606","field1","field2"], 1:3, ["Scilab" "is" "not" "Basile"]);
+bug_14606_mlist = mlist(["mlist_14606","field1","field2"], 1:3, ["Scilab" "is" "not" "Basile"]);
+bug_14606_syslin=syslin('c',[0,1;0,0],[1;1],[1,1]); 
+bug_14606_sparse= sparse([1 1;2 2;3 3],1:3,[3 3]);
+bug_14606_sparseboolean= sparse([1 1;2 2;3 3],1:3,[3 3]) > 1;
+bug_14606_struct=struct("list1",list("testlist",1,2), "matrix1", [1 2 3; 4 5 6], "boolean1", %t);
+bug_14606_struct=struct("list1",list("testlist",1,2), "matrix1", [1 2 3; 4 5 6], "boolean1", %t);
+bug_14606_cell={bug_14606_struct, bug_14606_sparseboolean, bug_14606_poly};
+bug_14606_handle=[sdf(),sda()];
+bug_14606_pointer=lufact(bug_14606_sparse);
+deff("out=bug_14606_macro(x,y)","out=x+y");
+libdir=TMPDIR+"/bug_14606";
+mkdir(libdir);
+mputl(["function out=bug_14606_macro_file(x,y)","out=x+y","endfunction"],libdir+"/bug_14606_macro_file.sci");
+genlib("bug_14606_lib",libdir,%f,%t);
+clear bug_14606_lib
+bug_14606_lib=lib(libdir); // output variable is compulsory otherwise Scilab crashes after next line
+bug_14606_macro_file(1,1);
+whos -name bug_14606
+ludel(bug_14606_pointer)
+bug_14606_var=zeros(10,10);
+global bug_14606_var
+whos -name bug_14606_var
+clear bug_14606_var
+whos -name bug_14606_var
+
diff --git a/scilab/modules/core/tests/nonreg_tests/bug_14606.win.dia.ref b/scilab/modules/core/tests/nonreg_tests/bug_14606.win.dia.ref
new file mode 100644 (file)
index 0000000..b01b7cc
--- /dev/null
@@ -0,0 +1,93 @@
+// =============================================================================
+// 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.
+// =============================================================================
+//
+// <-- TEST WITH GRAPHIC -->
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 14606 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14606
+//
+// <-- Short Description -->
+// "who" doesn"t return memory size
+bug_14606_double = ones(10,10);
+bug_14606_uint8 = uint8(ones(10,10));
+bug_14606_uint16 = uint16(ones(10,10));
+bug_14606_uint32 = uint32(ones(10,10));
+bug_14606_uint64 = uint64(ones(10,10));
+bug_14606_int8 = int8(ones(10,10));
+bug_14606_int16 = int16(ones(10,10));
+bug_14606_int32 = int32(ones(10,10));
+bug_14606_int64 = int64(ones(10,10));
+bug_14606_bool = eye(10,10)==1;
+bug_14606_poly = [%s 1+%s;1 1];
+bug_14606_rat = 1./[%s 1+%s;1 1];
+bug_14606_list = list(bug_14606_double, bug_14606_uint64, bug_14606_poly);
+deff("out=%tlist_14606_size(x)","out=%nan");
+deff("out=%mlist_14606_size(x)","out=%nan");
+bug_14606_tlist = tlist(["tlist_14606","field1","field2"], 1:3, ["Scilab" "is" "not" "Basile"]);
+bug_14606_mlist = mlist(["mlist_14606","field1","field2"], 1:3, ["Scilab" "is" "not" "Basile"]);
+bug_14606_syslin=syslin('c',[0,1;0,0],[1;1],[1,1]);
+bug_14606_sparse= sparse([1 1;2 2;3 3],1:3,[3 3]);
+bug_14606_sparseboolean= sparse([1 1;2 2;3 3],1:3,[3 3]) > 1;
+bug_14606_struct=struct("list1",list("testlist",1,2), "matrix1", [1 2 3; 4 5 6], "boolean1", %t);
+bug_14606_struct=struct("list1",list("testlist",1,2), "matrix1", [1 2 3; 4 5 6], "boolean1", %t);
+bug_14606_cell={bug_14606_struct, bug_14606_sparseboolean, bug_14606_poly};
+bug_14606_handle=[sdf(),sda()];
+bug_14606_pointer=lufact(bug_14606_sparse);
+deff("out=bug_14606_macro(x,y)","out=x+y");
+libdir=TMPDIR+"/bug_14606";
+mkdir(libdir);
+mputl(["function out=bug_14606_macro_file(x,y)","out=x+y","endfunction"],libdir+"/bug_14606_macro_file.sci");
+genlib("bug_14606_lib",libdir,%f,%t);
+-- Creation of [bug_14606_lib] (Macros) --
+genlib: Processing file: bug_14606_macro_file.sci
+clear bug_14606_lib
+bug_14606_lib=lib(libdir); // output variable is compulsory otherwise Scilab crashes after next line
+bug_14606_macro_file(1,1);
+whos -name bug_14606
+Name                     Type           Size           Bytes        
+bug_14606_bool           boolean        10x10          608          
+bug_14606_cell           ce             1x3            2406         
+bug_14606_double         constant       10x10          1008         
+bug_14606_handle         handle         1x2            224          
+bug_14606_int16          int16          10x10          408          
+bug_14606_int32          int32          10x10          608          
+bug_14606_int64          int64          10x10          1008         
+bug_14606_int8           int8           10x10          308          
+bug_14606_lib            library                       368          
+bug_14606_list           list           3              2536         
+bug_14606_macro          function                      458          
+bug_14606_macro_file     function                      458          
+bug_14606_mlist          mlist_14606    Nan            984          
+bug_14606_pointer        pointer                       192          
+bug_14606_poly           polynomial     2x2            320          
+bug_14606_rat            rational       2x2            1290         
+bug_14606_sparse         sparse         3x3            232          
+bug_14606_sparseboolean  boolean sparse 3x3            202          
+bug_14606_struct         st             1x1            1676         
+bug_14606_syslin         state-space    1x1            1832         
+bug_14606_tlist          tlist_14606    Nan            984          
+bug_14606_uint16         uint16         10x10          408          
+bug_14606_uint32         uint32         10x10          608          
+bug_14606_uint64         uint64         10x10          1008         
+bug_14606_uint8          uint8          10x10          308          
+ludel(bug_14606_pointer)
+bug_14606_var=zeros(10,10);
+global bug_14606_var
+whos -name bug_14606_var
+Name                     Type           Size           Bytes        
+bug_14606_var            constant       10x10          1008         
+bug_14606_var            constant*      10x10          1008         
+clear bug_14606_var
+whos -name bug_14606_var
+Name                     Type           Size           Bytes        
+bug_14606_var            constant*      10x10          1008         
index 3bc63cd..4f08892 100644 (file)
@@ -1799,12 +1799,12 @@ int mexPutVariable(const char *workspace, const char *varname, const mxArray *pm
 int mexIsGlobal(const mxArray *ptr)
 {
     symbol::Context *context = symbol::Context::getInstance();
-    std::list<std::wstring> lst;
-    int size = context->getGlobalNameForWho(lst, false);
+    std::list<std::pair<std::wstring,int>> lst;
+    int size = context->getGlobalInfoForWho(lst, false);
 
     for (auto it : lst)
     {
-        symbol::Symbol s = symbol::Symbol(it);
+        symbol::Symbol s = symbol::Symbol(it.first);
         types::InternalType* value = context->getGlobalValue(s);
         if ((int*)value == ptr->ptr)
         {