[pypy-svn] r61218 - pypy/trunk/pypy/rlib

afa at codespeak.net afa at codespeak.net
Thu Jan 22 10:10:19 CET 2009


Author: afa
Date: Thu Jan 22 10:10:18 2009
New Revision: 61218

Modified:
   pypy/trunk/pypy/rlib/libffi.py
Log:
Fix translation of _rawffi on Windows


Modified: pypy/trunk/pypy/rlib/libffi.py
==============================================================================
--- pypy/trunk/pypy/rlib/libffi.py	(original)
+++ pypy/trunk/pypy/rlib/libffi.py	Thu Jan 22 10:10:18 2009
@@ -22,15 +22,41 @@
 from pypy.translator.platform import platform
 
 # maaaybe isinstance here would be better. Think
-_MS_WINDOWS = platform.name == "win32"
+_MSVC = platform.name == "msvc"
+_MINGW = platform.name == "mingw32"
+_WIN32 = _MSVC or _MINGW
 _MAC_OS = platform.name == "darwin"
 _FREEBSD_7 = platform.name == "freebsd7"
 
-if _MS_WINDOWS:
+if _WIN32:
     from pypy.rlib import rwin32
 
-if not _MS_WINDOWS:
-    includes = ['dlfcn.h', 'ffi.h']
+if _WIN32:
+    separate_module_sources = ['''
+    #include <stdio.h>
+
+    /* Get the module where the "fopen" function resides in */
+    HANDLE get_libc_handle() {
+        MEMORY_BASIC_INFORMATION  mi;
+        char buf[1000];
+        memset(&mi, 0, sizeof(mi));
+
+        if( !VirtualQueryEx(GetCurrentProcess(), &fopen, &mi, sizeof(mi)) )
+            return 0;
+
+        GetModuleFileName((HMODULE)mi.AllocationBase, buf, 500);
+
+        return (HMODULE)mi.AllocationBase;
+    }
+    ''']
+else:
+    separate_module_sources = []
+
+if not _MSVC:
+    if _MINGW:
+        includes = ['windows.h', 'ffi.h']
+    else:
+        includes = ['dlfcn.h', 'ffi.h']
     include_dirs = platform.include_dirs_for_libffi()
 
     if _MAC_OS:
@@ -38,7 +64,7 @@
     else: 
         pre_include_bits = []
 
-    if _FREEBSD_7:
+    if _FREEBSD_7 or _MINGW:
         libraries = ['ffi']
     else:
         libraries = ['ffi', 'dl']
@@ -47,6 +73,7 @@
         pre_include_bits = pre_include_bits,
         includes = includes,
         libraries = libraries,
+        separate_module_sources = separate_module_sources,
         include_dirs = platform.include_dirs_for_libffi(),
         library_dirs = platform.library_dirs_for_libffi(),
     )
@@ -57,20 +84,7 @@
         includes = ['ffi.h', 'windows.h'],
         libraries = ['kernel32'],
         include_dirs = [libffidir],
-        separate_module_sources = ['''
-        #include <stdio.h>
-
-        /* Get the module where the "fopen" function resides in */
-        HANDLE get_libc_handle() {
-            MEMORY_BASIC_INFORMATION  mi;
-            memset(&mi, 0, sizeof(mi));
-
-            if( !VirtualQueryEx(GetCurrentProcess(), &fopen, &mi, sizeof(mi)) )
-                return 0;
-
-            return (HMODULE)mi.AllocationBase;
-        }
-        '''],
+        separate_module_sources = separate_module_sources,
         separate_module_files = [libffidir.join('ffi.c'),
                                  libffidir.join('prep_cif.c'),
                                  libffidir.join('win32.c'),
@@ -93,7 +107,7 @@
     FFI_OK = rffi_platform.ConstantInteger('FFI_OK')
     FFI_BAD_TYPEDEF = rffi_platform.ConstantInteger('FFI_BAD_TYPEDEF')
     FFI_DEFAULT_ABI = rffi_platform.ConstantInteger('FFI_DEFAULT_ABI')
-    if _MS_WINDOWS:
+    if _WIN32:
         FFI_STDCALL = rffi_platform.ConstantInteger('FFI_STDCALL')
 
     FFI_TYPE_STRUCT = rffi_platform.ConstantInteger('FFI_TYPE_STRUCT')
@@ -182,7 +196,7 @@
 def winexternal(name, args, result):
     return rffi.llexternal(name, args, result, compilation_info=eci, calling_conv='win')
 
-if not _MS_WINDOWS:
+if not _WIN32:
     c_dlopen = external('dlopen', [rffi.CCHARP, rffi.INT], rffi.VOIDP)
     c_dlclose = external('dlclose', [rffi.VOIDP], rffi.INT)
     c_dlerror = external('dlerror', [], rffi.CCHARP)
@@ -233,7 +247,7 @@
 
     libc_name = ctypes.util.find_library('c')
 
-if _MS_WINDOWS:
+if _WIN32:
     def dlopen(name):
         res = rwin32.LoadLibrary(name)
         if not res:
@@ -261,12 +275,14 @@
     get_libc_handle = external('get_libc_handle', [], rwin32.HANDLE)
 
     libc_name = rwin32.GetModuleFileName(get_libc_handle())
-        
+    assert "msvcr" in libc_name.lower(), \
+           "Suspect msvcrt library: %s" % (libc_name,)
+
 
 FFI_OK = cConfig.FFI_OK
 FFI_BAD_TYPEDEF = cConfig.FFI_BAD_TYPEDEF
 FFI_DEFAULT_ABI = rffi.cast(rffi.USHORT, cConfig.FFI_DEFAULT_ABI)
-if _MS_WINDOWS:
+if _WIN32:
     FFI_STDCALL = rffi.cast(rffi.USHORT, cConfig.FFI_STDCALL)
 FFI_TYPE_STRUCT = rffi.cast(rffi.USHORT, cConfig.FFI_TYPE_STRUCT)
 FFI_CIFP = rffi.COpaquePtr('ffi_cif', compilation_info=eci)
@@ -377,12 +393,12 @@
             self.ll_argtypes[i] = argtypes[i]
         self.ll_cif = lltype.malloc(FFI_CIFP.TO, flavor='raw')
 
-        if _MS_WINDOWS and (flags & FUNCFLAG_CDECL == 0):
+        if _WIN32 and (flags & FUNCFLAG_CDECL == 0):
             cc = FFI_STDCALL
         else:
             cc = FFI_DEFAULT_ABI
 
-        if _MS_WINDOWS:
+        if _MSVC:
             # This little trick works correctly with MSVC.
             # It returns small structures in registers
             if r_uint(restype.c_type) == FFI_TYPE_STRUCT:



More information about the Pypy-commit mailing list