[pypy-commit] pypy ffi-backend: Next test.

arigo noreply at buildbot.pypy.org
Sat Jun 23 12:36:10 CEST 2012


Author: Armin Rigo <arigo at 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):
 


More information about the pypy-commit mailing list