[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