[pypy-commit] pypy ffi-backend: Void type.

arigo noreply at buildbot.pypy.org
Mon Jun 25 18:19:49 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: ffi-backend
Changeset: r55819:cdc09d58bf7a
Date: 2012-06-25 17:26 +0200
http://bitbucket.org/pypy/pypy/changeset/cdc09d58bf7a/

Log:	Void type.

diff --git a/pypy/module/_ffi_backend/__init__.py b/pypy/module/_ffi_backend/__init__.py
--- a/pypy/module/_ffi_backend/__init__.py
+++ b/pypy/module/_ffi_backend/__init__.py
@@ -15,6 +15,7 @@
         'new_struct_type': 'newtype.new_struct_type',
         'new_union_type': 'newtype.new_union_type',
         'complete_struct_or_union': 'newtype.complete_struct_or_union',
+        'new_void_type': 'newtype.new_void_type',
 
         'newp': 'func.newp',
         'cast': 'func.cast',
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
@@ -93,7 +93,10 @@
         return align
 
     def _alignof(self):
-        xxx
+        space = self.space
+        raise operationerrfmt(space.w_TypeError,
+                              "ctype '%s' is of unknown alignment",
+                              self.name)
 
     def offsetof(self, fieldname):
         space = self.space
@@ -147,7 +150,9 @@
         ctitem = self.ctitem
         datasize = ctitem.size
         if datasize < 0:
-            xxx
+            raise operationerrfmt(space.w_TypeError,
+                "cannot instantiate ctype '%s' of unknown size",
+                                  self.name)
         if isinstance(ctitem, W_CTypePrimitiveChar):
             datasize *= 2       # forcefully add a null character
         cdata = cdataobj.W_CDataOwn(space, datasize, self)
@@ -164,12 +169,14 @@
                                   self.name)
 
     def add(self, cdata, i):
+        space = self.space
         ctitem = self.ctitem
         if ctitem.size < 0:
-            xxx
-            "ctype '%s' points to items of unknown size"
+            raise operationerrfmt(space.w_TypeError,
+                                  "ctype '%s' points to items of unknown size",
+                                  self.name)
         p = rffi.ptradd(cdata, i * self.ctitem.size)
-        return cdataobj.W_CData(self.space, p, self)
+        return cdataobj.W_CData(space, p, self)
 
     def _alignof(self):
         from pypy.module._ffi_backend import newtype
@@ -541,6 +548,12 @@
         xxx
 
 
+class W_CTypeVoid(W_CType):
+
+    def __init__(self, space):
+        W_CType.__init__(self, space, -1, "void", len("void"))
+
+
 class W_CField(Wrappable):
     _immutable_ = True
     def __init__(self, ctype, offset, bitshift, bitsize):
diff --git a/pypy/module/_ffi_backend/newtype.py b/pypy/module/_ffi_backend/newtype.py
--- a/pypy/module/_ffi_backend/newtype.py
+++ b/pypy/module/_ffi_backend/newtype.py
@@ -179,3 +179,9 @@
     ctype.alignment = totalalignment
     ctype.fields_list = fields_list
     ctype.fields_dict = fields_dict
+
+# ____________________________________________________________
+
+def new_void_type(space):
+    ctype = ctypeobj.W_CTypeVoid(space)
+    return ctype


More information about the pypy-commit mailing list