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