Author: Armin Rigo <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit