Author: Armin Rigo <ar...@tunes.org>
Branch: ffi-backend
Changeset: r55751:906bdd8dc432
Date: 2012-06-21 18:22 +0200
http://bitbucket.org/pypy/pypy/changeset/906bdd8dc432/

Log:    Start to implement newp.

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
@@ -12,6 +12,7 @@
         'new_primitive_type': 'newtype.new_primitive_type',
         'new_pointer_type': 'newtype.new_pointer_type',
 
+        'newp': 'func.newp',
         'cast': 'func.cast',
         'sizeof': 'func.sizeof',
         }
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
@@ -22,7 +22,11 @@
         self.ctype = ctype
 
     def repr(self):
-        return self.space.wrap("<cdata '%s'>" % self.ctype.name)
+        extra = self.extra_repr()
+        return self.space.wrap("<cdata '%s'%s>" % (self.ctype.name, extra))
+
+    def extra_repr(self):
+        return ''
 
     def nonzero(self):
         return self.space.wrap(bool(self.cdata))
@@ -78,10 +82,10 @@
         return w_obj
 
 
-class W_CDataOwn(W_CData):
+class W_CDataOwnFromCasted(W_CData):
 
     def __init__(self, space, size, ctype):
-        cdata = lltype.malloc(rffi.CCHARP.TO, size, flavor='raw')
+        cdata = lltype.malloc(rffi.CCHARP.TO, size, flavor='raw', zero=True)
         W_CData.__init__(self, space, cdata, ctype)
 
     @rgc.must_be_light_finalizer
@@ -89,6 +93,13 @@
         lltype.free(self.cdata, flavor='raw')
 
 
+class W_CDataOwn(W_CDataOwnFromCasted):
+
+    def extra_repr(self):
+        return ' owning %d bytes' % (self.ctype.size,)
+
+
+
 W_CData.typedef = TypeDef(
     '_ffi_backend.CData',
     __repr__ = interp2app(W_CData.repr),
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
@@ -23,6 +23,11 @@
         space = self.space
         return space.wrap("<ctype '%s'>" % (self.name,))
 
+    def newp(self, w_init):
+        space = self.space
+        raise OperationError(space.w_TypeError,
+                             space.wrap("expected a pointer or array ctype"))
+
     def cast(self, w_ob):
         raise NotImplementedError
 
@@ -51,7 +56,22 @@
 
 
 class W_CTypePointer(W_CType):
-    pass
+
+    def __init__(self, space, ctypeitem):
+        name, name_position = ctypeitem.insert_name(' *', 2)
+        size = rffi.sizeof(rffi.VOIDP)
+        W_CType.__init__(self, space, size, name, name_position)
+        self.ctypeitem = ctypeitem
+
+    def newp(self, w_init):
+        space = self.space
+        citem = self.ctypeitem
+        if citem.size < 0:
+            xxx
+        if isinstance(citem, W_CTypePrimitiveChar):
+            xxx
+        w_cdata = cdataobj.W_CDataOwn(space, citem.size, self)
+        return w_cdata
 
 
 class W_CTypePrimitive(W_CType):
diff --git a/pypy/module/_ffi_backend/func.py b/pypy/module/_ffi_backend/func.py
--- a/pypy/module/_ffi_backend/func.py
+++ b/pypy/module/_ffi_backend/func.py
@@ -9,6 +9,12 @@
 # ____________________________________________________________
 
 @unwrap_spec(ctype=ctypeobj.W_CType)
+def newp(space, ctype, w_init):
+    return ctype.newp(w_init)
+
+# ____________________________________________________________
+
+@unwrap_spec(ctype=ctypeobj.W_CType)
 def cast(space, ctype, w_ob):
     return ctype.cast(w_ob)
 
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
@@ -40,7 +40,5 @@
 
 @unwrap_spec(ctype=ctypeobj.W_CType)
 def new_pointer_type(space, ctype):
-    name, name_position = ctype.insert_name(' *', 2)
-    size = rffi.sizeof(rffi.VOIDP)
-    ctype = ctypeobj.W_CTypePointer(space, size, name, name_position)
-    return ctype
+    ctypeptr = ctypeobj.W_CTypePointer(space, ctype)
+    return ctypeptr
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to