debugger: error in try/catch and errcatch fixed 14/21714/1
Cedric Delamarre [Fri, 26 Mar 2021 12:57:41 +0000 (13:57 +0100)]
  * the debugger must not stop when there is an error
    with exec/execstr(..., errcatch) and in a try catch exp.

   execstr("cos(""e"")", "errcatch")
   try, 1+list(); catch, disp("error catched !"); end

Change-Id: I8c447a26bc0bd89e51562cf24e3c2c9e93eabff5

scilab/modules/ast/src/cpp/ast/debuggervisitor.cpp
scilab/modules/functions/sci_gateway/cpp/sci_exec.cpp
scilab/modules/functions/sci_gateway/cpp/sci_execstr.cpp

index ff1d6ec..762d9b6 100644 (file)
@@ -381,6 +381,13 @@ void DebuggerVisitor::visit(const SeqExp  &e)
         }
         catch (const InternalError& ie)
         {
+            // dont manage an error with the debugger
+            // in cases of try catch and errcatch
+            if(ConfigVariable::isSilentError())
+            {
+                throw ie;
+            }
+
             ConfigVariable::fillWhereError(ie.GetErrorLocation().first_line);
 
             const std::vector<ConfigVariable::WhereEntry>& lWhereAmI = ConfigVariable::getWhere();
index 7d16abf..3eda4de 100644 (file)
@@ -76,6 +76,7 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
     ast::Exp* pExp      = NULL;
     int iID             = 0;
     types::Macro* pMacro = NULL;
+    bool bSilentError   = ConfigVariable::isSilentError();
     Parser parser;
 
     wchar_t* pwstFile = NULL;
@@ -293,6 +294,7 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
     pSeqExp->setExecFrom(ast::SeqExp::EXEC);
     pSeqExp->setReturnable();
     std::unique_ptr<ast::ConstVisitor> exec(ConfigVariable::getDefaultVisitor());
+    ConfigVariable::setSilentError(bErrCatch);
 
     try
     {
@@ -305,6 +307,8 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
         }
         catch (const ast::RecursionException& /* re */)
         {
+            ConfigVariable::setSilentError(bSilentError);
+
             //close opened scope during try
             while (pCtx->getScopeLevel() > scope)
             {
@@ -328,6 +332,7 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
     {
         closeFile(file, iID, wstFile, pExp);
         ConfigVariable::setPromptMode(oldVal);
+        ConfigVariable::setSilentError(bSilentError);
         throw ia;
     }
     catch (const ast::InternalError& ie)
@@ -342,6 +347,7 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
             closeFile(file, iID, wstFile, pExp);
             ConfigVariable::setPromptMode(oldVal);
             ConfigVariable::setExecutedFile(L"");
+            ConfigVariable::setSilentError(bSilentError);
             throw ie;
         }
 
@@ -351,6 +357,7 @@ types::Function::ReturnValue sci_exec(types::typed_list &in, int _iRetCount, typ
 
     //restore previous prompt mode
     ConfigVariable::setPromptMode(oldVal);
+    ConfigVariable::setSilentError(bSilentError);
     if (bErrCatch)
     {
         out.push_back(new types::Double(iErr));
index f7d94c8..6d422ca 100644 (file)
@@ -48,6 +48,7 @@ types::Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount,
     wchar_t* pstMsg     = NULL;
     ast::Exp* pExp      = NULL;
     wchar_t *pstCommand = NULL;
+    bool bSilentError   = ConfigVariable::isSilentError();
     Parser parser;
 
     if (in.size() < 1 || in.size() > 3)
@@ -206,6 +207,7 @@ types::Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount,
 
     ast::SeqExp* pSeqExp = pExp->getAs<ast::SeqExp>();
     std::unique_ptr<ast::ConstVisitor> run(ConfigVariable::getDefaultVisitor());
+    ConfigVariable::setSilentError(bErrCatch);
     try
     {
         symbol::Context* pCtx = symbol::Context::getInstance();
@@ -217,6 +219,8 @@ types::Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount,
         }
         catch (const ast::RecursionException& /* re */)
         {
+            ConfigVariable::setSilentError(bSilentError);
+
             //close opened scope during try
             while (pCtx->getScopeLevel() > scope)
             {
@@ -243,6 +247,7 @@ types::Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount,
             delete pExp;
             ConfigVariable::macroFirstLine_end();
             ConfigVariable::setPromptMode(iPromptMode);
+            ConfigVariable::setSilentError(bSilentError);
             throw ie;
         }
 
@@ -266,6 +271,7 @@ types::Function::ReturnValue sci_execstr(types::typed_list &in, int _iRetCount,
 
     ConfigVariable::macroFirstLine_end();
     ConfigVariable::setPromptMode(iPromptMode);
+    ConfigVariable::setSilentError(bSilentError);
 
     delete pExp;
     return types::Function::OK;