X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2FDistributedPythonNode.cxx;h=626e2126e4e38fee71887be698af757c5b780abd;hb=3bd065d98e6be54641662dae58e489e7b97b5400;hp=bf78b6d30d9f462f34ba995814133d778b86f76f;hpb=0bd13bd4ef07bb64637ec2a49d8e5908c909c49b;p=modules%2Fyacs.git diff --git a/src/runtime/DistributedPythonNode.cxx b/src/runtime/DistributedPythonNode.cxx index bf78b6d30..626e2126e 100644 --- a/src/runtime/DistributedPythonNode.cxx +++ b/src/runtime/DistributedPythonNode.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2006-2016 CEA/DEN, EDF R&D +// Copyright (C) 2006-2022 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(_container)); - SalomeHPContainerBase *containerCast1(dynamic_cast(_container)); + SalomeHPContainer *containerCast1(dynamic_cast(_container)); if(containerCast0) objContainer=containerCast0->getContainerPtr(this); else if(containerCast1) { - objContainer=containerCast1->getContainerPtr(this); + YACS::BASES::AutoCppPtr 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;ilength(len+1); + for(int i=0;ilength()]='\0'; for(int i=0;ilength();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;