[pypy-commit] pypy cffi_dlopen_unicode: Share the code. Fix for Windows, still untested
arigo
pypy.commits at gmail.com
Sun Oct 14 03:31:42 EDT 2018
Author: Armin Rigo <arigo at tunes.org>
Branch: cffi_dlopen_unicode
Changeset: r95213:13735d96ce4f
Date: 2018-10-14 09:26 +0200
http://bitbucket.org/pypy/pypy/changeset/13735d96ce4f/
Log: Share the code. Fix for Windows, still untested
diff --git a/pypy/module/_cffi_backend/cdlopen.py b/pypy/module/_cffi_backend/cdlopen.py
--- a/pypy/module/_cffi_backend/cdlopen.py
+++ b/pypy/module/_cffi_backend/cdlopen.py
@@ -1,50 +1,21 @@
-import sys
from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
from rpython.rlib.objectmodel import specialize, we_are_translated
-from rpython.rlib.rdynload import DLLHANDLE, dlopen, dlsym, dlclose, DLOpenError
+from rpython.rlib.rdynload import DLLHANDLE, dlsym, dlclose
from pypy.interpreter.error import oefmt
-from pypy.module._rawffi.interp_rawffi import wrap_dlopenerror
from pypy.module._cffi_backend.parse_c_type import (
_CFFI_OPCODE_T, GLOBAL_S, CDL_INTCONST_S, STRUCT_UNION_S, FIELD_S,
ENUM_S, TYPENAME_S, ll_set_cdl_realize_global_int)
from pypy.module._cffi_backend.realize_c_type import getop
from pypy.module._cffi_backend.lib_obj import W_LibObject
-from pypy.module._cffi_backend import cffi_opcode, cffi1_module
-
-if sys.platform == 'win32':
- from rpython.rlib.rdynload import dlopenU
- WIN32 = True
-else:
- WIN32 = False
+from pypy.module._cffi_backend import cffi_opcode, cffi1_module, misc
class W_DlOpenLibObject(W_LibObject):
def __init__(self, ffi, w_filename, flags):
space = ffi.space
- if WIN32 and space.isinstance_w(w_filename, space.w_unicode):
- fname = space.unicode_w(w_filename)
- with rffi.scoped_unicode2wcharp(fname) as ll_libname:
- try:
- handle = dlopenU(ll_libname, flags)
- except DLOpenError as e:
- w_repr = space.repr(w_filename)
- raise wrap_dlopenerror(space, e, space.text_w(w_repr))
- else:
- if space.is_none(w_filename):
- fname = None
- elif space.isinstance_w(w_filename, space.w_unicode):
- fname = space.fsencode_w(w_filename)
- else:
- fname = space.text_w(w_filename)
- with rffi.scoped_str2charp(fname) as ll_libname:
- if fname is None:
- fname = "<None>"
- try:
- handle = dlopen(ll_libname, flags)
- except DLOpenError as e:
- raise wrap_dlopenerror(space, e, fname)
+ fname, handle = misc.dlopen_w(space, w_filename, flags)
W_LibObject.__init__(self, ffi, fname)
self.libhandle = handle
self.register_finalizer(space)
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
@@ -1,23 +1,16 @@
from __future__ import with_statement
-import sys
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.error import oefmt
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.typedef import TypeDef
-from pypy.module._rawffi.interp_rawffi import wrap_dlopenerror
from rpython.rtyper.lltypesystem import rffi
-from rpython.rlib.rdynload import DLLHANDLE, dlopen, dlsym, dlclose, DLOpenError
+from rpython.rlib.rdynload import DLLHANDLE, dlsym, dlclose
from pypy.module._cffi_backend.cdataobj import W_CData
from pypy.module._cffi_backend.ctypeobj import W_CType
-
-if sys.platform == 'win32':
- from rpython.rlib.rdynload import dlopenU
- WIN32 = True
-else:
- WIN32 = False
+from pypy.module._cffi_backend import misc
class W_Library(W_Root):
@@ -25,30 +18,7 @@
def __init__(self, space, w_filename, flags):
self.space = space
- if WIN32 and space.isinstance_w(w_filename, space.w_unicode):
- fname = space.unicode_w(w_filename)
- with rffi.scoped_unicode2wcharp(fname) as ll_libname:
- try:
- handle = dlopenU(ll_libname, flags)
- except DLOpenError as e:
- w_repr = space.repr(w_filename)
- raise wrap_dlopenerror(space, e, space.text_w(w_repr))
- else:
- if space.is_none(w_filename):
- fname = None
- elif space.isinstance_w(w_filename, space.w_unicode):
- fname = space.fsencode_w(w_filename)
- else:
- fname = space.text_w(w_filename)
- with rffi.scoped_str2charp(fname) as ll_libname:
- if fname is None:
- fname = "<None>"
- try:
- handle = dlopen(ll_libname, flags)
- except DLOpenError as e:
- raise wrap_dlopenerror(space, e, fname)
- self.handle = handle
- self.name = fname
+ self.name, self.handle = misc.dlopen_w(space, w_filename, flags)
self.register_finalizer(space)
def _finalize_(self):
diff --git a/pypy/module/_cffi_backend/misc.py b/pypy/module/_cffi_backend/misc.py
--- a/pypy/module/_cffi_backend/misc.py
+++ b/pypy/module/_cffi_backend/misc.py
@@ -1,14 +1,23 @@
from __future__ import with_statement
+import sys
from pypy.interpreter.error import OperationError, oefmt
+from pypy.module._rawffi.interp_rawffi import wrap_dlopenerror
from rpython.rlib import jit
from rpython.rlib.objectmodel import specialize, we_are_translated
from rpython.rlib.rarithmetic import r_uint, r_ulonglong
from rpython.rlib.unroll import unrolling_iterable
+from rpython.rlib.rdynload import dlopen, DLOpenError
from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
from rpython.translator.tool.cbuild import ExternalCompilationInfo
+if sys.platform == 'win32':
+ from rpython.rlib.rdynload import dlopenU
+ WIN32 = True
+else:
+ WIN32 = False
+
# ____________________________________________________________
@@ -383,3 +392,30 @@
ptr = rffi.cast(rffi.FLOATP, source)
for i in range(len(float_list)):
float_list[i] = rffi.cast(lltype.Float, ptr[i])
+
+# ____________________________________________________________
+
+def dlopen_w(space, w_filename, flags):
+ if WIN32 and space.isinstance_w(w_filename, space.w_unicode):
+ fname = space.text_w(space.repr(w_filename))
+ unicode_name = space.unicode_w(w_filename)
+ with rffi.scoped_unicode2wcharp(unicode_name) as ll_libname:
+ try:
+ handle = dlopenU(ll_libname, flags)
+ except DLOpenError as e:
+ raise wrap_dlopenerror(space, e, fname)
+ else:
+ if space.is_none(w_filename):
+ fname = None
+ elif space.isinstance_w(w_filename, space.w_unicode):
+ fname = space.fsencode_w(w_filename)
+ else:
+ fname = space.text_w(w_filename)
+ with rffi.scoped_str2charp(fname) as ll_libname:
+ if fname is None:
+ fname = "<None>"
+ try:
+ handle = dlopen(ll_libname, flags)
+ except DLOpenError as e:
+ raise wrap_dlopenerror(space, e, fname)
+ return fname, handle
diff --git a/pypy/module/_cffi_backend/test/test_re_python.py b/pypy/module/_cffi_backend/test/test_re_python.py
--- a/pypy/module/_cffi_backend/test/test_re_python.py
+++ b/pypy/module/_cffi_backend/test/test_re_python.py
@@ -52,7 +52,7 @@
try:
unicode_name.encode(sys.getfilesystemencoding())
except UnicodeEncodeError:
- unicode_name = None # skip the test
+ unicode_name = None # skip test_dlopen_unicode
if unicode_name is not None:
outputfileUname = os.path.join(unicode(udir), unicode_name)
shutil.copyfile(outputfilename, outputfileUname)
More information about the pypy-commit
mailing list