[pypy-commit] pypy ffi-backend: Next test
arigo
noreply at buildbot.pypy.org
Sat Jun 23 12:36:11 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: ffi-backend
Changeset: r55773:441a98f9da1e
Date: 2012-06-23 12:35 +0200
http://bitbucket.org/pypy/pypy/changeset/441a98f9da1e/
Log: Next test
diff --git a/pypy/module/_ffi_backend/cdataobj.py b/pypy/module/_ffi_backend/cdataobj.py
--- a/pypy/module/_ffi_backend/cdataobj.py
+++ b/pypy/module/_ffi_backend/cdataobj.py
@@ -112,6 +112,28 @@
def add(self, w_other):
return self._add_or_sub(w_other, +1)
+ def sub(self, w_other):
+ space = self.space
+ ob = space.interpclass_w(w_other)
+ if isinstance(ob, W_CData):
+ from pypy.module._ffi_backend import ctypeobj
+ ct = ob.ctype
+ if isinstance(ct, ctypeobj.W_CTypeArray):
+ ct = ct.ctptr
+ #
+ if (ct is not self.ctype or
+ not isinstance(ct, ctypeobj.W_CTypePointer) or
+ ct.ctitem.size <= 0):
+ raise operationerrfmt(space.w_TypeError,
+ "cannot subtract cdata '%s' and cdata '%s'",
+ self.ctype.name, ct.name)
+ #
+ diff = (rffi.cast(lltype.Signed, self._cdata) -
+ rffi.cast(lltype.Signed, ob._cdata)) // ct.ctitem.size
+ return space.wrap(diff)
+ #
+ return self._add_or_sub(w_other, -1)
+
## def read_raw_signed_data(self):
## result = misc.read_raw_signed_data(self._cdata, self.ctype.size)
## keepalive_until_here(self)
@@ -191,5 +213,6 @@
__getitem__ = interp2app(W_CData.getitem),
__setitem__ = interp2app(W_CData.setitem),
__add__ = interp2app(W_CData.add),
+ __sub__ = interp2app(W_CData.sub),
)
W_CData.typedef.acceptable_as_base_class = False
diff --git a/pypy/module/_ffi_backend/test/_backend_test_c.py b/pypy/module/_ffi_backend/test/_backend_test_c.py
--- a/pypy/module/_ffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_ffi_backend/test/_backend_test_c.py
@@ -343,6 +343,22 @@
assert type(a[0][0]) is int
assert type((a[0] + 0)[0]) is int
+def test_array_sub():
+ BInt = new_primitive_type("int")
+ BArray = new_array_type(new_pointer_type(BInt), 5) # int[5]
+ a = newp(BArray, None)
+ p = a + 1
+ assert p - a == 1
+ assert p - (a+0) == 1
+ assert a == (p - 1)
+ BPtr = new_pointer_type(new_primitive_type("short"))
+ q = newp(BPtr, None)
+ py.test.raises(TypeError, "p - q")
+ py.test.raises(TypeError, "q - p")
+ py.test.raises(TypeError, "a - q")
+ e = py.test.raises(TypeError, "q - a")
+ assert str(e.value) == "cannot subtract cdata 'short *' and cdata 'int *'"
+
def test_cast_primitive_from_cdata():
p = new_primitive_type("int")
n = cast(p, cast(p, -42))
More information about the pypy-commit
mailing list