Use a stack to manage "where" location 41/16041/6
Clément DAVID [Mon, 23 Feb 2015 15:05:21 +0000 (16:05 +0100)]
This commit also manage whereami data when calling function without parents
like 'pause,'.

test_run core where

Change-Id: Id96decdce5b2d624f3fcd511bfe0b86340579bec

22 files changed:
scilab/modules/ast/includes/system_env/configvariable.hxx
scilab/modules/ast/includes/types/arrayof.hxx
scilab/modules/ast/includes/types/callable.hxx
scilab/modules/ast/includes/types/graphichandle.hxx
scilab/modules/ast/includes/types/implicitlist.hxx
scilab/modules/ast/includes/types/internal.hxx
scilab/modules/ast/includes/types/list.hxx
scilab/modules/ast/includes/types/mlist.hxx
scilab/modules/ast/includes/types/sparse.hxx
scilab/modules/ast/includes/types/struct.hxx
scilab/modules/ast/includes/types/tlist.hxx
scilab/modules/ast/src/cpp/ast/runvisitor.cpp
scilab/modules/ast/src/cpp/system_env/configvariable.cpp
scilab/modules/ast/src/cpp/types/callable.cpp
scilab/modules/ast/src/cpp/types/graphichandle.cpp
scilab/modules/ast/src/cpp/types/implicitlist.cpp
scilab/modules/ast/src/cpp/types/mlist.cpp
scilab/modules/ast/src/cpp/types/struct.cpp
scilab/modules/ast/src/cpp/types/tlist.cpp
scilab/modules/core/sci_gateway/cpp/sci_where.cpp
scilab/modules/core/src/cpp/runner.cpp
scilab/modules/scicos/src/cpp/view_scilab/BaseAdapter.hxx

index 84f1124..958c9d3 100644 (file)
@@ -18,6 +18,7 @@
 #pragma warning (disable : 4251)
 #endif
 
+#include <vector>
 #include <list>
 #include <map>
 #include <string>
@@ -375,17 +376,24 @@ public :
     static int getFuncprot();
 
     // where
-private :
-    static std::list< std::pair<int, std::wstring> > m_Where;
-    static std::list<int> m_FirstMacroLine;
 public :
-    static void where_begin(int _iLineNum, std::wstring _wstName);
+    struct WhereEntry
+    {
+        int m_line;
+        int m_absolute_line;
+        std::wstring m_name;
+        WhereEntry(int line, int absolute_line, const std::wstring& name) : m_line(line), m_absolute_line(absolute_line), m_name(name) {}
+    };
+    static void where_begin(int _iLineNum, int _iLineLocation, const std::wstring& _wstName);
     static void where_end();
-    static std::list< std::pair<int, std::wstring> >& getWhere();
+    static const std::vector<WhereEntry>& getWhere();
 
     static void macroFirstLine_begin(int _iLine);
     static void macroFirstLine_end();
     static int getMacroFirstLines();
+private :
+    static std::vector<WhereEntry> m_Where;
+    static std::vector<int> m_FirstMacroLine;
 
     //module called with variable by reference
 private :
index 2e95562..573bc3d 100644 (file)
@@ -368,7 +368,7 @@ public :
     InternalType* extract(typed_list* _pArgs);
     bool resize(int* _piDims, int _iDims);
 
-    virtual bool invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & /*execFunc*/, const ast::CallExp & e)
+    virtual bool invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & /*execFunc*/, const ast::Exp & e)
     {
         if (in.size() == 0)
         {
@@ -381,10 +381,7 @@ public :
             {
                 std::wostringstream os;
                 os << _W("Invalid index.\n");
-                ast::exps_t* args = e.getArgs();
-                Location loc((*args->begin())->getLocation());
-                delete args;
-                throw ast::ScilabError(os.str(), 999, loc);
+                throw ast::ScilabError(os.str(), 999, e.getLocation());
             }
             out.push_back(_out);
         }
index 7674769..f45ef68 100644 (file)
@@ -49,7 +49,7 @@ public :
 
     virtual ReturnValue   call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out, ast::ConstVisitor* execFunc) = 0;
 
-    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & e);
+    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & e);
 
     virtual bool isInvokable() const
     {
@@ -75,7 +75,7 @@ public :
     {
         m_wstName = _wstName;
     }
-    std::wstring        getName()
+    const std::wstring&   getName()
     {
         return m_wstName;
     }
index c617d0f..8059cdb 100644 (file)
@@ -80,7 +80,7 @@ public :
         return true;
     }
 
-    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & e);
+    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & e);
 
 protected :
     inline ScilabType          getType(void)
index 54c7c7e..d8f6a95 100644 (file)
@@ -128,7 +128,7 @@ public :
     InternalType* extractFullMatrix();
 
     virtual InternalType* extract(typed_list* _pArgs);
-    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & e);
+    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & e);
 
 
     /* return type as string ( double, int, cell, list, ... )*/
index a9d2d63..2deeba3 100644 (file)
@@ -341,7 +341,7 @@ public :
         return false;
     }
 
-    virtual bool invoke(typed_list & /*in*/, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & /*out*/, ast::ConstVisitor & /*execFunc*/, const ast::CallExp & /*e*/)
+    virtual bool invoke(typed_list & /*in*/, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & /*out*/, ast::ConstVisitor & /*execFunc*/, const ast::Exp & /*e*/)
     {
         return false;
     }
index 8b5aed4..4dc626b 100644 (file)
@@ -66,7 +66,7 @@ public :
     InternalType*                   insert(typed_list* _pArgs, InternalType* _pSource);
     InternalType*                   extract(typed_list* _pArgs);
 
-    virtual bool invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & /*execFunc*/, const ast::CallExp & /*e*/)
+    virtual bool invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & /*execFunc*/, const ast::Exp & /*e*/)
     {
         if (in.size() == 0)
         {
index 1396ff2..4a9404c 100644 (file)
@@ -46,7 +46,7 @@ public :
         return false;
     }
 
-    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & e);
+    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & e);
 
 protected :
     MList(MList *_oMListCopyMe) : TList(_oMListCopyMe) {}
index 390d38b..5922bb4 100644 (file)
@@ -194,7 +194,7 @@ struct EXTERN_AST Sparse : GenericType
      */
     InternalType* extract(typed_list* _pArgs);
 
-    virtual bool invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & /*execFunc*/, const ast::CallExp & e)
+    virtual bool invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & /*execFunc*/, const ast::Exp & e)
     {
         if (in.size() == 0)
         {
@@ -207,7 +207,7 @@ struct EXTERN_AST Sparse : GenericType
             {
                 std::wostringstream os;
                 os << _W("Invalid index.\n");
-                throw ast::ScilabError(os.str(), 999, e.getFirstLocation());
+                throw ast::ScilabError(os.str(), 999, e.getLocation());
             }
             out.push_back(_out);
         }
@@ -591,7 +591,7 @@ struct EXTERN_AST SparseBool : GenericType
     SparseBool* extract(int _iSeqCount, int* _piSeqCoord, int* _piMaxDim, int* _piDimSize, bool _bAsVector) SPARSE_CONST;
     InternalType* extract(typed_list* _pArgs);
 
-    virtual bool invoke(typed_list & in, optional_list &/*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & /*execFunc*/, const ast::CallExp & e)
+    virtual bool invoke(typed_list & in, optional_list &/*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & /*execFunc*/, const ast::Exp & e)
     {
         if (in.size() == 0)
         {
@@ -604,7 +604,7 @@ struct EXTERN_AST SparseBool : GenericType
             {
                 std::wostringstream os;
                 os << _W("Invalid index.\n");
-                throw ast::ScilabError(os.str(), 999, e.getFirstLocation());
+                throw ast::ScilabError(os.str(), 999, e.getLocation());
             }
             out.push_back(_out);
         }
index 5a57048..a385845 100644 (file)
@@ -123,7 +123,7 @@ public :
     using ArrayOf<SingleStruct *>::extract;
     bool extract(const std::wstring & name, InternalType *& out);
 
-    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & e);
+    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & e);
 
     virtual int getInvokeNbOut()
     {
index 38ecda5..176b6a1 100644 (file)
@@ -54,7 +54,7 @@ public :
     using List::extract; // to avoid this extract to hide extract in list
     bool                            extract(const std::wstring & name, InternalType *& out);
 
-    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & e);
+    virtual bool invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & e);
 
     bool isFieldExtractionOverloadable() const
     {
index 250815d..d3a6e84 100644 (file)
@@ -749,41 +749,20 @@ void RunVisitorT<T>::visitprivate(const SeqExp  &e)
                         //in this case of calling, we can return only one values
                         int iSaveExpectedSize = getExpectedSize();
                         setExpectedSize(1);
-                        Function::ReturnValue Ret = pCall->call(in, opt, getExpectedSize(), out, this);
+
+                        pCall->invoke(in, opt, getExpectedSize(), out, *this, e);
                         setExpectedSize(iSaveExpectedSize);
 
-                        if (Ret == Callable::OK)
+                        if (out.size() == 0)
                         {
-                            if (out.size() == 0)
-                            {
-                                setResult(NULL);
-                            }
-                            else
-                            {
-                                setResult(out[0]);
-                            }
-                            bImplicitCall = true;
+                            setResult(NULL);
                         }
-                        else if (Ret == Callable::Error)
+                        else
                         {
-                            if (ConfigVariable::getLastErrorFunction() == L"")
-                            {
-                                ConfigVariable::setLastErrorFunction(pCall->getName());
-                                ConfigVariable::setLastErrorLine(e.getLocation().first_line);
-                                throw ScilabError();
-                            }
-
-                            if (pCall->isMacro() || pCall->isMacroFile())
-                            {
-                                wchar_t szError[bsiz];
-                                os_swprintf(szError, bsiz, _W("at line % 5d of function %ls called by :\n").c_str(), (*itExp)->getLocation().first_line, pCall->getName().c_str());
-                                throw ScilabMessage(szError);
-                            }
-                            else
-                            {
-                                throw ScilabMessage();
-                            }
+                            setResult(out[0]);
                         }
+
+                        bImplicitCall = true;
                     }
                     catch (ScilabMessage sm)
                     {
@@ -808,6 +787,26 @@ void RunVisitorT<T>::visitprivate(const SeqExp  &e)
                             throw sm;
                         }
                     }
+                    catch (ast::ScilabError & se)
+                    {
+                        if (ConfigVariable::getLastErrorFunction() == L"")
+                        {
+                            ConfigVariable::setLastErrorFunction(pCall->getName());
+                            ConfigVariable::setLastErrorLine(e.getLocation().first_line);
+                            throw ScilabError();
+                        }
+
+                        if (pCall->isMacro() || pCall->isMacroFile())
+                        {
+                            wchar_t szError[bsiz];
+                            os_swprintf(szError, bsiz, _W("at line % 5d of function %ls called by :\n").c_str(), (*itExp)->getLocation().first_line, pCall->getName().c_str());
+                            throw ScilabMessage(szError);
+                        }
+                        else
+                        {
+                            throw ScilabMessage();
+                        }
+                    }
                 }
 
                 //don't output Simplevar and empty result
index 130dc39..d47e9e8 100644 (file)
@@ -9,6 +9,8 @@
 *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 *
 */
+
+#include <vector>
 #include <list>
 #include "configvariable.hxx"
 #include "context.hxx"
@@ -1102,22 +1104,19 @@ int ConfigVariable::getFuncprot()
 ** \{
 */
 
-std::list< std::pair<int, std::wstring> > ConfigVariable::m_Where;
-std::list<int> ConfigVariable::m_FirstMacroLine;
-void ConfigVariable::where_begin(int _iLineNum, std::wstring _wstName)
+std::vector<ConfigVariable::WhereEntry> ConfigVariable::m_Where;
+std::vector<int> ConfigVariable::m_FirstMacroLine;
+void ConfigVariable::where_begin(int _iLineNum, int _iLineLocation, const std::wstring& _wstName)
 {
-    m_Where.push_front(std::pair<int, std::wstring>(_iLineNum, _wstName));
+    m_Where.emplace_back(_iLineNum, _iLineLocation, _wstName);
 }
 
 void ConfigVariable::where_end()
 {
-    if (m_Where.empty() == false)
-    {
-        m_Where.pop_front();
-    }
+    m_Where.pop_back();
 }
 
-std::list< std::pair<int, std::wstring> >& ConfigVariable::getWhere()
+const std::vector<ConfigVariable::WhereEntry>& ConfigVariable::getWhere()
 {
     return m_Where;
 }
index 3539381..6dc2159 100644 (file)
 namespace types
 {
 
-bool Callable::invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & e)
+bool Callable::invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & e)
 {
     //reset previous error before call function
     ConfigVariable::resetError();
     //update verbose";" flag
     ConfigVariable::setVerbose(e.isVerbose());
     // add line and function name in where
-    ConfigVariable::where_begin(((int)e.getLocation().first_line - ConfigVariable::getMacroFirstLines()) + 1, getName());
+    ConfigVariable::where_begin(e.getLocation().first_line + 1 - ConfigVariable::getMacroFirstLines(), e.getLocation().first_line, getName());
     Callable::ReturnValue Ret;
 
     try
index b0c91fc..f301153 100644 (file)
@@ -181,7 +181,7 @@ long long* GraphicHandle::allocData(int _iSize)
     return new long long[_iSize];
 }
 
-bool GraphicHandle::invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & e)
+bool GraphicHandle::invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & e)
 {
     if (in.size() == 0)
     {
index b9d18de..c7fa53b 100644 (file)
@@ -588,7 +588,7 @@ bool ImplicitList::neg(InternalType *& out)
     return false;
 }
 
-bool ImplicitList::invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & /*execFunc*/, const ast::CallExp & e)
+bool ImplicitList::invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & /*execFunc*/, const ast::Exp & e)
 {
     if (in.size() == 0)
     {
@@ -601,7 +601,7 @@ bool ImplicitList::invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetC
         {
             std::wostringstream os;
             os << _W("Invalid index.\n");
-            throw ast::ScilabError(os.str(), 999, e.getFirstLocation());
+            throw ast::ScilabError(os.str(), 999, e.getLocation());
         }
         out.push_back(_out);
     }
index 0e6df6b..47e1f23 100644 (file)
@@ -21,7 +21,7 @@
 
 namespace types
 {
-bool MList::invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & /*e*/)
+bool MList::invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & /*e*/)
 {
     if (in.size() == 0)
     {
index c36085a..5780eae 100644 (file)
@@ -150,7 +150,7 @@ bool Struct::extract(const std::wstring & name, InternalType *& out)
     return true;
 }
 
-bool Struct::invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & e)
+bool Struct::invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & e)
 {
     if (in.size() == 0)
     {
@@ -176,7 +176,7 @@ bool Struct::invoke(typed_list & in, optional_list & opt, int _iRetCount, typed_
                 {
                     wchar_t szError[bsiz];
                     os_swprintf(szError, bsiz, _W("Field \"%ls\" does not exists\n").c_str(), wstField.c_str());
-                    throw ast::ScilabError(szError, 999, e.getFirstLocation());
+                    throw ast::ScilabError(szError, 999, e.getLocation());
                 }
             }
 
index 3fe2542..5a9f1ab 100644 (file)
@@ -77,7 +77,7 @@ bool TList::exists(const std::wstring& _sKey)
     return false;
 }
 
-bool TList::invoke(typed_list & in, optional_list & /*opt*/, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & /*e*/)
+bool TList::invoke(typed_list & in, optional_list & /*opt*/, int _iRetCount, typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & /*e*/)
 {
     if (in.size() == 0)
     {
index eb77c69..6e62cf9 100644 (file)
@@ -10,6 +10,8 @@
  *
  */
 
+#include <vector>
+
 #include "core_gw.hxx"
 #include "function.hxx"
 #include "configvariable.hxx"
@@ -36,28 +38,27 @@ types::Function::ReturnValue sci_where(types::typed_list &in, int _iRetCount, ty
         return types::Function::Error;
     }
 
-    std::list<std::pair<int, std::wstring> > lWhereAmI = ConfigVariable::getWhere();
-    if (lWhereAmI.size() == 1)
+    const std::vector<ConfigVariable::WhereEntry>& lWhereAmI = ConfigVariable::getWhere();
+    if (lWhereAmI.size() <= 1)
     {
         out.push_back(types::Double::Empty());
         out.push_back(types::Double::Empty());
         return types::Function::OK;
     }
 
-    std::list<std::pair<int, std::wstring> >::const_iterator it;
     types::Double* pDblLines = new types::Double((int)lWhereAmI.size() - 1, 1);
     types::String* pStrNames = new types::String((int)lWhereAmI.size() - 1, 1);
 
-    it = lWhereAmI.begin();
-    pDblLines->set(0, (double)it->first);
+    auto it = lWhereAmI.rbegin();
+    pDblLines->set(0, it->m_line);
     it++;
-    for (int i = 0; it != lWhereAmI.end(); it++, i++)
+    for (int i = 0; it != lWhereAmI.rend(); it++, i++)
     {
-        pDblLines->set(i + 1, (double)(it->first));
-        pStrNames->set(i, it->second.c_str());
+        pDblLines->set(i + 1, it->m_line);
+        pStrNames->set(i, it->m_name.c_str());
     }
 
-    pStrNames->set((int)lWhereAmI.size() - 1, lWhereAmI.front().second.c_str());
+    pStrNames->set(static_cast<int>(lWhereAmI.size()) - 1, lWhereAmI.back().m_name.c_str());
 
     out.push_back(pDblLines);
     out.push_back(pStrNames);
index 4bcde7c..75a87b9 100644 (file)
@@ -41,8 +41,6 @@ void *Runner::launch(void *args)
     }
     catch (const ast::ScilabException& se)
     {
-        // remove the last call from where in case pause/abort
-        ConfigVariable::where_end();
         scilabErrorW(se.GetErrorMessage().c_str());
     }
 
index 146a4c0..579be80 100644 (file)
@@ -383,7 +383,7 @@ private:
         return true;
     }
 
-    bool invoke(types::typed_list & in, types::optional_list & /*opt*/, int /*_iRetCount*/, types::typed_list & out, ast::ConstVisitor & execFunc, const ast::CallExp & /*e*/)
+    bool invoke(types::typed_list & in, types::optional_list & /*opt*/, int /*_iRetCount*/, types::typed_list & out, ast::ConstVisitor & execFunc, const ast::Exp & /*e*/)
     {
         if (in.size() == 0)
         {