Salome HOME
updated copyright message
[modules/yacs.git] / src / runtime / DistributedPythonNode.cxx
index bf78b6d30d9f462f34ba995814133d778b86f76f..6696f3a2b23d5417901cf420d2a4470c293d13ba 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2006-2016  CEA/DEN, EDF R&D
+// Copyright (C) 2006-2023  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -23,7 +23,7 @@
 #include "PythonNode.hxx"
 #include "SalomeHPContainer.hxx"
 #include "SalomeContainerTmpForHP.hxx"
-#include "AutoGIL.hxx"
+#include "PythonCppUtils.hxx"
 
 #include "PythonPorts.hxx"
 #include "YacsTrace.hxx"
@@ -113,12 +113,13 @@ void DistributedPythonNode::load()
     if(!_container)
       throw Exception("No container specified !");
     SalomeContainer *containerCast0(dynamic_cast<SalomeContainer *>(_container));
-    SalomeHPContainerBase *containerCast1(dynamic_cast<SalomeHPContainerBase *>(_container));
+    SalomeHPContainer *containerCast1(dynamic_cast<SalomeHPContainer *>(_container));
     if(containerCast0)
       objContainer=containerCast0->getContainerPtr(this);
     else if(containerCast1)
       {
-        objContainer=containerCast1->getContainerPtr(this);
+        YACS::BASES::AutoCppPtr<SalomeContainerTmpForHP> tmpCont(SalomeContainerTmpForHP::BuildFrom(containerCast1,this));
+        objContainer=tmpCont->getContainerPtr(this);
       }
     else
       throw Exception("Unrecognized type of container ! Salome one is expected !");
@@ -180,11 +181,12 @@ void DistributedPythonNode::execute()
         PyTuple_SetItem(args,pos,ob);
       }
     PyObject *serializationInput=PyObject_CallObject(_pyfuncSer,args);
-    std::string serializationInputC=PyBytes_AsString(serializationInput);
+    Py_ssize_t len = PyBytes_Size(serializationInput);
+    char* serializationInputC = PyBytes_AsString(serializationInput);
+    //int ret = PyBytes_AsStringAndSize(serializationInput, &serializationInputC, &len);
     serializationInputCorba=new Engines::pickledArgs;
-    int len=serializationInputC.length();
-    serializationInputCorba->length(serializationInputC.length());
-    for(int i=0;i<serializationInputC.length();i++)
+    serializationInputCorba->length(len+1);
+    for(int i=0;i<len+1;i++)
       (*serializationInputCorba)[i]=serializationInputC[i];
     Py_DECREF(serializationInput);
   }
@@ -208,15 +210,25 @@ void DistributedPythonNode::execute()
   resultCorbaC[resultCorba->length()]='\0';
   for(int i=0;i<resultCorba->length();i++)
     resultCorbaC[i]=(*resultCorba)[i];
+  int lenResCorba=resultCorba->length();
   delete resultCorba;
   {
     AutoGIL agil;
     args = PyTuple_New(1);
-    PyObject* resultPython=PyBytes_FromString(resultCorbaC);
+    //PyObject* resultPython=PyBytes_FromString(resultCorbaC);
+    PyObject* resultPython=PyBytes_FromStringAndSize(resultCorbaC,lenResCorba);
     delete [] resultCorbaC;
     PyTuple_SetItem(args,0,resultPython);
     PyObject *finalResult=PyObject_CallObject(_pyfuncUnser,args);
     DEBTRACE( "-----------------DistributedPythonNode::outputs-----------------" );
+    if(finalResult == NULL)
+      {
+        std::stringstream msg;
+        msg << "Conversion with pickle of output ports failed !";
+        msg << " : " << __FILE__ << ":" << __LINE__;
+        _errorDetails=msg.str();
+        throw YACS::ENGINE::ConversionException(msg.str());
+      }
     int nres=1;
     if(finalResult == Py_None)
       nres=0;