[pypy-svn] pypy jitypes2: implement getaddressindll and expose it at applevel
antocuni
commits-noreply at bitbucket.org
Mon Dec 20 18:58:31 CET 2010
Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: jitypes2
Changeset: r40150:eebf821bae16
Date: 2010-12-20 13:55 +0100
http://bitbucket.org/pypy/pypy/changeset/eebf821bae16/
Log: implement getaddressindll and expose it at applevel
diff --git a/pypy/module/_ffi/test/test__ffi.py b/pypy/module/_ffi/test/test__ffi.py
--- a/pypy/module/_ffi/test/test__ffi.py
+++ b/pypy/module/_ffi/test/test__ffi.py
@@ -77,7 +77,14 @@
libm = CDLL(self.libm_name)
pow = libm.getfunc('pow', [types.double, types.double], types.double)
assert pow.getaddr() == self.pow_addr
-
+
+ def test_getaddressindll(self):
+ import sys
+ from _ffi import CDLL, types
+ libm = CDLL(self.libm_name)
+ pow_addr = libm.getaddressindll('pow')
+ assert pow_addr == self.pow_addr & (sys.maxint*2-1)
+
def test_int_args(self):
"""
int sum_xy(int x, int y)
diff --git a/pypy/rlib/libffi.py b/pypy/rlib/libffi.py
--- a/pypy/rlib/libffi.py
+++ b/pypy/rlib/libffi.py
@@ -336,3 +336,6 @@
def getpointer(self, name, argtypes, restype, flags=FUNCFLAG_CDECL):
return Func(name, argtypes, restype, dlsym(self.lib, name),
flags=flags, keepalive=self)
+
+ def getaddressindll(self, name):
+ return dlsym(self.lib, name)
diff --git a/pypy/module/_ffi/interp_ffi.py b/pypy/module/_ffi/interp_ffi.py
--- a/pypy/module/_ffi/interp_ffi.py
+++ b/pypy/module/_ffi/interp_ffi.py
@@ -209,6 +209,16 @@
return W_FuncPtr(func)
+ @unwrap_spec('self', ObjSpace, str)
+ def getaddressindll(self, space, name):
+ try:
+ address_as_uint = rffi.cast(lltype.Unsigned,
+ self.cdll.getaddressindll(name))
+ except KeyError:
+ raise operationerrfmt(space.w_ValueError,
+ "No symbol %s found in library %s", name, self.name)
+ return space.wrap(address_as_uint)
+
@unwrap_spec(ObjSpace, W_Root, str)
def descr_new_cdll(space, w_type, name):
@@ -219,6 +229,7 @@
'CDLL',
__new__ = interp2app(descr_new_cdll),
getfunc = interp2app(W_CDLL.getfunc),
+ getaddressindll = interp2app(W_CDLL.getaddressindll),
)
# ========================================================================
More information about the Pypy-commit
mailing list