Author: Armin Rigo <armin.r...@gmail.com> Branch: Changeset: r85090:38b72e0e5401 Date: 2016-06-11 08:47 +0200 http://bitbucket.org/pypy/pypy/changeset/38b72e0e5401/
Log: Merged in habnabit/pypy (pull request #455) Add sys.{get,set}dlopenflags. diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py --- a/pypy/module/cpyext/api.py +++ b/pypy/module/cpyext/api.py @@ -1512,7 +1512,7 @@ try: ll_libname = rffi.str2charp(path) try: - dll = rdynload.dlopen(ll_libname) + dll = rdynload.dlopen(ll_libname, space.sys.dlopenflags) finally: lltype.free(ll_libname, flavor='raw') except rdynload.DLOpenError as e: diff --git a/pypy/module/sys/__init__.py b/pypy/module/sys/__init__.py --- a/pypy/module/sys/__init__.py +++ b/pypy/module/sys/__init__.py @@ -1,6 +1,7 @@ from pypy.interpreter.mixedmodule import MixedModule from pypy.interpreter.error import OperationError from rpython.rlib.objectmodel import we_are_translated +from rpython.rlib import rdynload import sys _WIN = sys.platform == 'win32' @@ -19,6 +20,7 @@ self.defaultencoding = "ascii" self.filesystemencoding = None self.debug = True + self.dlopenflags = rdynload._dlopen_default_mode() interpleveldefs = { '__name__' : '(space.wrap("sys"))', @@ -85,7 +87,9 @@ 'float_info' : 'system.get_float_info(space)', 'long_info' : 'system.get_long_info(space)', - 'float_repr_style' : 'system.get_float_repr_style(space)' + 'float_repr_style' : 'system.get_float_repr_style(space)', + 'getdlopenflags' : 'system.getdlopenflags', + 'setdlopenflags' : 'system.setdlopenflags', } if sys.platform == 'win32': diff --git a/pypy/module/sys/system.py b/pypy/module/sys/system.py --- a/pypy/module/sys/system.py +++ b/pypy/module/sys/system.py @@ -58,3 +58,9 @@ def get_float_repr_style(space): return space.wrap("short") + +def getdlopenflags(space): + return space.wrap(space.sys.dlopenflags) + +def setdlopenflags(space, w_flags): + space.sys.dlopenflags = space.int_w(w_flags) diff --git a/pypy/module/sys/test/test_sysmodule.py b/pypy/module/sys/test/test_sysmodule.py --- a/pypy/module/sys/test/test_sysmodule.py +++ b/pypy/module/sys/test/test_sysmodule.py @@ -445,14 +445,12 @@ def test_dlopenflags(self): import sys - if hasattr(sys, "setdlopenflags"): - assert hasattr(sys, "getdlopenflags") - raises(TypeError, sys.getdlopenflags, 42) - oldflags = sys.getdlopenflags() - raises(TypeError, sys.setdlopenflags) - sys.setdlopenflags(oldflags+1) - assert sys.getdlopenflags() == oldflags+1 - sys.setdlopenflags(oldflags) + raises(TypeError, sys.getdlopenflags, 42) + oldflags = sys.getdlopenflags() + raises(TypeError, sys.setdlopenflags) + sys.setdlopenflags(oldflags+1) + assert sys.getdlopenflags() == oldflags+1 + sys.setdlopenflags(oldflags) def test_refcount(self): import sys @@ -610,7 +608,7 @@ class AppTestSysSettracePortedFromCpython(object): def test_sys_settrace(self): import sys - + class Tracer: def __init__(self): self.events = [] diff --git a/rpython/rlib/rdynload.py b/rpython/rlib/rdynload.py --- a/rpython/rlib/rdynload.py +++ b/rpython/rlib/rdynload.py @@ -26,7 +26,7 @@ if _MAC_OS: pre_include_bits = ['#define MACOSX'] -else: +else: pre_include_bits = [] if _FREEBSD or _NETBSD or _WIN32: @@ -145,15 +145,20 @@ else: return lltype.nullptr(rffi.VOIDP.TO) + def _dlopen_default_mode(): + """ The default dlopen mode if it hasn't been changed by the user. + """ + mode = RTLD_NOW + if RTLD_LOCAL is not None: + mode |= RTLD_LOCAL + return mode + def dlopen(name, mode=-1): """ Wrapper around C-level dlopen """ if mode == -1: - if RTLD_LOCAL is not None: - mode = RTLD_LOCAL - else: - mode = 0 - if (mode & (RTLD_LAZY | RTLD_NOW)) == 0: + mode = _dlopen_default_mode() + elif (mode & (RTLD_LAZY | RTLD_NOW)) == 0: mode |= RTLD_NOW res = c_dlopen(name, rffi.cast(rffi.INT, mode)) if not res: @@ -193,6 +198,11 @@ DLLHANDLE = rwin32.HMODULE RTLD_GLOBAL = None + def _dlopen_default_mode(): + """ The default dlopen mode if it hasn't been changed by the user. + """ + return 0 + def dlopen(name, mode=-1): # mode is unused on windows, but a consistant signature res = rwin32.LoadLibrary(name) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit