management of error in overloading corrected. 94/11494/4
Cedric Delamarre [Tue, 14 May 2013 13:59:53 +0000 (15:59 +0200)]
'e' + 2 // overload about operator
cos('e') // overload about function
iconvert('e', 0) // overload about function

Change-Id: Ic2d1a626fad16ecd28446316f814498666905b3f

scilab/modules/api_scilab/includes/overload.hxx
scilab/modules/api_scilab/src/cpp/overload.cpp
scilab/modules/ast/includes/run_OpExp.hxx

index cc8b6fb..c29f85e 100644 (file)
@@ -30,17 +30,17 @@ public:
      ** depending on input parameters
      ** and maybe on number of result expected <further implementation>
      */
-    static std::wstring buildOverloadName(std::wstring _stFunctionName, types::typed_list &in, int _iRetCount);
+    static std::wstring buildOverloadName(std::wstring _stFunctionName, types::typed_list &in, int _iRetCount, bool _isOperator = false);
 
     /**
      */
     static types::Function::ReturnValue generateNameAndCall(std::wstring _stFunctionName, types::typed_list &in, int _iRetCount,
-        types::typed_list &out, ast::ConstVisitor *_execMe);
+            types::typed_list &out, ast::ConstVisitor *_execMe, bool _isOperator = false);
 
     /**
      */
     static types::Function::ReturnValue call(std::wstring _stFunctionName, types::typed_list &in, int _iRetCount,
-        types::typed_list &out, ast::ConstVisitor *_execMe);
+            types::typed_list &out, ast::ConstVisitor *_execMe, bool _isOperator = false);
 
     static std::wstring getNameFromOper(ast::OpExp::Oper);
 
index bf5dfc8..3b59d61 100644 (file)
@@ -22,42 +22,44 @@ extern "C"
 #include "context.hxx"
 #include "scilabexception.hxx"
 
-std::wstring Overload::buildOverloadName(std::wstring _stFunctionName, types::typed_list &in, int _iRetCount)
+std::wstring Overload::buildOverloadName(std::wstring _stFunctionName, types::typed_list &in, int _iRetCount, bool _isOperator)
 {
     switch (in.size())
     {
         case 0 :
             return L"%_" + _stFunctionName;
+        case 2:
+            if (_isOperator)
+            {
+                return L"%" + in[0]->getShortTypeStr() + L"_" + _stFunctionName + L"_" + in[1]->getShortTypeStr();
+            }
         case 1:
             return L"%" + in[0]->getShortTypeStr() + L"_" + _stFunctionName;
-        case 2:
-            return L"%" + in[0]->getShortTypeStr() + L"_" + _stFunctionName + L"_" + in[1]->getShortTypeStr();
         default :
             throw ast::ScilabError(L"Don't know how to overload " + _stFunctionName, 246, *new Location());
     }
     return _stFunctionName;
 }
 
-types::Function::ReturnValue Overload::generateNameAndCall(std::wstring _stFunctionName, types::typed_list &in, int _iRetCount, types::typed_list &out, ast::ConstVisitor *_execMe)
+types::Function::ReturnValue Overload::generateNameAndCall(std::wstring _stFunctionName, types::typed_list &in, int _iRetCount, types::typed_list &out, ast::ConstVisitor *_execMe, bool _isOperator)
 {
-    return call(buildOverloadName(_stFunctionName, in, _iRetCount), in, _iRetCount, out, _execMe);
+    return call(buildOverloadName(_stFunctionName, in, _iRetCount, _isOperator), in, _iRetCount, out, _execMe, _isOperator);
 }
 
-types::Function::ReturnValue Overload::call(std::wstring _stOverloadingFunctionName, types::typed_list &in, int _iRetCount, types::typed_list &out, ast::ConstVisitor *_execMe)
+types::Function::ReturnValue Overload::call(std::wstring _stOverloadingFunctionName, types::typed_list &in, int _iRetCount, types::typed_list &out, ast::ConstVisitor *_execMe, bool _isOperator)
 {
     types::InternalType *pIT = symbol::Context::getInstance()->get(symbol::Symbol(_stOverloadingFunctionName));
 
     if (pIT == NULL || pIT->isCallable() == false)
     {
-        if (in.size() < 2)
+        if (_isOperator)
         {
-            throw ast::ScilabError(_W("Function not defined for given argument type(s),\n  check arguments or define function ") + _stOverloadingFunctionName + _W(" for overloading.\n"), 246, *new Location());
+            throw ast::ScilabError(_W("Undefined operation for the given operands.\ncheck or define function ") + _stOverloadingFunctionName + _W(" for overloading.\n"), 144, *new Location());
         }
         else
         {
-            throw ast::ScilabError(_W("Undefined operation for the given operands.\ncheck or define function ") + _stOverloadingFunctionName + _W(" for overloading.\n"), 144, *new Location());
+            throw ast::ScilabError(_W("Function not defined for given argument type(s),\n  check arguments or define function ") + _stOverloadingFunctionName + _W(" for overloading.\n"), 246, *new Location());
         }
-
     }
     types::Callable *pCall = pIT->getAs<types::Callable>();
     try
index 792b723..9f87896 100644 (file)
@@ -338,7 +338,7 @@ types::InternalType* callOverload(OpExp::Oper _oper, types::InternalType* _param
     {
         _paramR->IncreaseRef();
         in.push_back(_paramR);
-        Overload::generateNameAndCall(Overload::getNameFromOper(_oper), in, 1, out, this);
+        Overload::generateNameAndCall(Overload::getNameFromOper(_oper), in, 1, out, this, true);
 
         _paramR->DecreaseRef();
         return out[0];
@@ -348,7 +348,7 @@ types::InternalType* callOverload(OpExp::Oper _oper, types::InternalType* _param
     in.push_back(_paramL);
     in.push_back(_paramR);
 
-    Overload::generateNameAndCall(Overload::getNameFromOper(_oper), in, 1, out, this);
+    Overload::generateNameAndCall(Overload::getNameFromOper(_oper), in, 1, out, this, true);
 
     _paramL->DecreaseRef();
     _paramR->DecreaseRef();