call stack error fixed about negativ line. 28/16828/2
Cedric Delamarre [Thu, 9 Jul 2015 11:45:35 +0000 (13:45 +0200)]
remove file : modules/scicos/macros/scicos_scicos/%diagram_load.sci
then make macros,
then execute in scilab :

loadXcosLibs();
a = scicos_diagram();
save TMPDIR/diagram.sod a;
clear a;
load TMPDIR/diagram.sod

Change-Id: I3f839e2cc76aef63b929b407341a5c0c1915e022

scilab/modules/ast/src/cpp/system_env/configvariable.cpp
scilab/modules/ast/src/cpp/types/overload.cpp

index 44e3303..c9875b7 100644 (file)
@@ -1262,8 +1262,13 @@ void ConfigVariable::fillWhereError(int _iErrorLine)
 {
     if (m_WhereError.empty())
     {
-        // +1 because the first line of the funtionDec "function func()" is the line 1.
-        int iTmp = _iErrorLine - getMacroFirstLines() + 1;
+        int iTmp = 0;
+        if (_iErrorLine != 0)
+        {
+            // +1 because the first line of the funtionDec "function func()" is the line 1.
+            iTmp = _iErrorLine - getMacroFirstLines() + 1;
+        }
+
         m_WhereError.reserve(m_Where.size());
         for (auto where = m_Where.rbegin(); where != m_Where.rend(); ++where)
         {
index cb4136e..f35e441 100644 (file)
@@ -76,37 +76,35 @@ types::Function::ReturnValue Overload::generateNameAndCall(std::wstring _stFunct
 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)
+    types::Callable *pCall = NULL;
+    try
     {
-        char pstError1[512];
-        char pstError2[512];
-        char *pstFuncName = wide_string_to_UTF8(_stOverloadingFunctionName.c_str());
-        wchar_t* pwstError = NULL;
-        if (_isOperator)
-        {
-            os_sprintf(pstError2, _("check or define function %s for overloading.\n"), pstFuncName);
-            os_sprintf(pstError1, "%s%s", _("Undefined operation for the given operands.\n"), pstError2);
-            pwstError = to_wide_string(pstError1);
-            std::wstring wstError(pwstError);
-            FREE(pwstError);
-            FREE(pstFuncName);
-            throw ast::ScilabError(wstError, 999, Location(1, 1, 1, 1));
-        }
-        else
+        if (pIT == NULL || pIT->isCallable() == false)
         {
-            os_sprintf(pstError2, _("  check arguments or define function %s for overloading.\n"), pstFuncName);
-            os_sprintf(pstError1, "%s%s", _("Function not defined for given argument type(s),\n"), pstError2);
+            char pstError1[512];
+            char pstError2[512];
+            char *pstFuncName = wide_string_to_UTF8(_stOverloadingFunctionName.c_str());
+            wchar_t* pwstError = NULL;
+            if (_isOperator)
+            {
+                os_sprintf(pstError2, _("check or define function %s for overloading.\n"), pstFuncName);
+                os_sprintf(pstError1, "%s%s", _("Undefined operation for the given operands.\n"), pstError2);
+            }
+            else
+            {
+                os_sprintf(pstError2, _("  check arguments or define function %s for overloading.\n"), pstFuncName);
+                os_sprintf(pstError1, "%s%s", _("Function not defined for given argument type(s),\n"), pstError2);
+            }
+
             pwstError = to_wide_string(pstError1);
             std::wstring wstError(pwstError);
             FREE(pwstError);
             FREE(pstFuncName);
-            throw ast::ScilabError(wstError, 999, Location(1, 1, 1, 1));
+            throw ast::ScilabError(wstError, 999, Location(0, 0, 0, 0));
         }
-    }
-    types::Callable *pCall = pIT->getAs<types::Callable>();
-    try
-    {
+
+        pCall = pIT->getAs<types::Callable>();
+
         types::optional_list opt;
 
         // add line and function name in where
@@ -125,13 +123,32 @@ types::Function::ReturnValue Overload::call(std::wstring _stOverloadingFunctionN
         ConfigVariable::where_end();
         throw sm;
     }
+    catch (ast::ScilabError se)
+    {
+        ConfigVariable::fillWhereError(se.GetErrorLocation().first_line);
+        if (ConfigVariable::getLastErrorNumber() == 0)
+        {
+            ConfigVariable::setLastErrorMessage(se.GetErrorMessage());
+            ConfigVariable::setLastErrorNumber(se.GetErrorNumber());
+            ConfigVariable::setLastErrorLine(se.GetErrorLocation().first_line);
+            ConfigVariable::setLastErrorFunction(std::wstring(L""));
+        }
+
+        if (pCall)
+        {
+            // remove function name in where
+            ConfigVariable::where_end();
+        }
+
+        throw ast::ScilabMessage(se.GetErrorMessage(), se.GetErrorNumber(), se.GetErrorLocation());
+    }
 }
 
 std::wstring Overload::getNameFromOper(ast::OpExp::Oper _oper)
 {
     switch (_oper)
     {
-        /* standard operators */
+            /* standard operators */
         case ast::OpExp::plus :
             return std::wstring(L"a");
         case ast::OpExp::unaryMinus :
@@ -145,7 +162,7 @@ std::wstring Overload::getNameFromOper(ast::OpExp::Oper _oper)
             return std::wstring(L"l");
         case ast::OpExp::power :
             return std::wstring(L"p");
-        /* dot operators */
+            /* dot operators */
         case ast::OpExp::dottimes :
             return std::wstring(L"x");
         case ast::OpExp::dotrdivide :
@@ -154,14 +171,14 @@ std::wstring Overload::getNameFromOper(ast::OpExp::Oper _oper)
             return std::wstring(L"q");
         case ast::OpExp::dotpower :
             return std::wstring(L"j");
-        /* Kron operators */
+            /* Kron operators */
         case ast::OpExp::krontimes :
             return std::wstring(L"k");
         case ast::OpExp::kronrdivide :
             return std::wstring(L"y");
         case ast::OpExp::kronldivide :
             return std::wstring(L"z");
-        /* Control Operators ??? */
+            /* Control Operators ??? */
         case ast::OpExp::controltimes :
             return std::wstring(L"u");
         case ast::OpExp::controlrdivide :