Author: Matti Picus <[email protected]>
Branch: cffi_dlopen_unicode
Changeset: r95183:9093671404b4
Date: 2018-10-07 16:30 +0300
http://bitbucket.org/pypy/pypy/changeset/9093671404b4/
Log: allow unicode filename in W_DlOpenLibObject
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,3 +1,4 @@
+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
@@ -12,20 +13,36 @@
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
class W_DlOpenLibObject(W_LibObject):
- def __init__(self, ffi, filename, flags):
- with rffi.scoped_str2charp(filename) as ll_libname:
- if filename is None:
- filename = "<None>"
+ def __init__(self, ffi, w_filename, flags):
+ space = ffi.space
+ _scoped = rffi.scoped_str2charp
+ _dlopen = dlopen
+ if WIN32 and space.isinstance_w(w_filename, space.w_unicode):
+ _scoped = rffi.scoped_unicode2wcharp
+ _dlopen = dlopenU
+ fname = space.unicode_w(w_filename)
+ elif space.is_none(w_filename):
+ fname = None
+ else:
+ fname = space.text_w(w_filename)
+ with _scoped(fname) as ll_libname:
+ if fname is None:
+ fname = "<None>"
try:
- handle = dlopen(ll_libname, flags)
+ handle = _dlopen(ll_libname, flags)
except DLOpenError as e:
- raise wrap_dlopenerror(ffi.space, e, filename)
- W_LibObject.__init__(self, ffi, filename)
+ raise wrap_dlopenerror(space, e, fname)
+ W_LibObject.__init__(self, ffi, fname)
self.libhandle = handle
- self.register_finalizer(ffi.space)
+ self.register_finalizer(space)
def _finalize_(self):
h = self.libhandle
diff --git a/pypy/module/_cffi_backend/ffi_obj.py
b/pypy/module/_cffi_backend/ffi_obj.py
--- a/pypy/module/_cffi_backend/ffi_obj.py
+++ b/pypy/module/_cffi_backend/ffi_obj.py
@@ -572,8 +572,8 @@
return self.ffi_type(w_arg, ACCEPT_STRING | ACCEPT_CDATA)
- @unwrap_spec(filename="fsencode_or_none", flags=int)
- def descr_dlopen(self, filename, flags=0):
+ @unwrap_spec(flags=int)
+ def descr_dlopen(self, w_filename, flags=0):
"""\
Load and return a dynamic library identified by 'name'. The standard
C library can be loaded by passing None.
@@ -584,7 +584,7 @@
first access."""
#
from pypy.module._cffi_backend import cdlopen
- return cdlopen.W_DlOpenLibObject(self, filename, flags)
+ return cdlopen.W_DlOpenLibObject(self, w_filename, flags)
def descr_dlclose(self, w_lib):
diff --git a/rpython/rlib/rdynload.py b/rpython/rlib/rdynload.py
--- a/rpython/rlib/rdynload.py
+++ b/rpython/rlib/rdynload.py
@@ -233,6 +233,16 @@
raise DLOpenError(ustr.encode('utf-8'))
return res
+ def dlopenU(name, mode=-1):
+ # mode is unused on windows, but a consistant signature
+ res = rwin32.LoadLibraryW(name)
+ if not res:
+ err = rwin32.GetLastError_saved()
+ ustr = rwin32.FormatErrorW(err)
+ # DLOpenError unicode msg breaks translation of cpyext
create_extension_module
+ raise DLOpenError(ustr.encode('utf-8'))
+ return res
+
def dlclose(handle):
res = rwin32.FreeLibrary(handle)
if res:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit