Author: Philip Jenvey <pjen...@underboss.org>
Branch: py3k
Changeset: r73684:eab5254eaafa
Date: 2014-09-24 19:24 -0700
http://bitbucket.org/pypy/pypy/changeset/eab5254eaafa/

Log:    workaround FuncType pointer calls w/ a non-standard calling
        convention not actually using said convention (after translation)
        with a stupid shim for now

diff --git a/pypy/module/posix/__init__.py b/pypy/module/posix/__init__.py
--- a/pypy/module/posix/__init__.py
+++ b/pypy/module/posix/__init__.py
@@ -167,8 +167,7 @@
     if os.name == 'nt':
         interpleveldefs.update({
                 '_getfileinformation': 'interp_posix._getfileinformation',
-                # XXX: currently broken
-                #'_getfinalpathname': 'interp_posix._getfinalpathname',
+                '_getfinalpathname': 'interp_posix._getfinalpathname',
         })
     if hasattr(os, 'chroot'):
         interpleveldefs['chroot'] = 'interp_posix.chroot'
diff --git a/rpython/rtyper/module/ll_win32file.py 
b/rpython/rtyper/module/ll_win32file.py
--- a/rpython/rtyper/module/ll_win32file.py
+++ b/rpython/rtyper/module/ll_win32file.py
@@ -10,6 +10,17 @@
 from rpython.tool.sourcetools import func_renamer
 from rpython.rlib.objectmodel import specialize
 
+separate_module_source = """\
+DWORD
+pypy_GetFinalPathNameByHandle(FARPROC address, HANDLE hFile,
+                              LPTSTR lpszFilePath, DWORD cchFilePath,
+                              DWORD dwFlags) {
+    DWORD (WINAPI *func)(HANDLE, LPTSTR, DWORD, DWORD);
+    *(FARPROC*)&func = address;
+    return func(hFile, lpszFilePath, cchFilePath, dwFlags);
+}
+"""
+
 def make_win32_traits(traits):
     from rpython.rlib import rwin32
 
@@ -21,6 +32,8 @@
     class CConfig:
         _compilation_info_ = ExternalCompilationInfo(
             includes = ['windows.h', 'winbase.h', 'sys/stat.h'],
+            separate_module_sources=[separate_module_source],
+            export_symbols=['pypy_GetFinalPathNameByHandle']
         )
         WIN32_FIND_DATA = platform.Struct(
             'struct _WIN32_FIND_DATA' + suffix,
@@ -192,15 +205,15 @@
             [traits.CCHARP, traits.CCHARP],
             rwin32.BOOL)
 
-        GETFINALPATHNAMEBYHANDLE_TP = lltype.Ptr(lltype.FuncType(
-                [rwin32.HANDLE, traits.CCHARP, rwin32.DWORD, rwin32.DWORD],
-                rwin32.DWORD, abi='FFI_STDCALL'))
-        # dynamically loaded
-        GetFinalPathNameByHandle = lltype.nullptr(
-            GETFINALPATHNAMEBYHANDLE_TP.TO)
+        GetFinalPathNameByHandle_HANDLE = lltype.nullptr(rffi.VOIDP.TO)
+        pypy_GetFinalPathNameByHandle = staticmethod(rffi.llexternal(
+            'pypy_GetFinalPathNameByHandle',
+            [rffi.VOIDP, rwin32.HANDLE, rffi.CWCHARP, rwin32.DWORD, 
rwin32.DWORD],
+            rwin32.DWORD, compilation_info=CConfig._compilation_info_))
 
         def check_GetFinalPathNameByHandle(self):
-            if self.GetFinalPathNameByHandle:
+            if (self.GetFinalPathNameByHandle_HANDLE !=
+                lltype.nullptr(rffi.VOIDP.TO)):
                 return True
 
             from rpython.rlib.rdynload import GetModuleHandle, dlsym
@@ -210,10 +223,15 @@
             except KeyError:
                 return False
 
-            self.GetFinalPathNameByHandle = rffi.cast(
-                Win32Traits.GETFINALPATHNAMEBYHANDLE_TP, func)
+            self.GetFinalPathNameByHandle_HANDLE = func
             return True
 
+        def GetFinalPathNameByHandle(self, *args):
+            assert (self.GetFinalPathNameByHandle_HANDLE !=
+                    lltype.nullptr(rffi.VOIDP.TO))
+            return self.pypy_GetFinalPathNameByHandle(
+                self.GetFinalPathNameByHandle_HANDLE, *args)
+
     return Win32Traits()
 
 #_______________________________________________________________
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to