Author: Armin Rigo <ar...@tunes.org> Branch: ffi-backend Changeset: r55772:385619021182 Date: 2012-06-23 12:13 +0200 http://bitbucket.org/pypy/pypy/changeset/385619021182/
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 @@ -104,6 +104,14 @@ w_value) keepalive_until_here(self) + def _add_or_sub(self, w_other, sign): + space = self.space + i = sign * space.getindex_w(w_other, space.w_OverflowError) + return self.ctype.add(self._cdata, i) + + def add(self, w_other): + 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) @@ -182,5 +190,6 @@ __hash__ = interp2app(W_CData.hash), __getitem__ = interp2app(W_CData.getitem), __setitem__ = interp2app(W_CData.setitem), + __add__ = interp2app(W_CData.add), ) W_CData.typedef.acceptable_as_base_class = False diff --git a/pypy/module/_ffi_backend/ctypeobj.py b/pypy/module/_ffi_backend/ctypeobj.py --- a/pypy/module/_ffi_backend/ctypeobj.py +++ b/pypy/module/_ffi_backend/ctypeobj.py @@ -57,6 +57,13 @@ def try_str(self, cdata): return None + def add(self, cdata, i): + xxx + space = self.space + raise operationerrfmt(space.w_TypeError, + "cannot add a cdata '%s' and a number", + self.name) + def insert_name(self, extra, extra_position): name = '%s%s%s' % (self.name[:self.name_position], extra, @@ -77,7 +84,11 @@ def __init__(self, space, ctitem): size = rffi.sizeof(rffi.VOIDP) - W_CTypePtrOrArray.__init__(self, space, size, ' *', 2, ctitem) + if isinstance(ctitem, W_CTypeArray): + extra = "(*)" # obscure case: see test_array_add + else: + extra = " *" + W_CTypePtrOrArray.__init__(self, space, size, extra, 2, ctitem) def cast(self, w_ob): space = self.space @@ -113,6 +124,14 @@ "cdata '%s' can only be indexed by 0", self.name) + def add(self, cdata, i): + ctitem = self.ctitem + if ctitem.size < 0: + xxx + "ctype '%s' points to items of unknown size" + p = rffi.ptradd(cdata, i * self.ctitem.size) + return cdataobj.W_CData(self.space, p, self) + class W_CTypeArray(W_CTypePtrOrArray): @@ -180,6 +199,13 @@ else: xxx + def convert_to_object(self, cdata): + return cdataobj.W_CData(self.space, cdata, self) + + def add(self, cdata, i): + p = rffi.ptradd(cdata, i * self.ctitem.size) + return cdataobj.W_CData(self.space, p, self.ctptr) + class W_CTypePrimitive(W_CType): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit