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

Reply via email to