Author: Manuel Jacob
Branch: py3k
Changeset: r61380:5674074df77e
Date: 2013-02-17 21:00 +0100
http://bitbucket.org/pypy/pypy/changeset/5674074df77e/

Log:    Fix/simplify Array type creation.

diff --git a/lib-python/3.2/ctypes/test/test_arrays.py 
b/lib-python/3.2/ctypes/test/test_arrays.py
--- a/lib-python/3.2/ctypes/test/test_arrays.py
+++ b/lib-python/3.2/ctypes/test/test_arrays.py
@@ -185,7 +185,7 @@
             class T(Array):
                 _type_ = c_int
                 _length_ = sys.maxsize * 2
-        with self.assertRaises(AttributeError):
+        with self.assertRaises((AttributeError, TypeError)):
             class T(Array):
                 _type_ = c_int
                 _length_ = 1.87
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,54 +8,52 @@
 class ArrayMeta(_CDataMeta):
     def __new__(self, name, cls, typedict):
         res = type.__new__(self, name, cls, typedict)
-        if '_type_' in typedict:
-            ffiarray = _rawffi.Array(typedict['_type_']._ffishape)
-            res._ffiarray = ffiarray
-            subletter = getattr(typedict['_type_'], '_type_', None)
-            if subletter == 'c':
-                def getvalue(self):
-                    return _rawffi.charp2string(self._buffer.buffer,
-                                                self._length_)
-                def setvalue(self, val):
-                    # we don't want to have buffers here
-                    if len(val) > self._length_:
-                        raise ValueError("%r too long" % (val,))
-                    for i in range(len(val)):
-                        self[i] = val[i]
-                    if len(val) < self._length_:
-                        self[len(val)] = b'\x00'
-                res.value = property(getvalue, setvalue)
+        if cls == (_CData,): # this is the Array class defined below
+            return res
 
-                def getraw(self):
-                    return _rawffi.charp2rawstring(self._buffer.buffer,
-                                                   self._length_)
+        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,
+                                            self._length_)
+            def setvalue(self, val):
+                # we don't want to have buffers here
+                if len(val) > self._length_:
+                    raise ValueError("%r too long" % (val,))
+                for i in range(len(val)):
+                    self[i] = val[i]
+                if len(val) < self._length_:
+                    self[len(val)] = b'\x00'
+            res.value = property(getvalue, setvalue)
 
-                def setraw(self, buffer):
-                    if len(buffer) > self._length_:
-                        raise ValueError("%r too long" % (buffer,))
-                    for i in range(len(buffer)):
-                        self[i] = buffer[i]
-                res.raw = property(getraw, setraw)
-            elif subletter == 'u':
-                def getvalue(self):
-                    return _rawffi.wcharp2unicode(self._buffer.buffer,
-                                                  self._length_)
+            def getraw(self):
+                return _rawffi.charp2rawstring(self._buffer.buffer,
+                                               self._length_)
 
-                def setvalue(self, val):
-                    # we don't want to have buffers here
-                    if len(val) > self._length_:
-                        raise ValueError("%r too long" % (val,))
-                    for i in range(len(val)):
-                        self[i] = val[i]
-                    if len(val) < self._length_:
-                        self[len(val)] = '\x00'
-                res.value = property(getvalue, setvalue)
-                
-            if '_length_' in typedict:
-                res._ffishape = (ffiarray, typedict['_length_'])
-                res._fficompositesize = res._sizeofinstances()
-        else:
-            res._ffiarray = None
+            def setraw(self, buffer):
+                if len(buffer) > self._length_:
+                    raise ValueError("%r too long" % (buffer,))
+                for i in range(len(buffer)):
+                    self[i] = buffer[i]
+            res.raw = property(getraw, setraw)
+        elif subletter == 'u':
+            def getvalue(self):
+                return _rawffi.wcharp2unicode(self._buffer.buffer,
+                                              self._length_)
+
+            def setvalue(self, val):
+                # we don't want to have buffers here
+                if len(val) > self._length_:
+                    raise ValueError("%r too long" % (val,))
+                for i in range(len(val)):
+                    self[i] = val[i]
+                if len(val) < self._length_:
+                    self[len(val)] = '\x00'
+            res.value = property(getvalue, setvalue)
+
+        res._ffishape = (ffiarray, res._length_)
+        res._fficompositesize = res._sizeofinstances()
         return res
 
     from_address = cdata_from_address
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to