Merge remote-tracking branch 'origin/master' into jit
[scilab.git] / scilab / modules / ast / src / cpp / ast / run_CallExp.hpp
index af8f604..840511d 100644 (file)
@@ -1,14 +1,14 @@
 /*
- *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- *  Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
- *
- *  This file must be used under the terms of the CeCILL.
- *  This source file is licensed as described in the file COPYING, which
- *  you should have received as part of this distribution.  The terms
- *  are also available at
- *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
- *
- */
+*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*  Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
+*
+*  This file must be used under the terms of the CeCILL.
+*  This source file is licensed as described in the file COPYING, which
+*  you should have received as part of this distribution.  The terms
+*  are also available at
+*  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+*/
 
 //file included in runvisitor.cpp
 namespace ast {
@@ -17,6 +17,26 @@ template<class T>
 void RunVisitorT<T>::visitprivate(const CallExp &e)
 {
     CoverageInstance::invokeAndStartChrono((void*)&e);
+    bool isJITCall = false;
+    exps_t args;
+    types::InternalType * pIT = nullptr;
+    const Exp & name = e.getName();
+    if (name.isSimpleVar() && static_cast<const SimpleVar &>(name).getSymbol().getName() == L"jit")
+    {
+        const ast::exps_t _args = e.getArgs();
+        if (_args.size() == 1)
+        {
+            const ast::Exp & arg = *_args.back();
+            if (arg.isCallExp())
+            {
+                args = static_cast<const CallExp &>(arg).getArgs();
+                static_cast<const CallExp &>(arg).getName().accept(*this);
+                pIT = getResult();
+                isJITCall = true;
+            }
+        }
+    }
+
     types::typed_list outTmp;
     types::typed_list inTmp;
     std::vector<std::wstring> vectOptName;
@@ -26,7 +46,12 @@ void RunVisitorT<T>::visitprivate(const CallExp &e)
     int iSaveExpectedSize = iRetCount;
 
     //get function arguments
-    exps_t args = e.getArgs();
+   
+    if (isJITCall == false)
+    {
+        args = e.getArgs();
+    }
+
     try
     {
         for (auto& arg : args)
@@ -115,17 +140,20 @@ void RunVisitorT<T>::visitprivate(const CallExp &e)
         throw ie;
     }
 
-    // get function/variable
-    try
-    {
-        e.getName().accept(*this);
-    }
-    catch (ScilabException &)
+    if (isJITCall == false)
     {
-        CoverageInstance::stopChrono((void*)&e);
-        throw;
+        // get function/variable
+        try
+        {
+            e.getName().accept(*this);
+        }
+        catch (ScilabException &)
+        {
+            CoverageInstance::stopChrono((void*)&e);
+            throw;
+        }
+        pIT = getResult();
     }
-    types::InternalType* pIT = getResult();
 
     types::typed_list out;
     types::typed_list in;
@@ -269,7 +297,19 @@ void RunVisitorT<T>::visitprivate(const CallExp &e)
             }
             else
             {
-                ret = pIT->invoke(in, opt, iRetCount, out, e);
+                if (isJITCall)
+                {
+                    ret = jit::Jitter::analyzeAndJIT(e, in, out);
+                    if (!ret)
+                    {
+                        ret = pIT->invoke(in, opt, iRetCount, out, e);
+                    }
+                }
+                else
+                {
+                    ret = pIT->invoke(in, opt, iRetCount, out, e);
+                }
+
                 if (ret == false && pIT->isUserType())
                 {
                     // call overload