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