macro with opt input arg corrected. 13/14813/3
Cedric Delamarre [Mon, 7 Jul 2014 09:09:41 +0000 (11:09 +0200)]
function toto(varargin)
    disp(varargin)
    disp(a)
endfunction

// "a" must never be defined
toto()
toto(2, a=12)
toto(2, a=12, b=16)

function toto(varargin, u)
    disp(varargin)
    disp(a)
endfunction

toto()
toto(2, a=12)
// Wrong number of input arguments.
toto(2, a=12, b=16)

Change-Id: I06b7c6253ae9e14202d152fb44ef707e464586e8

scilab/modules/ast/src/cpp/types/macro.cpp

index dd2c625..c7357ed 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;