Author: Armin Rigo <ar...@tunes.org> Branch: ffi-backend Changeset: r55728:65b4096c3fd3 Date: 2012-06-19 22:06 +0200 http://bitbucket.org/pypy/pypy/changeset/65b4096c3fd3/
Log: Start on sizeof(). 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,4 +12,5 @@ 'new_primitive_type': 'newtype.new_primitive_type', 'cast': 'func.cast', + 'sizeof': 'func.sizeof', } 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 @@ -75,3 +75,7 @@ __repr__ = interp2app(W_CType.repr), ) W_CType.acceptable_as_base_class = False + + +def check_ctype(space, w_obj): + return space.is_w(space.type(w_obj), space.gettypefor(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 @@ -3,11 +3,30 @@ from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.rpython.lltypesystem import lltype, rffi -from pypy.module._ffi_backend.ctypeobj import W_CType +from pypy.module._ffi_backend import ctypeobj, cdataobj # ____________________________________________________________ -@unwrap_spec(ctype=W_CType) +@unwrap_spec(ctype=ctypeobj.W_CType) def cast(space, ctype, w_ob): return ctype.cast(w_ob) + +# ____________________________________________________________ + +def sizeof(space, w_obj): + if cdataobj.check_cdata(space, w_obj): + # xxx CT_ARRAY + w_cdata = space.interp_w(cdataobj.W_CData, w_obj) + size = w_cdata.ctype.size + elif ctypeobj.check_ctype(space, w_obj): + w_ctype = space.interp_w(ctypeobj.W_CType, w_obj) + size = w_ctype.size + if size < 0: + raise operationerrfmt(space.w_ValueError, + "ctype '%s' is of unknown size", + w_ctype.name) + else: + raise OperationError(space.w_TypeError, + space.wrap("expected a 'cdata' or 'ctype' object")) + return space.wrap(size) diff --git a/pypy/module/_ffi_backend/test/test_c.py b/pypy/module/_ffi_backend/test/test_c.py --- a/pypy/module/_ffi_backend/test/test_c.py +++ b/pypy/module/_ffi_backend/test/test_c.py @@ -63,9 +63,9 @@ assert (x != self.b.cast(q, -66)) is True def test_sizeof_type(self): - py.test.raises(TypeError, sizeof, 42.5) - p = new_primitive_type("short") - assert sizeof(p) == 2 + raises(TypeError, self.b.sizeof, 42.5) + p = self.b.new_primitive_type("short") + assert self.b.sizeof(p) == 2 def test_integer_types(self): for name in ['signed char', 'short', 'int', 'long', 'long long']: _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit