fix mem leak in insert of empty indexes 01/15401/7
Antoine ELIAS [Mon, 20 Oct 2014 08:52:51 +0000 (10:52 +0200)]
a = [1 2;3 4]
a(a == a) = []

a.b(2).name = "NAME"

st.a = "toto";
s.a = [];
s.a(1) = st;

clear st;
st.a(2).b = 10;
st.a(5).b = 10;

Change-Id: Iff6d9ec7c640d0d078241b46cfd4e8bd76ef0b1f

16 files changed:
scilab/modules/ast/includes/types/arrayof.hxx
scilab/modules/ast/includes/types/polynom.hxx
scilab/modules/ast/includes/types/singlestruct.hxx
scilab/modules/ast/includes/types/struct.hxx
scilab/modules/ast/includes/types/types_tools.hxx
scilab/modules/ast/src/cpp/ast/run_AssignExp.cpp
scilab/modules/ast/src/cpp/ast/visitor_common.cpp
scilab/modules/ast/src/cpp/types/implicitlist.cpp
scilab/modules/ast/src/cpp/types/list.cpp
scilab/modules/ast/src/cpp/types/polynom.cpp
scilab/modules/ast/src/cpp/types/singlepoly.cpp
scilab/modules/ast/src/cpp/types/singlestruct.cpp
scilab/modules/ast/src/cpp/types/sparse.cpp
scilab/modules/ast/src/cpp/types/struct.cpp
scilab/modules/ast/src/cpp/types/types_tools.cpp
scilab/modules/fileio/sci_gateway/cpp/sci_getshortpathname.cpp

index ab6af10..f0cd95d 100644 (file)
@@ -384,6 +384,8 @@ public :
         int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
         if (iSeqCount == 0)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return this;
         }
 
@@ -462,6 +464,8 @@ public :
                     {
                         if (pIdx[j] >= m_piDims[i])
                         {
+                            //free pArg content
+                            cleanIndexesArguments(_pArgs, &pArg);
                             return NULL;
                         }
                     }
@@ -477,6 +481,8 @@ public :
                 {
                     if (pIdx[i] > iMaxLastDim)
                     {
+                        //free pArg content
+                        cleanIndexesArguments(_pArgs, &pArg);
                         return NULL;
                     }
                 }
@@ -488,6 +494,8 @@ public :
         {
             if (pSource->getSize() != iSeqCount)
             {
+                //free pArg content
+                cleanIndexesArguments(_pArgs, &pArg);
                 return NULL;
             }
         }
@@ -497,6 +505,8 @@ public :
             bool bPass = resize(piNewDims, iNewDims);
             if (bPass == false)
             {
+                //free pArg content
+                cleanIndexesArguments(_pArgs, &pArg);
                 return NULL;
             }
         }
@@ -584,13 +594,7 @@ public :
         delete[] piViewDims;
 
         //free pArg content
-        for (int iArg = 0 ; iArg < pArg.size() ; iArg++)
-        {
-            if (pArg[iArg] != (*_pArgs)[iArg])
-            {
-                pArg[iArg]->killMe();
-            }
-        }
+        cleanIndexesArguments(_pArgs, &pArg);
 
         return this;
     }
@@ -611,6 +615,8 @@ public :
         int iSeqCount = checkIndexesArguments(NULL, _pArgs, &pArg, piMaxDim, piCountDim);
         if (iSeqCount == 0)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return createEmptyDouble();
         }
 
@@ -675,6 +681,8 @@ public :
 
         if (checkArgValidity(pArg) == false)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             //contain bad index, like <= 0, ...
             return NULL;
         }
@@ -726,13 +734,7 @@ public :
         }
 
         //free pArg content
-        for (int iArg = 0 ; iArg < pArg.size() ; iArg++)
-        {
-            if (pArg[iArg] != (*_pArgs)[iArg])
-            {
-                pArg[iArg]->killMe();
-            }
-        }
+        cleanIndexesArguments(_pArgs, &pArg);
 
         return pOut2;
     }
@@ -797,6 +799,8 @@ public :
         int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
         if (iSeqCount == 0)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             //no Seq, no change but no error.
             return this;
         }
@@ -853,6 +857,8 @@ public :
 
         if (bTooMuchNotEntire == true)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return NULL;
         }
 
@@ -920,6 +926,8 @@ public :
 
         if (iNewDimSize == 0)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             delete[] piNewDims;
             return createEmptyDouble();
         }
@@ -985,13 +993,7 @@ public :
         }
 
         //free pArg content
-        for (int iArg = 0 ; iArg < pArg.size() ; iArg++)
-        {
-            if (pArg[iArg] != (*_pArgs)[iArg])
-            {
-                pArg[iArg]->killMe();
-            }
-        }
+        cleanIndexesArguments(_pArgs, &pArg);
 
         delete[] piIndexes;
         delete[] piViewDims;
@@ -1052,6 +1054,8 @@ public :
         int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
         if (iSeqCount == 0)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return createEmptyDouble();
         }
 
@@ -1071,6 +1075,8 @@ public :
 
                 if (piMaxDim[i] > iDimToCheck)
                 {
+                    //free pArg content
+                    cleanIndexesArguments(_pArgs, &pArg);
                     return NULL;
                 }
             }
@@ -1083,6 +1089,8 @@ public :
                 {
                     if (piMaxDim[i] > 1)
                     {
+                        //free pArg content
+                        cleanIndexesArguments(_pArgs, &pArg);
                         return NULL;
                     }
                 }
@@ -1093,6 +1101,8 @@ public :
             {
                 if (piMaxDim[i] > m_piDims[i])
                 {
+                    //free pArg content
+                    cleanIndexesArguments(_pArgs, &pArg);
                     //exrtact must be in dimension limits
                     return NULL;
                 }
@@ -1117,7 +1127,8 @@ public :
         {
             if (piCountDim[0] == 0)
             {
-                //pOut = createEmptyDouble()->getAs<Double>();
+                //free pArg content
+                cleanIndexesArguments(_pArgs, &pArg);
                 return createEmptyDouble();
             }
             else
@@ -1182,6 +1193,8 @@ public :
                     delete[] piMaxDim;
                     delete[] piCountDim;
 
+                    //free pArg content
+                    cleanIndexesArguments(_pArgs, &pArg);
                     return NULL;
                 }
             }
@@ -1221,13 +1234,7 @@ public :
         }
 
         //free pArg content
-        for (size_t iArg = 0 ; iArg < pArg.size() ; ++iArg)
-        {
-            if (pArg[iArg] != (*_pArgs)[iArg])
-            {
-                pArg[iArg]->killMe();
-            }
-        }
+        cleanIndexesArguments(_pArgs, &pArg);
 
         delete[] piIndex;
         delete[] piCoord;
@@ -1275,6 +1282,10 @@ public :
         return resize(piDims, 2);
     }
 
+    virtual void deleteData(T data)
+    {
+    }
+
     bool resize(int* _piDims, int _iDims)
     {
         if (_iDims == m_iDims)
@@ -1380,12 +1391,6 @@ public :
                 m_iSizeMax = static_cast<int>(iNewSize * 1.1);
                 pRealData = allocData(m_iSizeMax);
 
-                //set value to (null) value
-                for (int i = 0 ; i < m_iSizeMax ; i++)
-                {
-                    pRealData[i] = copyValue(getNullValue());
-                }
-
                 //copy values into new one
                 int* piIndexes = new int[std::max(m_iDims, _iDims)];
                 memset(piIndexes, 0x00, sizeof(int) * std::max(m_iDims, _iDims));
@@ -1394,18 +1399,42 @@ public :
                     piIndexes[i] = 0;
                 }
 
+                int iPreviousNewIdx = 0;
                 for (int i = 0 ; i < m_iSize ; i++)
                 {
                     getIndexes(i, piIndexes);
                     int iNewIdx = getIndexWithDims(piIndexes, _piDims, _iDims);
-                    pRealData[iNewIdx] = copyValue(m_pRealData[i]);
+                    pRealData[iNewIdx] = m_pRealData[i];
+                    for (int j = iPreviousNewIdx; j < iNewIdx; ++j)
+                    {
+                        T pTemp = getNullValue();
+                        T pTemp2 = copyValue(pTemp);
+                        pRealData[j] = pTemp2;
+                        if (pTemp != pTemp2)
+                        {
+                            deleteData(pTemp);
+                        }
+                    }
+
+                    iPreviousNewIdx = iNewIdx + 1;
+                }
+
+                for (int i = iPreviousNewIdx; i < m_iSizeMax; ++i)
+                {
+                    T pTemp = getNullValue();
+                    T pTemp2 = copyValue(pTemp);
+                    pRealData[i] = pTemp2;
+                    if (pTemp != pTemp2)
+                    {
+                        deleteData(pTemp);
+                    }
                 }
 
                 delete[] piIndexes;
                 //delete all array
-                deleteAll();
+                delete[] m_pRealData;
                 //replace old array by new one
-                m_pRealData    = pRealData;
+                m_pRealData = pRealData;
             }
             else
             {
index e75adcc..5df3d9b 100644 (file)
@@ -130,7 +130,7 @@ private :
     virtual void            deleteAll();
     virtual void            deleteImg();
     virtual SinglePoly**    allocData(int _iSize);
-
+    virtual void            deleteData(SinglePoly* data);
 };
 }
 
index 84f6694..f1a79e1 100644 (file)
@@ -69,12 +69,12 @@ public :
     /* return type as string ( double, int, cell, list, ... )*/
     virtual std::wstring                    getTypeStr()
     {
-        return L"";
+        return L"singlestruct";
     }
     /* return type as short string ( s, i, ce, l, ... )*/
     virtual std::wstring                    getShortTypeStr()
     {
-        return L"";
+        return L"sst";
     }
 
 private :
index 3fd9af1..5a57048 100644 (file)
@@ -137,6 +137,7 @@ private :
     virtual void                deleteAll();
     virtual void                deleteImg();
     virtual SingleStruct**      allocData(int _iSize);
+    virtual void                deleteData(SingleStruct* data);
 
     bool                        m_bDisableCloneInCopyValue;
 
index 1621493..0cdd1c2 100644 (file)
@@ -18,6 +18,7 @@
 namespace types
 {
 EXTERN_AST int checkIndexesArguments(InternalType* _pRef, typed_list* _pArgsIn, typed_list* _pArgsOut, int* _piMaxDim, int* _piCountDim);
+EXTERN_AST void cleanIndexesArguments(typed_list* _pArgsOrig, typed_list* _pArgsNew);
 EXTERN_AST void getIndexesWithDims(int _iIndex, int* _piIndexes, int* _piDims, int _iDims);
 EXTERN_AST int getIndexWithDims(int* _piIndexes, int* _piDims, int _iDims);
 EXTERN_AST void VariableToString(types::InternalType* pIT, const wchar_t* wcsVarName);
index 87b9257..48c853b 100644 (file)
@@ -287,6 +287,7 @@ void RunVisitorT<T>::visitprivate(const AssignExp  &e)
             setExpectedSize(1);
             e.getRightExp().accept(*this);
             InternalType *pIT = getResult();
+            setResult(NULL);
             if (pIT->isImplicitList())
             {
                 if (pIT->getAs<ImplicitList>()->isComputable())
index 6d35344..8cf877a 100644 (file)
@@ -855,7 +855,7 @@ types::InternalType* evaluateFields(const ast::Exp* _pExp, std::list<ExpHistory*
                     workFields.push_back(pEHChield);
                 }
 
-                delete pLOut;
+                pLOut->killMe();
             }
         }
         else if (pITCurrent->isTList() || pITCurrent->isMList())
@@ -1310,6 +1310,10 @@ types::InternalType* evaluateFields(const ast::Exp* _pExp, std::list<ExpHistory*
                 {
                     pStruct->get(pEH->getWhereReinsert())->set(pEH->getExpAsString(), _pAssignValue);
                 }
+
+                // insert _pAssignValue in parent, delete PEh and removes it from list<ExpHistory*>
+                delete pEH;
+                evalFields.pop_back();
             }
             else if (pParent->isTList() || pParent->isMList())
             {
@@ -1336,6 +1340,11 @@ types::InternalType* evaluateFields(const ast::Exp* _pExp, std::list<ExpHistory*
                 {
                     pTL->set(pEH->getExpAsString(), _pAssignValue);
                 }
+
+                // set _pAssignValue in parent, so kill the current if needed
+                // insert _pAssignValue in parent, delete PEh and removes it from list<ExpHistory*>
+                delete pEH;
+                evalFields.pop_back();
             }
             else
             {
@@ -1429,6 +1438,11 @@ types::InternalType* evaluateFields(const ast::Exp* _pExp, std::list<ExpHistory*
             }
         }
 
+        if (pEH->getCurrent())
+        {
+            pEH->getCurrent()->killMe();
+        }
+
         evalFields.pop_back();
         delete pEH;
     }
@@ -1455,6 +1469,7 @@ InternalType* insertionCall(const ast::Exp& e, typed_list* _pArgs, InternalType*
         //_pInsert = new Double(-1, -1, &pdbl);
         //pdbl[0] = 1;
         pIL = Double::Identity(-1, -1);
+        _pInsert->killMe();
         _pInsert = pIL;
     }
     else if (_pInsert->isImplicitList())
@@ -1462,6 +1477,7 @@ InternalType* insertionCall(const ast::Exp& e, typed_list* _pArgs, InternalType*
         pIL = _pInsert->getAs<ImplicitList>()->extractFullMatrix();
         if (pIL && pIL->isDeletable())
         {
+            _pInsert->killMe();
             _pInsert = pIL;
         }
     }
@@ -1676,7 +1692,7 @@ InternalType* insertionCall(const ast::Exp& e, typed_list* _pArgs, InternalType*
                     // overload
                     types::Double* pEmpty = types::Double::Empty();
                     pOut = callOverload(e, L"i", _pArgs, _pInsert, pEmpty);
-                    delete pEmpty;
+                    pEmpty->killMe();
                     break;
                 }
             }
@@ -1798,7 +1814,7 @@ InternalType* insertionCall(const ast::Exp& e, typed_list* _pArgs, InternalType*
             }
 
             pRet = pDest->insert(_pArgs, pP);
-            delete pP;
+            pP->killMe();
         }
         else if (_pVar->isPoly() && _pInsert->isPoly())
         {
@@ -1902,14 +1918,20 @@ InternalType* insertionCall(const ast::Exp& e, typed_list* _pArgs, InternalType*
                                     // set elements in the new position
                                     pStructInsert->get(i)->set(pwcsField, pLExtract->get(i));
                                 }
+
+                                pLExtract->killMe();
                             }
                         }
+
+                        pStrFieldsName->killMe();
                     }
 
                     // insert elements in following pArgs
                     pRet = pStruct->insert(_pArgs, pStructInsert);
                     pStructRet = pRet->getAs<Struct>();
 
+                    pStructInsert->killMe();
+
                     // insert fields of pStructInsert in pRet
                     for (int i = 0; i < pStrInsertFieldsName->getSize(); i++)
                     {
@@ -1918,6 +1940,8 @@ InternalType* insertionCall(const ast::Exp& e, typed_list* _pArgs, InternalType*
                             pStructRet->addField(pStrInsertFieldsName->get(i));
                         }
                     }
+
+                    pStrInsertFieldsName->killMe();
                 }
                 else
                 {
index e5f3a2f..fa83a54 100644 (file)
@@ -625,6 +625,8 @@ InternalType* ImplicitList::extract(typed_list* _pArgs)
     int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return createEmptyDouble();
     }
 
@@ -679,13 +681,7 @@ InternalType* ImplicitList::extract(typed_list* _pArgs)
     }
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
 
     delete[] piMaxDim;
     delete[] piCountDim;
index 7242758..3dfb735 100644 (file)
@@ -162,10 +162,6 @@ InternalType* List::extract(typed_list* _pArgs)
 
     //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)
-    {
-        //outList.push_back(Double::Empty());
-    }
 
     for (int i = 0 ; i < iSeqCount ; i++)
     {
@@ -181,13 +177,7 @@ InternalType* List::extract(typed_list* _pArgs)
     }
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg])
-        {
-            pArg[iArg]->killMe();
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
 
     return outList;
 }
@@ -209,17 +199,23 @@ InternalType* List::insert(typed_list* _pArgs, InternalType* _pSource)
     int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         //do nothing
         return this;
     }
     else if (iSeqCount > 1)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         std::wostringstream os;
         os << _W("Unable to insert multiple item in a list.\n");
         throw ast::ScilabError(os.str());
     }
     else if (iSeqCount < 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return NULL;
     }
 
@@ -229,6 +225,8 @@ InternalType* List::insert(typed_list* _pArgs, InternalType* _pSource)
         //delete item
         if (idx == 0)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             //do nothing
             return this;
         }
@@ -247,6 +245,8 @@ InternalType* List::insert(typed_list* _pArgs, InternalType* _pSource)
         //insert item
         if (idx == 0)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             std::wostringstream os;
             os << _W("Index out of bounds.\n");
             throw ast::ScilabError(os.str());
@@ -301,13 +301,7 @@ InternalType* List::insert(typed_list* _pArgs, InternalType* _pSource)
     m_iSize = (int)m_plData->size();
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg])
-        {
-            pArg[iArg]->killMe();
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
 
     return this;
 }
index 99e620c..ab15552 100644 (file)
@@ -999,5 +999,13 @@ SinglePoly** Polynom::allocData(int _iSize)
     memset(pData, 0x00, _iSize * sizeof(SinglePoly*));
     return pData;
 }
+
+void Polynom::deleteData(SinglePoly* data)
+{
+    if (data)
+    {
+        data->killMe();
+    }
+}
 }
 
index fc18572..d8bc320 100644 (file)
@@ -34,23 +34,35 @@ SinglePoly::SinglePoly()
     int piDims[2] = {1, 1};
     create(piDims, 2, &pdblCoefR, NULL);
     pdblCoefR[0] = 0;
+#ifndef NDEBUG
+    Inspector::addItem(this);
+#endif
 }
 
 SinglePoly::SinglePoly(double** _pdblCoefR, int _iRank)
 {
     int piDims[2] = {_iRank + 1, 1};
     create(piDims, 2, _pdblCoefR, NULL);
+#ifndef NDEBUG
+    Inspector::addItem(this);
+#endif
 }
 
 SinglePoly::SinglePoly(double** _pdblCoefR, double** _pdblCoefI, int _iRank)
 {
     int piDims[2] = {_iRank + 1, 1};
     create(piDims, 2, _pdblCoefR, _pdblCoefI);
+#ifndef NDEBUG
+    Inspector::addItem(this);
+#endif
 }
 
 SinglePoly::~SinglePoly()
 {
     deleteAll();
+#ifndef NDEBUG
+    Inspector::removeItem(this);
+#endif
 }
 
 void SinglePoly::deleteAll()
index 542b2e2..5805d99 100644 (file)
@@ -23,6 +23,9 @@ namespace types
 {
 SingleStruct::SingleStruct()
 {
+#ifndef NDEBUG
+    Inspector::addItem(this);
+#endif
 }
 
 SingleStruct::~SingleStruct()
@@ -33,12 +36,12 @@ SingleStruct::~SingleStruct()
         for (iterFieldData = m_Data.begin(); iterFieldData != m_Data.end() ; iterFieldData++)
         {
             (*iterFieldData)->DecreaseRef();
-            if ((*iterFieldData)->isDeletable())
-            {
-                delete (*iterFieldData);
-            }
+            (*iterFieldData)->killMe();
         }
     }
+#ifndef NDEBUG
+    Inspector::removeItem(this);
+#endif
 }
 
 SingleStruct::SingleStruct(SingleStruct *_oSingleStructCopyMe)
@@ -54,6 +57,9 @@ SingleStruct::SingleStruct(SingleStruct *_oSingleStructCopyMe)
         m_Data.push_back(*iterFieldData);
         m_Data.back()->IncreaseRef();
     }
+#ifndef NDEBUG
+    Inspector::addItem(this);
+#endif
 }
 
 std::list<InternalType *> SingleStruct::getData()
@@ -98,10 +104,7 @@ bool SingleStruct::set(const std::wstring& _sKey, InternalType *_typedValue)
         if (pOld != NULL)
         {
             pOld->DecreaseRef();
-            if (pOld->isDeletable())
-            {
-                delete pOld;
-            }
+            pOld->killMe();
         }
 
         if (_typedValue)
@@ -214,11 +217,7 @@ bool SingleStruct::removeField(const std::wstring& _sKey)
         if (*iterFieldNames == _sKey)
         {
             (*iterFieldData)->DecreaseRef();
-            if ((*iterFieldData)->isDeletable())
-            {
-                delete (*iterFieldData);
-            }
-
+            (*iterFieldData)->killMe();
             continue;
         }
 
@@ -333,5 +332,4 @@ bool SingleStruct::operator!=(const InternalType& it)
 {
     return !(*this == it);
 }
-
 }
index 2b88472..8a6e838 100644 (file)
@@ -718,6 +718,8 @@ InternalType* Sparse::insertNew(typed_list* _pArgs, InternalType* _pSource)
     int iSeqCount = checkIndexesArguments(NULL, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return createEmptyDouble();
     }
 
@@ -776,6 +778,8 @@ InternalType* Sparse::insertNew(typed_list* _pArgs, InternalType* _pSource)
 
     if (checkArgValidity(pArg) == false)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         //contain bad index, like <= 0, ...
         return NULL;
     }
@@ -809,13 +813,7 @@ InternalType* Sparse::insertNew(typed_list* _pArgs, InternalType* _pSource)
     }
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
 
     return pOut2;
 }
@@ -844,6 +842,8 @@ Sparse* Sparse::insert(typed_list* _pArgs, InternalType* _pSource)
     int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return this;
     }
 
@@ -874,6 +874,8 @@ Sparse* Sparse::insert(typed_list* _pArgs, InternalType* _pSource)
         }
         else if (getSize() < piMaxDim[0])
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             //out of range
             return NULL;
         }
@@ -891,6 +893,8 @@ Sparse* Sparse::insert(typed_list* _pArgs, InternalType* _pSource)
     //check number of insertion
     if (pSource->isScalar() == false && pSource->getSize() != iSeqCount)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return NULL;
     }
 
@@ -899,6 +903,8 @@ Sparse* Sparse::insert(typed_list* _pArgs, InternalType* _pSource)
     {
         if (resize(iNewRows, iNewCols) == false)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return NULL;
         }
     }
@@ -980,13 +986,8 @@ Sparse* Sparse::insert(typed_list* _pArgs, InternalType* _pSource)
     finalize();
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
+
     return this;
 }
 
@@ -1013,6 +1014,8 @@ Sparse* Sparse::insert(typed_list* _pArgs, Sparse* _pSource)
     int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return this;
     }
 
@@ -1042,6 +1045,8 @@ Sparse* Sparse::insert(typed_list* _pArgs, Sparse* _pSource)
         }
         else if (getSize() < piMaxDim[0])
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             //out of range
             return NULL;
         }
@@ -1059,6 +1064,8 @@ Sparse* Sparse::insert(typed_list* _pArgs, Sparse* _pSource)
     //check number of insertion
     if (_pSource->isScalar() == false && _pSource->getSize() != iSeqCount)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return NULL;
     }
 
@@ -1067,6 +1074,8 @@ Sparse* Sparse::insert(typed_list* _pArgs, Sparse* _pSource)
     {
         if (resize(iNewRows, iNewCols) == false)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return NULL;
         }
     }
@@ -1149,13 +1158,7 @@ Sparse* Sparse::insert(typed_list* _pArgs, Sparse* _pSource)
     finalize();
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
 
     return this;
 }
@@ -1179,6 +1182,8 @@ Sparse* Sparse::remove(typed_list* _pArgs)
     int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return this;
     }
 
@@ -1234,6 +1239,8 @@ Sparse* Sparse::remove(typed_list* _pArgs)
 
     if (bTooMuchNotEntire == true)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return NULL;
     }
 
@@ -1380,13 +1387,7 @@ Sparse* Sparse::remove(typed_list* _pArgs)
     delete[] piViewDims;
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
 
     return pOut;
 }
@@ -1435,6 +1436,8 @@ InternalType* Sparse::extract(typed_list* _pArgs)
     int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         if (_pArgs->size() == 0)
         {
             //a()
@@ -1497,6 +1500,8 @@ InternalType* Sparse::extract(typed_list* _pArgs)
         }
         else
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return NULL;
         }
     }
@@ -1541,6 +1546,8 @@ InternalType* Sparse::extract(typed_list* _pArgs)
         }
         else
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return NULL;
         }
     }
@@ -1548,13 +1555,7 @@ InternalType* Sparse::extract(typed_list* _pArgs)
     finalize();
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
 
     return pOut;
 }
@@ -2271,6 +2272,8 @@ SparseBool* SparseBool::insert(typed_list* _pArgs, SparseBool* _pSource)
     int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return this;
     }
 
@@ -2301,6 +2304,8 @@ SparseBool* SparseBool::insert(typed_list* _pArgs, SparseBool* _pSource)
         }
         else if (getSize() < piMaxDim[0])
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             //out of range
             return NULL;
         }
@@ -2318,6 +2323,8 @@ SparseBool* SparseBool::insert(typed_list* _pArgs, SparseBool* _pSource)
     //check number of insertion
     if (_pSource->isScalar() == false && _pSource->getSize() != iSeqCount)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return NULL;
     }
 
@@ -2326,6 +2333,8 @@ SparseBool* SparseBool::insert(typed_list* _pArgs, SparseBool* _pSource)
     {
         if (resize(iNewRows, iNewCols) == false)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return NULL;
         }
     }
@@ -2374,13 +2383,7 @@ SparseBool* SparseBool::insert(typed_list* _pArgs, SparseBool* _pSource)
     finalize();
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
 
     return this;
 }
@@ -2409,6 +2412,8 @@ SparseBool* SparseBool::insert(typed_list* _pArgs, InternalType* _pSource)
     int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return this;
     }
 
@@ -2438,6 +2443,8 @@ SparseBool* SparseBool::insert(typed_list* _pArgs, InternalType* _pSource)
         }
         else if (getSize() < piMaxDim[0])
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             //out of range
             return NULL;
         }
@@ -2455,6 +2462,8 @@ SparseBool* SparseBool::insert(typed_list* _pArgs, InternalType* _pSource)
     //check number of insertion
     if (pSource->isScalar() == false && pSource->getSize() != iSeqCount)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return NULL;
     }
 
@@ -2463,6 +2472,8 @@ SparseBool* SparseBool::insert(typed_list* _pArgs, InternalType* _pSource)
     {
         if (resize(iNewRows, iNewCols) == false)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return NULL;
         }
     }
@@ -2509,14 +2520,7 @@ SparseBool* SparseBool::insert(typed_list* _pArgs, InternalType* _pSource)
     finalize();
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
-
+    cleanIndexesArguments(_pArgs, &pArg);
     return this;
 }
 
@@ -2539,6 +2543,8 @@ SparseBool* SparseBool::remove(typed_list* _pArgs)
     int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return this;
     }
 
@@ -2594,6 +2600,8 @@ SparseBool* SparseBool::remove(typed_list* _pArgs)
 
     if (bTooMuchNotEntire == true)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return NULL;
     }
 
@@ -2663,6 +2671,8 @@ SparseBool* SparseBool::remove(typed_list* _pArgs)
     {
         if (iNewDimSize == 0)
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return new SparseBool(0, 0);
         }
         else
@@ -2733,13 +2743,7 @@ SparseBool* SparseBool::remove(typed_list* _pArgs)
     delete[] piViewDims;
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
 
     return pOut;
 }
@@ -2766,6 +2770,8 @@ InternalType* SparseBool::insertNew(typed_list* _pArgs, InternalType* _pSource)
     int iSeqCount = checkIndexesArguments(NULL, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         return createEmptyDouble();
     }
 
@@ -2824,6 +2830,8 @@ InternalType* SparseBool::insertNew(typed_list* _pArgs, InternalType* _pSource)
 
     if (checkArgValidity(pArg) == false)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         //contain bad index, like <= 0, ...
         return NULL;
     }
@@ -2856,13 +2864,7 @@ InternalType* SparseBool::insertNew(typed_list* _pArgs, InternalType* _pSource)
     }
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
 
     return pOut2;
 }
@@ -2909,6 +2911,8 @@ InternalType* SparseBool::extract(typed_list* _pArgs)
     int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         if (_pArgs->size() == 0)
         {
             //a()
@@ -2962,6 +2966,8 @@ InternalType* SparseBool::extract(typed_list* _pArgs)
         }
         else
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return NULL;
         }
     }
@@ -2996,6 +3002,8 @@ InternalType* SparseBool::extract(typed_list* _pArgs)
         }
         else
         {
+            //free pArg content
+            cleanIndexesArguments(_pArgs, &pArg);
             return NULL;
         }
     }
@@ -3003,13 +3011,7 @@ InternalType* SparseBool::extract(typed_list* _pArgs)
     finalize();
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
+    cleanIndexesArguments(_pArgs, &pArg);
 
     return pOut;
 }
index 0b5a1c6..2c4a2d6 100644 (file)
@@ -41,7 +41,8 @@ Struct::Struct(int _iRows, int _iCols)
     {
         set(i, p);
     }
-    delete p;
+
+    p->killMe();
 #ifndef NDEBUG
     Inspector::addItem(this);
 #endif
@@ -51,13 +52,14 @@ Struct::Struct(int _iDims, int* _piDims)
 {
     m_bDisableCloneInCopyValue = false;
     SingleStruct** pIT  = NULL;
+    SingleStruct *p = new SingleStruct();
     create(_piDims, _iDims, &pIT, NULL);
     for (int i = 0 ; i < getSize() ; i++)
     {
-        SingleStruct *p = new SingleStruct();
         set(i, p);
-        delete p;
     }
+    p->killMe();
+
 #ifndef NDEBUG
     Inspector::addItem(this);
 #endif
@@ -73,15 +75,7 @@ Struct::~Struct()
             if (pStr)
             {
                 pStr->DecreaseRef();
-                if (pStr->isDeletable())
-                {
-                    //std::wcout << L"delete sub struct(" << i << L") : " << pStr << std::endl;
-                    delete pStr;
-                }
-                else
-                {
-                    //std::wcout << L"!!!!!!!!!!!!!!! pas touche sub struct(" << i << L") : " << pStr->getRef() << L" @" << pStr << std::endl;
-                }
+                pStr->killMe();
             }
         }
     }
@@ -233,15 +227,16 @@ bool Struct::set(int _iIndex, SingleStruct* _pIT)
         InternalType* pOld = m_pRealData[_iIndex];
 
         m_pRealData[_iIndex] = copyValue(_pIT);
-        m_pRealData[_iIndex]->IncreaseRef();
+        if (m_bDisableCloneInCopyValue == false)
+        {
+            //only in clone mode
+            m_pRealData[_iIndex]->IncreaseRef();
+        }
 
         if (pOld != NULL)
         {
             pOld->DecreaseRef();
-            if (pOld->isDeletable())
-            {
-                delete pOld;
-            }
+            pOld->killMe();
         }
 
         return true;
@@ -260,10 +255,7 @@ bool Struct::set(int _iIndex, const SingleStruct* _pIT)
         if (pOld != NULL)
         {
             pOld->DecreaseRef();
-            if (pOld->isDeletable())
-            {
-                delete pOld;
-            }
+            pOld->killMe();
         }
 
         return true;
@@ -357,7 +349,7 @@ SingleStruct* Struct::copyValue(SingleStruct* _pData)
     if (m_bDisableCloneInCopyValue)
     {
         pStr = _pData;
-        //pStr->IncreaseRef();
+        pStr->IncreaseRef();
         //std::wcout << L"copyValueWithoutClone -> " << pStr << L" : " << pStr->getRef() << std::endl;
     }
     else
@@ -373,10 +365,7 @@ void Struct::deleteAll()
     for (int i = 0 ; i < getSize() ; i++)
     {
         m_pRealData[i]->DecreaseRef();
-        if (m_pRealData[i]->isDeletable())
-        {
-            delete m_pRealData[i];
-        }
+        m_pRealData[i]->killMe();
     }
     delete[] m_pRealData;
     m_pRealData = NULL;
@@ -475,7 +464,7 @@ bool Struct::toString(std::wostringstream& ostr)
             ostr << pIT->toStringInLine();
             ostr << std::endl;
         }
-        delete pwstFields;
+        pwstFields->killMe();;
     }
     else
     {
@@ -496,7 +485,7 @@ bool Struct::toString(std::wostringstream& ostr)
         {
             ostr << L"    " << pwstFields->get(i) << std::endl;
         }
-        delete pwstFields;
+        pwstFields->killMe();
     }
 
     scilabWriteW(ostr.str().c_str());
@@ -570,6 +559,8 @@ std::vector<InternalType*> Struct::extractFields(typed_list* _pArgs)
     int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
     if (iSeqCount == 0)
     {
+        //free pArg content
+        cleanIndexesArguments(_pArgs, &pArg);
         ResultList.push_back(createEmptyDouble());
         return ResultList;
     }
@@ -595,7 +586,7 @@ std::vector<InternalType*> Struct::extractFields(typed_list* _pArgs)
                 pFields->set(2 + j, pS->get(j));
             }
 
-            delete pS;
+            pS->killMe();
             ResultList.push_back(pFields);
         }
         else if (iIndex == 2)
@@ -644,14 +635,7 @@ std::vector<InternalType*> Struct::extractFields(typed_list* _pArgs)
     }
 
     //free pArg content
-    for (int iArg = 0 ; iArg < (int)pArg.size() ; iArg++)
-    {
-        if (pArg[iArg] != (*_pArgs)[iArg] && pArg[iArg]->isDeletable())
-        {
-            delete pArg[iArg];
-        }
-    }
-
+    cleanIndexesArguments(_pArgs, &pArg);
     return ResultList;
 }
 
@@ -663,7 +647,9 @@ bool Struct::resize(int _iNewRows, int _iNewCols)
 
 bool Struct::resize(int* _piDims, int _iDims)
 {
+    m_bDisableCloneInCopyValue = true;
     bool bRes = ArrayOf<SingleStruct*>::resize(_piDims, _iDims);
+    m_bDisableCloneInCopyValue = false;
     if (bRes)
     {
         // insert field(s) only in new element(s) of current struct
@@ -675,6 +661,8 @@ bool Struct::resize(int* _piDims, int _iDims)
                 get(iterStruct)->addField(pFields->get(iterField));
             }
         }
+
+        pFields->killMe();
     }
 
     return bRes;
@@ -707,4 +695,11 @@ void Struct::setCloneInCopyValue(bool _val)
     m_bDisableCloneInCopyValue = !_val;
 }
 
+void Struct::deleteData(SingleStruct* data)
+{
+    if (data)
+    {
+        data->killMe();
+    }
+}
 }
index e7c0ce4..64c8a57 100644 (file)
@@ -67,24 +67,45 @@ int checkIndexesArguments(InternalType* _pRef, typed_list* _pArgsIn, typed_list*
                 }
                 //evalute polynom with "MaxDim"
                 int iMaxDim = _pRef->getAs<GenericType>()->getVarMaxDim(i, iDims);
+#if defined(_SCILAB_DEBUGREF_)
+                Double* pdbl = new Double(iMaxDim);
+#else
                 Double dbl(iMaxDim);
+#endif
                 if (pIL->getStart()->isPoly())
                 {
                     Polynom *poPoly    = pIL->getStart()->getAs<types::Polynom>();
+#if defined(_SCILAB_DEBUGREF_)
+                    pIL->setStart(poPoly->evaluate(pdbl));
+#else
                     pIL->setStart(poPoly->evaluate(&dbl));
+#endif
                 }
                 if (pIL->getStep()->isPoly())
                 {
                     Polynom *poPoly    = pIL->getStep()->getAs<types::Polynom>();
+#if defined(_SCILAB_DEBUGREF_)
+                    pIL->setStep(poPoly->evaluate(pdbl));
+#else
                     pIL->setStep(poPoly->evaluate(&dbl));
+#endif
                 }
                 if (pIL->getEnd()->isPoly())
                 {
                     Polynom *poPoly    = pIL->getEnd()->getAs<types::Polynom>();
+#if defined(_SCILAB_DEBUGREF_)
+                    pIL->setEnd(poPoly->evaluate(pdbl));
+#else
                     pIL->setEnd(poPoly->evaluate(&dbl));
+#endif
                 }
+
+#if defined(_SCILAB_DEBUGREF_)
+                pdbl->killMe();
+#endif
             }
 
+
             pCurrentArg = pIL->extractFullMatrix()->getAs<Double>();
             pIL->killMe();
         }
@@ -150,8 +171,15 @@ int checkIndexesArguments(InternalType* _pRef, typed_list* _pArgsIn, typed_list*
             {
                 iMaxDim     = _pRef->getAs<GenericType>()->getVarMaxDim(i, iDims);
             }
+
+#ifdef _SCILAB_DEBUGREF_
+            Double* pdbl = new Double(iMaxDim); // $
+            pCurrentArg = pMP->evaluate(pdbl);
+            pdbl->killMe();
+#else
             Double dbl(iMaxDim); // $
             pCurrentArg = pMP->evaluate(&dbl);
+#endif
         }
         else if (pIT->isBool())
         {
@@ -227,6 +255,20 @@ int checkIndexesArguments(InternalType* _pRef, typed_list* _pArgsIn, typed_list*
     return (!bUndefine ? iSeqCount : - iSeqCount);
 }
 
+void cleanIndexesArguments(typed_list* _pArgsOrig, typed_list* _pArgsNew)
+{
+    //free pArg content
+    for (int iArg = 0; iArg < _pArgsNew->size(); iArg++)
+    {
+        if ((*_pArgsNew)[iArg] != (*_pArgsOrig)[iArg])
+        {
+            (*_pArgsNew)[iArg]->killMe();
+        }
+    }
+
+    _pArgsNew->clear();
+}
+
 void getIndexesWithDims(int _iIndex, int* _piIndexes, int* _piDims, int _iDims)
 {
     int iMul = 1;
index eb98154..b0977c2 100644 (file)
@@ -66,7 +66,7 @@ Function::ReturnValue sci_getshortpathname(typed_list &in, int _iRetCount, typed
     }
     else
     {
-        delete pOut2;
+        pOut2->killMe();
     }
 
     return Function::OK;