[pypy-commit] pypy default: Update to cffi/0c8581ea7507:
arigo
noreply at buildbot.pypy.org
Mon Sep 24 21:09:15 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r57515:77a1f83acc8e
Date: 2012-09-24 21:09 +0200
http://bitbucket.org/pypy/pypy/changeset/77a1f83acc8e/
Log: Update to cffi/0c8581ea7507:
Change the default dlopen() flags from RTLD_LAZY to RTLD_NOW. Give
access to all flags, for more precise control.
diff --git a/pypy/module/_cffi_backend/__init__.py b/pypy/module/_cffi_backend/__init__.py
--- a/pypy/module/_cffi_backend/__init__.py
+++ b/pypy/module/_cffi_backend/__init__.py
@@ -1,4 +1,6 @@
from pypy.interpreter.mixedmodule import MixedModule
+from pypy.rlib import rdynload
+
class Module(MixedModule):
@@ -42,3 +44,12 @@
'FFI_DEFAULT_ABI': 'ctypefunc._get_abi(space, "FFI_DEFAULT_ABI")',
'FFI_CDECL': 'ctypefunc._get_abi(space,"FFI_DEFAULT_ABI")',#win32 name
}
+
+for _name in ["RTLD_LAZY", "RTLD_NOW", "RTLD_GLOBAL", "RTLD_LOCAL",
+ "RTLD_NODELETE", "RTLD_NOLOAD", "RTLD_DEEPBIND"]:
+ if getattr(rdynload.cConfig, _name) is not None:
+ Module.interpleveldefs[_name] = 'space.wrap(%d)' % (
+ getattr(rdynload.cConfig, _name),)
+
+for _name in ["RTLD_LAZY", "RTLD_NOW", "RTLD_GLOBAL", "RTLD_LOCAL"]:
+ Module.interpleveldefs.setdefault(_name, 'space.wrap(0)')
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
@@ -5,7 +5,6 @@
from pypy.interpreter.typedef import TypeDef
from pypy.rpython.lltypesystem import lltype, rffi
from pypy.rlib.rdynload import DLLHANDLE, dlopen, dlsym, dlclose, DLOpenError
-from pypy.rlib.rdynload import RTLD_GLOBAL
from pypy.module._cffi_backend.cdataobj import W_CData
from pypy.module._cffi_backend.ctypeobj import W_CType
@@ -15,17 +14,13 @@
_immutable_ = True
handle = rffi.cast(DLLHANDLE, 0)
- def __init__(self, space, filename, is_global):
+ def __init__(self, space, filename, flags):
self.space = space
- if is_global and RTLD_GLOBAL is not None:
- mode = RTLD_GLOBAL
- else:
- mode = -1 # default value, corresponds to RTLD_LOCAL
with rffi.scoped_str2charp(filename) as ll_libname:
if filename is None:
filename = "<None>"
try:
- self.handle = dlopen(ll_libname, mode)
+ self.handle = dlopen(ll_libname, flags)
except DLOpenError, e:
raise operationerrfmt(space.w_OSError,
"cannot load library %s: %s",
@@ -100,7 +95,7 @@
W_Library.acceptable_as_base_class = False
- at unwrap_spec(filename="str_or_None", is_global=int)
-def load_library(space, filename, is_global=0):
- lib = W_Library(space, filename, is_global)
+ at unwrap_spec(filename="str_or_None", flags=int)
+def load_library(space, filename, flags=0):
+ lib = W_Library(space, filename, flags)
return space.wrap(lib)
diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py b/pypy/module/_cffi_backend/test/_backend_test_c.py
--- a/pypy/module/_cffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_cffi_backend/test/_backend_test_c.py
@@ -42,19 +42,34 @@
return sizeof(BPtr)
-def find_and_load_library(name, is_global=0):
+def find_and_load_library(name, flags=RTLD_NOW):
import ctypes.util
if name is None:
path = None
else:
path = ctypes.util.find_library(name)
- return load_library(path, is_global)
+ return load_library(path, flags)
def test_load_library():
x = find_and_load_library('c')
assert repr(x).startswith("<clibrary '")
- x = find_and_load_library('c', 1)
+ x = find_and_load_library('c', RTLD_NOW | RTLD_GLOBAL)
assert repr(x).startswith("<clibrary '")
+ x = find_and_load_library('c', RTLD_LAZY)
+ assert repr(x).startswith("<clibrary '")
+
+def test_all_rtld_symbols():
+ import sys
+ FFI_DEFAULT_ABI # these symbols must be defined
+ FFI_CDECL
+ RTLD_LAZY
+ RTLD_NOW
+ RTLD_GLOBAL
+ RTLD_LOCAL
+ if sys.platform.startswith("linux"):
+ RTLD_NODELETE
+ RTLD_NOLOAD
+ RTLD_DEEPBIND
def test_nonstandard_integer_types():
d = nonstandard_integer_types()
diff --git a/pypy/module/_cffi_backend/test/test_c.py b/pypy/module/_cffi_backend/test/test_c.py
--- a/pypy/module/_cffi_backend/test/test_c.py
+++ b/pypy/module/_cffi_backend/test/test_c.py
@@ -22,7 +22,6 @@
from pypy.tool.udir import udir
from pypy.conftest import gettestobjspace, option
from pypy.interpreter import gateway
-from pypy.module._cffi_backend.test import _backend_test_c
from pypy.module._cffi_backend import Module
from pypy.translator.platform import host
from pypy.translator.tool.cbuild import ExternalCompilationInfo
@@ -87,20 +86,24 @@
all_names = ', '.join(Module.interpleveldefs.keys())
+backend_test_c = py.path.local(__file__).join('..', '_backend_test_c.py')
+
lst = []
-for name, value in _backend_test_c.__dict__.items():
- if name.startswith('test_'):
- lst.append(value)
-lst.sort(key=lambda func: func.func_code.co_firstlineno)
+with backend_test_c.open('r') as f:
+ for line in f:
+ if line.startswith('def test_'):
+ line = line[4:]
+ line = line[:line.index('():')]
+ lst.append(line)
tmpdir = udir.join('test_c').ensure(dir=1)
tmpname = tmpdir.join('_test_c.py')
with tmpname.open('w') as f:
for func in lst:
- print >> f, 'def %s(self):' % (func.__name__,)
+ print >> f, 'def %s(self):' % (func,)
print >> f, ' import _all_test_c'
- print >> f, ' _all_test_c.%s()' % (func.__name__,)
+ print >> f, ' _all_test_c.%s()' % (func,)
tmpname2 = tmpdir.join('_all_test_c.py')
with tmpname2.open('w') as f:
@@ -110,7 +113,7 @@
print >> f, ' class test:'
print >> f, ' raises = staticmethod(raises)'
print >> f, ' skip = staticmethod(skip)'
- print >> f, py.path.local(__file__).join('..', '_backend_test_c.py').read()
+ print >> f, backend_test_c.read()
mod = tmpname.pyimport()
diff --git a/pypy/rlib/rdynload.py b/pypy/rlib/rdynload.py
--- a/pypy/rlib/rdynload.py
+++ b/pypy/rlib/rdynload.py
@@ -44,6 +44,10 @@
RTLD_LOCAL = rffi_platform.DefinedConstantInteger('RTLD_LOCAL')
RTLD_GLOBAL = rffi_platform.DefinedConstantInteger('RTLD_GLOBAL')
RTLD_NOW = rffi_platform.DefinedConstantInteger('RTLD_NOW')
+ RTLD_LAZY = rffi_platform.DefinedConstantInteger('RTLD_LAZY')
+ RTLD_NODELETE = rffi_platform.DefinedConstantInteger('RTLD_NODELETE')
+ RTLD_NOLOAD = rffi_platform.DefinedConstantInteger('RTLD_NOLOAD')
+ RTLD_DEEPBIND = rffi_platform.DefinedConstantInteger('RTLD_DEEPBIND')
class cConfig:
pass
@@ -72,6 +76,7 @@
RTLD_LOCAL = cConfig.RTLD_LOCAL
RTLD_GLOBAL = cConfig.RTLD_GLOBAL
RTLD_NOW = cConfig.RTLD_NOW
+ RTLD_LAZY = cConfig.RTLD_LAZY
def dlerror():
# XXX this would never work on top of ll2ctypes, because
@@ -90,7 +95,8 @@
mode = RTLD_LOCAL
else:
mode = 0
- mode |= RTLD_NOW
+ if (mode & (RTLD_LAZY | RTLD_NOW)) == 0:
+ mode |= RTLD_NOW
res = c_dlopen(name, rffi.cast(rffi.INT, mode))
if not res:
err = dlerror()
More information about the pypy-commit
mailing list