Author: Armin Rigo <ar...@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)) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit