fix valgrind issues during ast serialization
[scilab.git] / scilab / modules / ast / src / cpp / types / macro.cpp
index dd2c625..f292b65 100644 (file)
@@ -113,12 +113,6 @@ Callable::ReturnValue Macro::call(typed_list &in, optional_list &opt, int _iRetC
     //store the line number where is stored this macro in file.
     ConfigVariable::macroFirstLine_begin(getFirstLine());
 
-    //add optional paramter in current scope
-    optional_list::const_iterator it;
-    for (it = opt.begin() ; it != opt.end() ; it++)
-    {
-        pContext->put(symbol::Symbol(it->first), it->second);
-    }
     //check excepted and input/output parameters numbers
     // Scilab Macro can be called with less than prototyped arguments,
     // but not more execpts with varargin
@@ -144,13 +138,23 @@ Callable::ReturnValue Macro::call(typed_list &in, optional_list &opt, int _iRetC
         }
 
         //create varargin only if previous variable are assigned
+        optional_list::const_iterator it = opt.begin();
         if (in.size() >= m_inputArgs->size() - 1)
         {
             //create and fill varargin
             List* pL = new List();
             while (itValue != in.end())
             {
-                pL->append(*itValue);
+                if (*itValue != NULL)
+                {
+                    pL->append(*itValue);
+                }
+                else
+                {
+                    pL->append(it->second);
+                    it++;
+                }
+
                 itValue++;
             }
             pContext->put(m_Varargin, pL);
@@ -173,6 +177,13 @@ Callable::ReturnValue Macro::call(typed_list &in, optional_list &opt, int _iRetC
     }
     else
     {
+        //add optional paramter in current scope
+        optional_list::const_iterator it;
+        for (it = opt.begin() ; it != opt.end() ; it++)
+        {
+            pContext->put(symbol::Symbol(it->first), it->second);
+        }
+
         //assign value to variable in the new context
         std::list<symbol::Variable*>::iterator i;
         typed_list::const_iterator j;
@@ -390,6 +401,11 @@ bool Macro::operator==(const InternalType& it)
 
     //check outputs
     pOutput = pRight->outputs_get();
+    if (pOutput->size() != m_outputArgs->size())
+    {
+        return false;
+    }
+
     itOld = pOutput->begin();
     itEndOld = pOutput->end();
     itMacro = m_outputArgs->begin();
@@ -409,8 +425,8 @@ bool Macro::operator==(const InternalType& it)
     unsigned char* macroSerial = serialMacro.serialize(false);
 
     //check buffer length
-    unsigned int oldSize = ((unsigned int*)oldSerial)[0] + sizeof(unsigned int);
-    unsigned int macroSize = ((unsigned int*)macroSerial)[0] + sizeof(unsigned int);
+    unsigned int oldSize = *((unsigned int*)oldSerial);
+    unsigned int macroSize = *((unsigned int*)macroSerial);
     if (oldSize != macroSize)
     {
         free(oldSerial);
@@ -418,7 +434,7 @@ bool Macro::operator==(const InternalType& it)
         return false;
     }
 
-    bool ret = (memcmp(oldSerial, macroSerial, oldSize + sizeof(unsigned int)) == 0);
+    bool ret = (memcmp(oldSerial, macroSerial, oldSize) == 0);
 
     free(oldSerial);
     free(macroSerial);