[pypy-commit] pypy ffi-backend: load_function().

arigo noreply at buildbot.pypy.org
Wed Jul 4 08:29:27 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: ffi-backend
Changeset: r55919:6da597c57c43
Date: 2012-07-04 08:28 +0200
http://bitbucket.org/pypy/pypy/changeset/6da597c57c43/

Log:	load_function().

diff --git a/pypy/module/_cffi_backend/libraryobj.py b/pypy/module/_cffi_backend/libraryobj.py
--- a/pypy/module/_cffi_backend/libraryobj.py
+++ b/pypy/module/_cffi_backend/libraryobj.py
@@ -4,7 +4,10 @@
 from pypy.interpreter.gateway import interp2app, unwrap_spec
 from pypy.interpreter.typedef import TypeDef
 from pypy.rpython.lltypesystem import lltype, rffi
-from pypy.rlib.rdynload import DLLHANDLE, dlopen, dlclose, DLOpenError
+from pypy.rlib.rdynload import DLLHANDLE, dlopen, dlsym, dlclose, DLOpenError
+
+from pypy.module._cffi_backend.cdataobj import W_CData
+from pypy.module._cffi_backend.ctypefunc import W_CTypeFunc
 
 
 class W_Library(Wrappable):
@@ -31,10 +34,21 @@
         space = self.space
         return space.wrap("<clibrary '%s'>" % self.name)
 
+    @unwrap_spec(ctypefunc=W_CTypeFunc, name=str)
+    def load_function(self, ctypefunc, name):
+        space = self.space
+        cdata = dlsym(self.handle, name)
+        if not cdata:
+            raise operationerrfmt(space.w_KeyError,
+                                  "function '%s' not found in library '%s'",
+                                  name, self.name)
+        return W_CData(space, rffi.cast(rffi.CCHARP, cdata), ctypefunc)
+
 
 W_Library.typedef = TypeDef(
     '_cffi_backend.Library',
     __repr__ = interp2app(W_Library.repr),
+    load_function = interp2app(W_Library.load_function),
     )
 W_Library.acceptable_as_base_class = False
 


More information about the pypy-commit mailing list