a little speed improvement at call of C gateway 13/17413/2
Antoine ELIAS [Thu, 29 Oct 2015 15:36:25 +0000 (16:36 +0100)]
Change-Id: I8994e4c81cb82d9848eea136010533066a2b1c85

scilab/modules/ast/includes/types/callable.hxx
scilab/modules/ast/includes/types/gatewaystruct.hxx
scilab/modules/ast/src/cpp/types/function.cpp
scilab/modules/fileio/sci_gateway/c/sci_chdir.c
scilab/modules/fileio/sci_gateway/c/sci_tempname.c
scilab/modules/sound/sci_gateway/c/sci_PlaySound.c

index 98d5567..8be061d 100644 (file)
@@ -129,10 +129,11 @@ public :
     }
 
 protected :
-    std::wstring           m_wstName;
-    std::wstring           m_wstModule;
-    int                    m_iFirstLine;
-    int                    m_iLastLine;
+    std::wstring            m_wstName;
+    std::string             m_stName;
+    std::wstring            m_wstModule;
+    int                     m_iFirstLine;
+    int                     m_iLastLine;
 };
 }
 
index e22685a..18d0dd3 100644 (file)
@@ -27,7 +27,7 @@ public :
     int                     m_iIn;
     int                     m_iOut;
     int*                    m_piRetCount;
-    char*                   m_pstName;
+    const char*             m_pstName;
     int*                    m_pOutOrder;
 
     GatewayStruct() {};
index a68750e..3c0fd54 100644 (file)
@@ -178,8 +178,11 @@ WrapFunction::WrapFunction(const std::wstring& _wstName, OLDGW_FUNC _pFunc, LOAD
 
 WrapFunction::WrapFunction(WrapFunction* _pWrapFunction)
 {
-    m_wstModule  = _pWrapFunction->getModule();
-    m_wstName    = _pWrapFunction->getName();
+    m_wstModule = _pWrapFunction->getModule();
+    m_wstName = _pWrapFunction->getName();
+    char* s = wide_string_to_UTF8(m_wstName.data());
+    m_stName = s;
+    FREE(s);
     m_pOldFunc  = _pWrapFunction->getFunc();
     m_pLoadDeps = _pWrapFunction->getDeps();
 }
@@ -192,6 +195,10 @@ InternalType* WrapFunction::clone()
 Function::ReturnValue WrapFunction::call(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out)
 {
     int ret = 1;
+    int inSize = (int)in.size();
+    int optSize = (int)opt.size();
+    bool isRef = checkReferenceModule(m_wstModule.c_str());
+
     if (m_pLoadDeps != NULL)
     {
         ret = m_pLoadDeps(m_wstName);
@@ -205,22 +212,22 @@ Function::ReturnValue WrapFunction::call(typed_list &in, optional_list &opt, int
     ReturnValue retVal = Callable::OK;
     GatewayStruct gStr;
     _iRetCount = std::max(1, _iRetCount);
-    gStr.m_iIn = (int)in.size() + (int)opt.size();
+    gStr.m_iIn = inSize + optSize;
     gStr.m_iOut = _iRetCount;
 
     //copy input parameter to prevent calling gateway modifies input data
     typed_list inCopy;
 
-    if (checkReferenceModule(m_wstModule.c_str()) == false)
+    if (isRef == false)
     {
-        for (int i = 0 ; i < (int)in.size() ; i++)
+        for (int i = 0; i < inSize; i++)
         {
             inCopy.push_back(in[i]->clone());
         }
     }
     else
     {
-        for (int i = 0 ; i < (int)in.size() ; i++)
+        for (int i = 0; i < inSize; i++)
         {
             inCopy.push_back(in[i]);
         }
@@ -231,16 +238,13 @@ Function::ReturnValue WrapFunction::call(typed_list &in, optional_list &opt, int
     std::fill_n(tmpOut, MAX_OUTPUT_VARIABLE, static_cast<typed_list::value_type>(0));
     gStr.m_pOut = tmpOut;
     gStr.m_piRetCount = &_iRetCount;
-    gStr.m_pstName = wide_string_to_UTF8(m_wstName.c_str());
+    gStr.m_pstName = m_stName.data();
     // we should use a stack array of the max size to avoid dynamic alloc.
     std::vector<int> outOrder(_iRetCount < 1 ? 1 : _iRetCount, -1);
-    gStr.m_pOutOrder = &outOrder[0];
-
-    char* pFunctionName = wide_string_to_UTF8(m_wstName.c_str());
+    gStr.m_pOutOrder = outOrder.data();
 
     //call gateway
-    m_pOldFunc(pFunctionName, reinterpret_cast<int*>(&gStr));
-    FREE(pFunctionName);
+    m_pOldFunc(const_cast<char*>(m_stName.data()), reinterpret_cast<int*>(&gStr));
     if (ConfigVariable::isError())
     {
         retVal = Callable::Error;
@@ -248,7 +252,7 @@ Function::ReturnValue WrapFunction::call(typed_list &in, optional_list &opt, int
     }
     else
     {
-        for (std::size_t i(0); i != (size_t)_iRetCount && outOrder[i] != -1 && outOrder[i] != 0 ; ++i)
+        for (std::size_t i(0); i != (size_t)_iRetCount && outOrder[i] != -1 && outOrder[i] != 0; ++i)
         {
             if (outOrder[i] - 1 < gStr.m_iIn)
             {
@@ -298,30 +302,28 @@ Function::ReturnValue WrapFunction::call(typed_list &in, optional_list &opt, int
         }
     }
 
-    //protect outputs
-    for (int i = 0 ; i < (int)out.size() ; i++)
-    {
-        out[i]->IncreaseRef();
-    }
-
     //clean input copy
-    if (checkReferenceModule(m_wstModule.c_str()) == false)
+    if (isRef == false)
     {
-        for (int i = 0 ; i < (int)in.size() ; i++)
+        //protect outputs
+        int size = (int)out.size();
+        for (int i = 0; i < size; i++)
         {
-            if (inCopy[i]->isDeletable())
-            {
-                inCopy[i]->killMe();
-            }
+            out[i]->IncreaseRef();
+        }
+
+        for (int i = 0; i < inSize; i++)
+        {
+            inCopy[i]->killMe();
+        }
+
+        //unprotect outputs
+        for (int i = 0; i < size; i++)
+        {
+            out[i]->DecreaseRef();
         }
-    }
-    //unprotect outputs
-    for (int i = 0 ; i < (int)out.size() ; i++)
-    {
-        out[i]->DecreaseRef();
     }
 
-    FREE(gStr.m_pstName);
     return retVal;
 }
 
index 1480022..be3d9bb 100644 (file)
@@ -73,7 +73,7 @@ int sci_chdir(char *fname, void* pvApiCtx)
     }
 
     expandedPath = expandPathVariableW(pStVarOne);
-    FREE(pStVarOne);
+    freeAllocatedSingleWideString(pStVarOne);
 
     if (expandedPath == NULL)
     {
@@ -144,7 +144,7 @@ int sci_chdir(char *fname, void* pvApiCtx)
             wchar_t *currentDir = scigetcwdW(&ierr);
             if ( (ierr == 0) && currentDir)
             {
-                sciErr = createMatrixOfWideString(pvApiCtx, Rhs + 1, 1, 1, (wchar_t const* const*) &currentDir);
+                sciErr = createMatrixOfWideString(pvApiCtx, Rhs + 1, 1, 1, (wchar_t const * const*) &currentDir);
             }
             else
             {
index 70f9986..f1dfad7 100644 (file)
@@ -69,7 +69,7 @@ int sci_tempname(char *fname, void* pvApiCtx)
 #if _MSC_VER
             if (wcslen(wcprefix) > 3)
             {
-                FREE(wcprefix);
+                freeAllocatedSingleWideString(wcprefix);
                 Scierror(999, _("%s: Wrong size for input argument #%d: A string (3 characters max.) expected.\n"), fname, 1);
                 return 0;
             }
@@ -77,14 +77,14 @@ int sci_tempname(char *fname, void* pvApiCtx)
         }
         else
         {
-            FREE(wcprefix);
+            freeAllocatedSingleWideString(wcprefix);
             Scierror(999, _("%s: Wrong type for input argument #%d: string expected.\n"), fname, 1);
             return 0;
         }
     }
 
     wcTempFilename = createtempfilenameW(wcprefix, TRUE);
-    FREE(wcprefix);
+    freeAllocatedSingleWideString(wcprefix);
     if (wcTempFilename == NULL)
     {
         Scierror(999, _("%s: Memory allocation error.\n"), fname);
index c695251..42f8aa7 100644 (file)
@@ -102,7 +102,7 @@ int sci_PlaySound(char *fname, void* pvApiCtx)
     expandedPath = expandPathVariableW(pStVarOne);
     if (pStVarOne)
     {
-        FREE(pStVarOne);
+        freeAllocatedSingleString(pStVarOne);
         pStVarOne = NULL;
     }