Author: Armin Rigo <ar...@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit