]> SALOME platform Git repositories - modules/yacs.git/commitdiff
Salome HOME
[EDF17963] : Pickelization of Py3 introduces \0 in vector<char>. AtomAny has to manag... agy/edf17963
authorAnthony Geay <anthony.geay@edf.fr>
Mon, 8 Oct 2018 13:35:38 +0000 (15:35 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Mon, 8 Oct 2018 13:35:38 +0000 (15:35 +0200)
src/engine/Any.cxx
src/engine/Any.hxx
src/engine_swig/pilot.i

index 633f348c4c49035656c230c1f2f4d45bf39c9f70..d69a0565eebb40a61435112954293f75876de0d2 100644 (file)
@@ -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");
 }
index e4cef91fec72fc73c1cac6ad6a6fc9515331db29..882ffa97beada6365962a979bb4944ab76e961bc 100644 (file)
@@ -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);
index c2c324fe75990c4da8490ddef48441bfab84cf0b..1e39f51bd957c410961488cfeccd9da3b8abc892 100644 (file)
@@ -446,6 +446,18 @@ EXCEPTION(YACS::ENGINE::ExecutorSwig::waitPause)
     return self->getValue();
   }
 }
+%extend YACS::ENGINE::Any
+{
+  PyObject *getBytes()
+  {
+    YACS::ENGINE::AtomAny *self2(dynamic_cast<YACS::ENGINE::AtomAny *>(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
 {