From: Anthony Geay Date: Mon, 8 Oct 2018 13:35:38 +0000 (+0200) Subject: [EDF17963] : Pickelization of Py3 introduces \0 in vector. AtomAny has to manag... X-Git-Tag: V9_2_0a2~7 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=6309bc748bdefb743c11bd78aa94cb2d0ca8fc9d;p=modules%2Fyacs.git [EDF17963] : Pickelization of Py3 introduces \0 in vector. AtomAny has to manage this to avoid to loose data during Py<->Neutral conversion. --- diff --git a/src/engine/Any.cxx b/src/engine/Any.cxx index 633f348c4..d69a0565e 100644 --- a/src/engine/Any.cxx +++ b/src/engine/Any.cxx @@ -31,12 +31,22 @@ using namespace std; // forbidden value int=-269488145 double=-1.54947e+231 bool=239 const char SeqAlloc::DFT_CHAR_VAR=-17;//0xEF -StringOnHeap::StringOnHeap(const char *val):_dealloc(0),_str(strdup(val)) +StringOnHeap::StringOnHeap(const char *val):_str(strdup(val)),_len(strlen(val)),_dealloc(0) { } -StringOnHeap::StringOnHeap(const std::string& val):_dealloc(0),_str(strdup(val.c_str())) +StringOnHeap::StringOnHeap(const char *val, std::size_t len):_dealloc(0),_len(len) { + _str=(char *)malloc(len+1); + std::copy(val,val+len,_str); + _str[len]='\0'; +} + +StringOnHeap::StringOnHeap(const std::string& val):_dealloc(0),_len(val.size()),_str(nullptr) +{ + _str=(char *)malloc(val.size()+1); + std::copy(val.cbegin(),val.cend(),_str); + _str[val.size()]='\0'; } /*! @@ -46,7 +56,7 @@ StringOnHeap::StringOnHeap(const std::string& val):_dealloc(0),_str(strdup(val.c * \param deAlloc : pointer on function to deallocate val after * last use. */ -StringOnHeap::StringOnHeap(char *val, Deallocator deAlloc):_dealloc(deAlloc) +StringOnHeap::StringOnHeap(char *val, Deallocator deAlloc):_len(0),_dealloc(deAlloc) { if(deAlloc) _str=val; @@ -61,7 +71,10 @@ bool StringOnHeap::operator ==(const StringOnHeap& other) const StringOnHeap *StringOnHeap::deepCopy() const { - return new StringOnHeap(_str); + if(_len==0) + return new StringOnHeap(_str); + else + return new StringOnHeap(_str,_len); } StringOnHeap::~StringOnHeap() @@ -222,7 +235,24 @@ double AtomAny::getDoubleValue() const throw(YACS::Exception) std::string AtomAny::getStringValue() const throw(YACS::Exception) { if(_type->isA(Runtime::_tc_string)) - return string(_value._s->cStr()); + { + std::size_t sz(_value._s->size()); + if(sz==0) + return string(_value._s->cStr()); + else + return string(_value._s->cStr(),sz); + } + else + throw Exception("Value is not a string"); +} + +const char *AtomAny::getBytesValue(std::size_t& len) const +{ + if(_type->isA(Runtime::_tc_string)) + { + len=_value._s->size(); + return _value._s->cStr(); + } else throw Exception("Value is not a string"); } diff --git a/src/engine/Any.hxx b/src/engine/Any.hxx index e4cef91fe..882ffa97b 100644 --- a/src/engine/Any.hxx +++ b/src/engine/Any.hxx @@ -49,14 +49,17 @@ namespace YACS friend class ArrayAny; private: StringOnHeap(const char *val); + StringOnHeap(const char *val, std::size_t len); StringOnHeap(const std::string& val); StringOnHeap(char *val, Deallocator deAlloc); bool operator ==(const StringOnHeap& other) const; StringOnHeap *deepCopy() const; const char *cStr() const { return _str; } + std::size_t size() const { return _len; } ~StringOnHeap(); private: char *_str; + std::size_t _len; Deallocator _dealloc; }; @@ -122,6 +125,7 @@ namespace YACS bool getBoolValue() const throw(Exception); double getDoubleValue() const throw(Exception); std::string getStringValue() const throw(Exception); + const char *getBytesValue(std::size_t& len) const; protected: void putMyReprAtPlace(char *data) const; static void putReprAtPlace(char *data, const char *src, const TypeCode *type, bool deepCpy); diff --git a/src/engine_swig/pilot.i b/src/engine_swig/pilot.i index c2c324fe7..1e39f51bd 100644 --- a/src/engine_swig/pilot.i +++ b/src/engine_swig/pilot.i @@ -446,6 +446,18 @@ EXCEPTION(YACS::ENGINE::ExecutorSwig::waitPause) return self->getValue(); } } +%extend YACS::ENGINE::Any +{ + PyObject *getBytes() + { + YACS::ENGINE::AtomAny *self2(dynamic_cast(self)); + if(!self2) + throw YACS::Exception("getBytes : self is not an AtomAny !"); + std::size_t len(0); + const char *pt(self2->getBytesValue(len)); + return PyBytes_FromStringAndSize(pt,len); + } +} %extend YACS::ENGINE::AnyInputPort {