Salome HOME
updated copyright message
[modules/yacs.git] / src / runtime / DistributedPythonNode.cxx
index 8a2ccd7a71f93307a684e328290e467e6f0f2b08..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"
@@ -72,7 +72,7 @@ void DistributedPythonNode::load()
         _errorDetails=msg.str();
         throw Exception(msg.str());
       }
-    const char picklizeScript[]="import cPickle\ndef pickleForDistPyth2009(*args,**kws):\n  return cPickle.dumps((args,kws),-1)\n\ndef unPickleForDistPyth2009(st):\n  args=cPickle.loads(st)\n  return args\n";
+    const char picklizeScript[]="import pickle\ndef pickleForDistPyth2009(*args,**kws):\n  return pickle.dumps((args,kws),-1)\n\ndef unPickleForDistPyth2009(st):\n  args=pickle.loads(st)\n  return args\n";
     PyObject *res=PyRun_String(picklizeScript,Py_file_input,_context,_context);
     if(res == NULL)
       {
@@ -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=PyString_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=PyString_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;
@@ -237,7 +249,7 @@ void DistributedPythonNode::execute()
           {
             OutputPyPort *p=(OutputPyPort *)*iter;
             DEBTRACE( "port name: " << p->getName() );
-            DEBTRACE( "port kind: " << p->edGetType()->kind() );
+            DEBTRACE( "port kind: " << p->typeName() );
             DEBTRACE( "port pos : " << pos );
             if(PyTuple_Check(finalResult))ob=PyTuple_GetItem(finalResult,pos) ;
             else ob=finalResult;