Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r56849:5d5dcafd00dd Date: 2012-08-25 16:16 +0200 http://bitbucket.org/pypy/pypy/changeset/5d5dcafd00dd/
Log: Patch by vpelletier: add @builtinify to all public _ctypes functions. Add a test. diff --git a/lib_pypy/_ctypes/__init__.py b/lib_pypy/_ctypes/__init__.py --- a/lib_pypy/_ctypes/__init__.py +++ b/lib_pypy/_ctypes/__init__.py @@ -19,6 +19,10 @@ from _rawffi import FormatError from _rawffi import check_HRESULT as _check_HRESULT + try: from __pypy__ import builtinify + except ImportError: builtinify = lambda f: f + + @builtinify def CopyComPointer(src, dst): from ctypes import c_void_p, cast if src: @@ -28,6 +32,8 @@ dst[0] = cast(src, c_void_p).value return 0 + del builtinify + LoadLibrary = dlopen from _rawffi import FUNCFLAG_STDCALL, FUNCFLAG_CDECL, FUNCFLAG_PYTHONAPI diff --git a/lib_pypy/_ctypes/basics.py b/lib_pypy/_ctypes/basics.py --- a/lib_pypy/_ctypes/basics.py +++ b/lib_pypy/_ctypes/basics.py @@ -3,6 +3,9 @@ import _ffi import sys +try: from __pypy__ import builtinify +except ImportError: builtinify = lambda f: f + keepalive_key = str # XXX fix this when provided with test def ensure_objects(where): @@ -145,6 +148,7 @@ _b_base_ = property(_get_b_base) _b_needsfree_ = False +@builtinify def sizeof(tp): if not isinstance(tp, _CDataMeta): if isinstance(tp, _CData): @@ -154,6 +158,7 @@ type(tp).__name__,)) return tp._sizeofinstances() +@builtinify def alignment(tp): if not isinstance(tp, _CDataMeta): if isinstance(tp, _CData): @@ -163,11 +168,13 @@ type(tp).__name__,)) return tp._alignmentofinstances() +@builtinify def byref(cdata): # "pointer" is imported at the end of this module to avoid circular # imports return pointer(cdata) +@builtinify def cdata_from_address(self, address): # fix the address: turn it into as unsigned, in case it's a negative number address = address & (sys.maxint * 2 + 1) @@ -176,6 +183,7 @@ instance._buffer = self._ffiarray.fromaddress(address, lgt) return instance +@builtinify def addressof(tp): return tp._buffer.buffer diff --git a/lib_pypy/_ctypes/dll.py b/lib_pypy/_ctypes/dll.py --- a/lib_pypy/_ctypes/dll.py +++ b/lib_pypy/_ctypes/dll.py @@ -1,5 +1,9 @@ import _rawffi +try: from __pypy__ import builtinify +except ImportError: builtinify = lambda f: f + +@builtinify def dlopen(name, mode): # XXX mode is ignored return _rawffi.CDLL(name) diff --git a/lib_pypy/_ctypes/function.py b/lib_pypy/_ctypes/function.py --- a/lib_pypy/_ctypes/function.py +++ b/lib_pypy/_ctypes/function.py @@ -10,6 +10,8 @@ import traceback import warnings +try: from __pypy__ import builtinify +except ImportError: builtinify = lambda f: f # XXX this file needs huge refactoring I fear @@ -34,6 +36,7 @@ from _ctypes import COMError return COMError(errcode, None, None) +@builtinify def call_function(func, args): "Only for debugging so far: So that we can call CFunction instances" funcptr = CFuncPtr(func) diff --git a/lib_pypy/_ctypes/pointer.py b/lib_pypy/_ctypes/pointer.py --- a/lib_pypy/_ctypes/pointer.py +++ b/lib_pypy/_ctypes/pointer.py @@ -7,6 +7,9 @@ from _ctypes.array import Array, array_get_slice_params, array_slice_getitem,\ array_slice_setitem +try: from __pypy__ import builtinify +except ImportError: builtinify = lambda f: f + # This cache maps types to pointers to them. _pointer_type_cache = {} @@ -154,6 +157,7 @@ return result +@builtinify def POINTER(cls): try: return _pointer_type_cache[cls] @@ -173,6 +177,7 @@ _pointer_type_cache[cls] = klass return klass +@builtinify def pointer(inst): return POINTER(type(inst))(inst) diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_pointers.py b/pypy/module/test_lib_pypy/ctypes_tests/test_pointers.py --- a/pypy/module/test_lib_pypy/ctypes_tests/test_pointers.py +++ b/pypy/module/test_lib_pypy/ctypes_tests/test_pointers.py @@ -253,3 +253,8 @@ TwoOutArgs(a, byref(b), c, byref(d)) assert b.value == 7 assert d.value == 11 + + def test_byref_cannot_be_bound(self): + class A(object): + _byref = byref + A._byref(c_int(5)) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit