Author: Ronan Lamy <[email protected]>
Branch: 
Changeset: r92802:e0fe31dff118
Date: 2017-10-19 18:38 +0100
http://bitbucket.org/pypy/pypy/changeset/e0fe31dff118/

Log:    backport changes from py3.5

diff --git a/lib_pypy/_ctypes/array.py b/lib_pypy/_ctypes/array.py
--- a/lib_pypy/_ctypes/array.py
+++ b/lib_pypy/_ctypes/array.py
@@ -8,12 +8,16 @@
 class ArrayMeta(_CDataMeta):
     def __new__(self, name, cls, typedict):
         res = type.__new__(self, name, cls, typedict)
-        if '_type_' not in typedict:
+
+        if cls == (_CData,): # this is the Array class defined below
             res._ffiarray = None
             return res
-        ffiarray = _rawffi.Array(typedict['_type_']._ffishape_)
-        res._ffiarray = ffiarray
-        subletter = getattr(typedict['_type_'], '_type_', None)
+        if not hasattr(res, '_length_') or not isinstance(res._length_, int):
+            raise AttributeError(
+                "class must define a '_length_' attribute, "
+                "which must be a positive integer")
+        ffiarray = res._ffiarray = _rawffi.Array(res._type_._ffishape_)
+        subletter = getattr(res._type_, '_type_', None)
         if subletter == 'c':
             def getvalue(self):
                 return _rawffi.charp2string(self._buffer.buffer,
@@ -28,12 +32,12 @@
                     for i in range(len(val)):
                         self[i] = val[i]
                 if len(val) < self._length_:
-                    self._buffer[len(val)] = '\x00'
+                    self._buffer[len(val)] = b'\x00'
             res.value = property(getvalue, setvalue)
 
             def getraw(self):
                 return _rawffi.charp2rawstring(self._buffer.buffer,
-                                                self._length_)
+                                               self._length_)
 
             def setraw(self, buffer):
                 if len(buffer) > self._length_:
@@ -43,7 +47,7 @@
         elif subletter == 'u':
             def getvalue(self):
                 return _rawffi.wcharp2unicode(self._buffer.buffer,
-                                                self._length_)
+                                              self._length_)
 
             def setvalue(self, val):
                 # we don't want to have buffers here
@@ -59,9 +63,8 @@
                     target[len(val)] = u'\x00'
             res.value = property(getvalue, setvalue)
 
-        if '_length_' in typedict:
-            res._ffishape_ = (ffiarray, typedict['_length_'])
-            res._fficompositesize_ = res._sizeofinstances()
+        res._ffishape_ = (ffiarray, res._length_)
+        res._fficompositesize_ = res._sizeofinstances()
         return res
 
     from_address = cdata_from_address
@@ -156,7 +159,7 @@
     l = [self[i] for i in range(start, stop, step)]
     letter = getattr(self._type_, '_type_', None)
     if letter == 'c':
-        return "".join(l)
+        return b"".join(l)
     if letter == 'u':
         return u"".join(l)
     return l
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to