[pypy-commit] pypy default: update to cffi/a211e3ed8ba7
arigo
noreply at buildbot.pypy.org
Sun Jan 11 22:52:40 CET 2015
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r75298:6aab59162052
Date: 2015-01-11 22:51 +0100
http://bitbucket.org/pypy/pypy/changeset/6aab59162052/
Log: update to cffi/a211e3ed8ba7
diff --git a/pypy/module/_cffi_backend/ctypearray.py b/pypy/module/_cffi_backend/ctypearray.py
--- a/pypy/module/_cffi_backend/ctypearray.py
+++ b/pypy/module/_cffi_backend/ctypearray.py
@@ -107,6 +107,9 @@
return self.space.w_None
return W_CTypePtrOrArray._fget(self, attrchar)
+ def typeoffsetof_index(self, index):
+ return self.ctptr.typeoffsetof_index(index)
+
class W_CDataIter(W_Root):
_immutable_fields_ = ['ctitem', 'cdata', '_stop'] # but not '_next'
diff --git a/pypy/module/_cffi_backend/ctypeobj.py b/pypy/module/_cffi_backend/ctypeobj.py
--- a/pypy/module/_cffi_backend/ctypeobj.py
+++ b/pypy/module/_cffi_backend/ctypeobj.py
@@ -142,12 +142,14 @@
raise oefmt(space.w_ValueError, "ctype '%s' is of unknown alignment",
self.name)
- def typeoffsetof(self, fieldname):
+ def typeoffsetof_field(self, fieldname, following):
space = self.space
- if fieldname is None:
- msg = "expected a struct or union ctype"
- else:
- msg = "expected a struct or union ctype, or a pointer to one"
+ msg = "with a field name argument, expected a struct or union ctype"
+ raise OperationError(space.w_TypeError, space.wrap(msg))
+
+ def typeoffsetof_index(self, index):
+ space = self.space
+ msg = "with an integer argument, expected an array or pointer ctype"
raise OperationError(space.w_TypeError, space.wrap(msg))
def rawaddressof(self, cdata, offset):
diff --git a/pypy/module/_cffi_backend/ctypeptr.py b/pypy/module/_cffi_backend/ctypeptr.py
--- a/pypy/module/_cffi_backend/ctypeptr.py
+++ b/pypy/module/_cffi_backend/ctypeptr.py
@@ -308,24 +308,36 @@
def getcfield(self, attr):
return self.ctitem.getcfield(attr)
- def typeoffsetof(self, fieldname):
- if fieldname is None:
- return W_CTypePtrBase.typeoffsetof(self, fieldname)
- else:
- return self.ctitem.typeoffsetof(fieldname)
+ def typeoffsetof_field(self, fieldname, following):
+ if following == 0:
+ return self.ctitem.typeoffsetof_field(fieldname, -1)
+ return W_CTypePtrBase.typeoffsetof_field(self, fieldname, following)
+
+ def typeoffsetof_index(self, index):
+ space = self.space
+ ctitem = self.ctitem
+ if ctitem.size < 0:
+ raise OperationError(space.w_TypeError,
+ space.wrap("pointer to opaque"))
+ try:
+ offset = ovfcheck(index * ctitem.size)
+ except OverflowError:
+ raise OperationError(space.w_OverflowError,
+ space.wrap("array offset would overflow a ssize_t"))
+ return ctitem, offset
def rawaddressof(self, cdata, offset):
from pypy.module._cffi_backend.ctypestruct import W_CTypeStructOrUnion
space = self.space
ctype2 = cdata.ctype
if (isinstance(ctype2, W_CTypeStructOrUnion) or
- (isinstance(ctype2, W_CTypePtrOrArray) and
- isinstance(ctype2.ctitem, W_CTypeStructOrUnion))):
+ isinstance(ctype2, W_CTypePtrOrArray)):
ptrdata = rffi.ptradd(cdata._cdata, offset)
return cdataobj.W_CData(space, ptrdata, self)
else:
raise OperationError(space.w_TypeError,
- space.wrap("expected a 'cdata struct-or-union' object"))
+ space.wrap("expected a cdata struct/union/array/pointer"
+ " object"))
def _fget(self, attrchar):
if attrchar == 'i': # item
diff --git a/pypy/module/_cffi_backend/ctypestruct.py b/pypy/module/_cffi_backend/ctypestruct.py
--- a/pypy/module/_cffi_backend/ctypestruct.py
+++ b/pypy/module/_cffi_backend/ctypestruct.py
@@ -65,9 +65,7 @@
keepalive_until_here(ob)
return ob
- def typeoffsetof(self, fieldname):
- if fieldname is None:
- return (self, 0)
+ def typeoffsetof_field(self, fieldname, following):
self.check_complete()
space = self.space
try:
diff --git a/pypy/module/_cffi_backend/func.py b/pypy/module/_cffi_backend/func.py
--- a/pypy/module/_cffi_backend/func.py
+++ b/pypy/module/_cffi_backend/func.py
@@ -48,13 +48,22 @@
align = w_ctype.alignof()
return space.wrap(align)
- at unwrap_spec(w_ctype=ctypeobj.W_CType, fieldname="str_or_None")
-def typeoffsetof(space, w_ctype, fieldname):
- ctype, offset = w_ctype.typeoffsetof(fieldname)
+ at unwrap_spec(w_ctype=ctypeobj.W_CType, following=int)
+def typeoffsetof(space, w_ctype, w_field_or_index, following=0):
+ try:
+ fieldname = space.str_w(w_field_or_index)
+ except OperationError, e:
+ if not e.match(space, space.w_TypeError):
+ raise
+ index = space.int_w(w_field_or_index)
+ ctype, offset = w_ctype.typeoffsetof_index(index)
+ else:
+ ctype, offset = w_ctype.typeoffsetof_field(fieldname, following)
+ #
return space.newtuple([space.wrap(ctype), space.wrap(offset)])
@unwrap_spec(w_ctype=ctypeobj.W_CType, w_cdata=cdataobj.W_CData, offset=int)
-def rawaddressof(space, w_ctype, w_cdata, offset=0):
+def rawaddressof(space, w_ctype, w_cdata, offset):
return w_ctype.rawaddressof(w_cdata, offset)
# ____________________________________________________________
diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py b/pypy/module/_cffi_backend/test/_backend_test_c.py
--- a/pypy/module/_cffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_cffi_backend/test/_backend_test_c.py
@@ -2527,13 +2527,32 @@
('a2', BChar, -1),
('a3', BChar, -1)])
py.test.raises(TypeError, typeoffsetof, BStructPtr, None)
- assert typeoffsetof(BStruct, None) == (BStruct, 0)
+ py.test.raises(TypeError, typeoffsetof, BStruct, None)
assert typeoffsetof(BStructPtr, 'a1') == (BChar, 0)
assert typeoffsetof(BStruct, 'a1') == (BChar, 0)
assert typeoffsetof(BStructPtr, 'a2') == (BChar, 1)
assert typeoffsetof(BStruct, 'a3') == (BChar, 2)
+ assert typeoffsetof(BStructPtr, 'a2', 0) == (BChar, 1)
+ assert typeoffsetof(BStruct, u+'a3') == (BChar, 2)
+ py.test.raises(TypeError, typeoffsetof, BStructPtr, 'a2', 1)
py.test.raises(KeyError, typeoffsetof, BStructPtr, 'a4')
py.test.raises(KeyError, typeoffsetof, BStruct, 'a5')
+ py.test.raises(TypeError, typeoffsetof, BStruct, 42)
+ py.test.raises(TypeError, typeoffsetof, BChar, 'a1')
+
+def test_typeoffsetof_array():
+ BInt = new_primitive_type("int")
+ BIntP = new_pointer_type(BInt)
+ BArray = new_array_type(BIntP, None)
+ py.test.raises(TypeError, typeoffsetof, BArray, None)
+ py.test.raises(TypeError, typeoffsetof, BArray, 'a1')
+ assert typeoffsetof(BArray, 51) == (BInt, 51 * size_of_int())
+ assert typeoffsetof(BIntP, 51) == (BInt, 51 * size_of_int())
+ assert typeoffsetof(BArray, -51) == (BInt, -51 * size_of_int())
+ MAX = sys.maxsize // size_of_int()
+ assert typeoffsetof(BArray, MAX) == (BInt, MAX * size_of_int())
+ assert typeoffsetof(BIntP, MAX) == (BInt, MAX * size_of_int())
+ py.test.raises(OverflowError, typeoffsetof, BArray, MAX + 1)
def test_typeoffsetof_no_bitfield():
BInt = new_primitive_type("int")
@@ -2553,17 +2572,26 @@
assert repr(p) == "<cdata 'struct foo *' owning 3 bytes>"
s = p[0]
assert repr(s) == "<cdata 'struct foo' owning 3 bytes>"
- a = rawaddressof(BStructPtr, s)
+ a = rawaddressof(BStructPtr, s, 0)
assert repr(a).startswith("<cdata 'struct foo *' 0x")
- py.test.raises(TypeError, rawaddressof, BStruct, s)
- b = rawaddressof(BCharP, s)
+ py.test.raises(TypeError, rawaddressof, BStruct, s, 0)
+ b = rawaddressof(BCharP, s, 0)
assert b == cast(BCharP, p)
- c = rawaddressof(BStructPtr, a)
+ c = rawaddressof(BStructPtr, a, 0)
assert c == a
- py.test.raises(TypeError, rawaddressof, BStructPtr, cast(BChar, '?'))
+ py.test.raises(TypeError, rawaddressof, BStructPtr, cast(BChar, '?'), 0)
#
d = rawaddressof(BCharP, s, 1)
assert d == cast(BCharP, p) + 1
+ #
+ e = cast(BCharP, 109238)
+ f = rawaddressof(BCharP, e, 42)
+ assert f == e + 42
+ #
+ BCharA = new_array_type(BCharP, None)
+ e = newp(BCharA, 50)
+ f = rawaddressof(BCharP, e, 42)
+ assert f == e + 42
def test_newp_signed_unsigned_char():
BCharArray = new_array_type(
More information about the pypy-commit
mailing list