Author: Amaury Forgeot d'Arc <[email protected]>
Branch: more-rposix
Changeset: r74363:586ee1f92428
Date: 2014-11-06 23:51 +0100
http://bitbucket.org/pypy/pypy/changeset/586ee1f92428/

Log:    Port os.utime.

        A lot of changes, but it's actually 30 lines less than before.

diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -1,7 +1,8 @@
 import os
 import sys
 from rpython.rtyper.lltypesystem.rffi import CConstant, CExternVariable, INT
-from rpython.rtyper.lltypesystem import ll2ctypes, rffi
+from rpython.rtyper.lltypesystem import lltype, ll2ctypes, rffi
+from rpython.rtyper.tool import rffi_platform
 from rpython.translator.tool.cbuild import ExternalCompilationInfo
 from rpython.rlib.rarithmetic import intmask
 from rpython.rlib.objectmodel import (
@@ -135,13 +136,22 @@
             pass
 
 if _WIN32:
-    includes = ['io.h']
+    includes = ['io.h', 'sys/utime.h', 'sys/types.h']
 else:
-    includes = ['unistd.h']
+    includes = ['unistd.h', 'utime.h', 'sys/time.h', 'sys/types.h']
 eci = ExternalCompilationInfo(
     includes=includes,
 )
 
+class CConfig:
+    _compilation_info_ = eci
+    HAVE_UTIMES = rffi_platform.Has('utimes')
+    UTIMBUF = rffi_platform.Struct('struct %sutimbuf' % UNDERSCORE_ON_WIN32,
+                                   [('actime', rffi.INT),
+                                    ('modtime', rffi.INT)])
+config = rffi_platform.configure(CConfig)
+globals().update(config)
+
 def external(name, args, result, **kwds):
     return rffi.llexternal(name, args, result, compilation_info=eci, **kwds)
 
@@ -257,10 +267,6 @@
 def chmod(path, mode):
     return os.chmod(_as_bytes(path), mode)
 
[email protected](0, 1)
-def utime(path, times):
-    return os.utime(_as_bytes(path), times)
-
 @specialize.argtype(0)
 def chdir(path):
     return os.chdir(_as_bytes(path))
@@ -398,3 +404,116 @@
     if not result:
         raise OSError(get_errno(), "getlogin failed")
     return rffi.charp2str(result)
+
+
+#_______________________________________________________________
+
+UTIMBUFP = lltype.Ptr(UTIMBUF)
+c_utime = external('utime', [rffi.CCHARP, UTIMBUFP], rffi.INT)
+if HAVE_UTIMES:
+    class CConfig:
+        _compilation_info_ = eci
+        TIMEVAL = rffi_platform.Struct('struct timeval', [
+            ('tv_sec', rffi.LONG),
+            ('tv_usec', rffi.LONG)])
+    config = rffi_platform.configure(CConfig)
+    TIMEVAL = config['TIMEVAL']
+    TIMEVAL2P = rffi.CArrayPtr(TIMEVAL)
+    c_utimes = external('utimes', [rffi.CCHARP, TIMEVAL2P], rffi.INT)
+
+if _WIN32:
+    from rpython.rlib.rposix import rwin32
+    GetSystemTime = external(
+        'GetSystemTime',
+        [lltype.Ptr(rwin32.SYSTEMTIME)],
+        lltype.Void,
+        calling_conv='win')
+
+    SystemTimeToFileTime = external(
+        'SystemTimeToFileTime',
+        [lltype.Ptr(rwin32.SYSTEMTIME),
+         lltype.Ptr(rwin32.FILETIME)],
+        rwin32.BOOL,
+        calling_conv='win')
+
+    SetFileTime = external(
+        'SetFileTime',
+        [rwin32.HANDLE,
+         lltype.Ptr(rwin32.FILETIME),
+         lltype.Ptr(rwin32.FILETIME),
+         lltype.Ptr(rwin32.FILETIME)],
+        rwin32.BOOL,
+        calling_conv='win')
+
+
+@register_replacement_for(getattr(os, 'utime', None),
+                          sandboxed_name='ll_os.ll_os_utime')
[email protected](0, 1)
+def utime(path, times):
+    if not _WIN32:
+        path = _as_bytes0(path)
+        if times is None:
+            error = c_utime(path, lltype.nullptr(UTIMBUFP.TO))
+        else:
+            actime, modtime = times
+            if HAVE_UTIMES:
+                import math
+                l_times = lltype.malloc(TIMEVAL2P.TO, 2, flavor='raw')
+                fracpart, intpart = math.modf(actime)
+                rffi.setintfield(l_times[0], 'c_tv_sec', int(intpart))
+                rffi.setintfield(l_times[0], 'c_tv_usec', int(fracpart * 1e6))
+                fracpart, intpart = math.modf(modtime)
+                rffi.setintfield(l_times[1], 'c_tv_sec', int(intpart))
+                rffi.setintfield(l_times[1], 'c_tv_usec', int(fracpart * 1e6))
+                error = c_utimes(path, l_times)
+                lltype.free(l_times, flavor='raw')
+            else:
+                l_utimbuf = lltype.malloc(UTIMBUFP.TO, flavor='raw')
+                l_utimbuf.c_actime  = rffi.r_time_t(actime)
+                l_utimbuf.c_modtime = rffi.r_time_t(modtime)
+                error = c_utime(path, l_utimbuf)
+                lltype.free(l_utimbuf, flavor='raw')
+        if error < 0:
+            raise OSError(get_errno(), "os_utime failed")
+    else:  # _WIN32 case
+        from rpython.rlib.rwin32file import make_win32_traits
+        if _prefer_unicode(path):
+            # XXX remove dependency on rtyper.module.  The "traits"
+            # are just used for CreateFile anyway.
+            from rpython.rtyper.module.support import UnicodeTraits
+            win32traits = make_win32_traits(UnicodeTraits())
+            path = _as_unicode0(path)
+        else:
+            from rpython.rtyper.module.support import StringTraits
+            win32traits = make_win32_traits(StringTraits())
+            path = _as_bytes0(path)
+        hFile = win32traits.CreateFile(path,
+                           win32traits.FILE_WRITE_ATTRIBUTES, 0,
+                           None, win32traits.OPEN_EXISTING,
+                           win32traits.FILE_FLAG_BACKUP_SEMANTICS,
+                           rwin32.NULL_HANDLE)
+        if hFile == rwin32.INVALID_HANDLE_VALUE:
+            raise rwin32.lastWindowsError()
+        ctime = lltype.nullptr(rwin32.FILETIME)
+        atime = lltype.malloc(rwin32.FILETIME, flavor='raw')
+        mtime = lltype.malloc(rwin32.FILETIME, flavor='raw')
+        try:
+            if tp is None:
+                now = lltype.malloc(rwin32.SYSTEMTIME, flavor='raw')
+                try:
+                    GetSystemTime(now)
+                    if (not SystemTimeToFileTime(now, atime) or
+                        not SystemTimeToFileTime(now, mtime)):
+                        raise rwin32.lastWindowsError()
+                finally:
+                    lltype.free(now, flavor='raw')
+            else:
+                actime, modtime = tp
+                time_t_to_FILE_TIME(actime, atime)
+                time_t_to_FILE_TIME(modtime, mtime)
+            if not SetFileTime(hFile, ctime, atime, mtime):
+                raise rwin32.lastWindowsError()
+        finally:
+            rwin32.CloseHandle(hFile)
+            lltype.free(atime, flavor='raw')
+            lltype.free(mtime, flavor='raw')
diff --git a/rpython/rlib/rwin32file.py b/rpython/rlib/rwin32file.py
new file mode 100644
--- /dev/null
+++ b/rpython/rlib/rwin32file.py
@@ -0,0 +1,192 @@
+"""
+Win32 API functions around files.
+"""
+
+from rpython.rtyper.lltypesystem import lltype, rffi
+from rpython.translator.tool.cbuild import ExternalCompilationInfo
+from rpython.rtyper.tool import rffi_platform as platform
+
+
+def make_win32_traits(traits):
+    from rpython.rlib import rwin32
+
+    if traits.str is unicode:
+        suffix = 'W'
+    else:
+        suffix = 'A'
+
+    class CConfig:
+        _compilation_info_ = ExternalCompilationInfo(
+            includes = ['windows.h', 'winbase.h', 'sys/stat.h'],
+        )
+        WIN32_FIND_DATA = platform.Struct(
+            'struct _WIN32_FIND_DATA' + suffix,
+            # Only interesting fields
+            [('dwFileAttributes', rwin32.DWORD),
+             ('nFileSizeHigh', rwin32.DWORD),
+             ('nFileSizeLow', rwin32.DWORD),
+             ('ftCreationTime', rwin32.FILETIME),
+             ('ftLastAccessTime', rwin32.FILETIME),
+             ('ftLastWriteTime', rwin32.FILETIME),
+             ('cFileName', lltype.FixedSizeArray(traits.CHAR, 250))])
+        ERROR_FILE_NOT_FOUND = platform.ConstantInteger(
+            'ERROR_FILE_NOT_FOUND')
+        ERROR_NO_MORE_FILES = platform.ConstantInteger(
+            'ERROR_NO_MORE_FILES')
+
+        GetFileExInfoStandard = platform.ConstantInteger(
+            'GetFileExInfoStandard')
+        FILE_ATTRIBUTE_DIRECTORY = platform.ConstantInteger(
+            'FILE_ATTRIBUTE_DIRECTORY')
+        FILE_ATTRIBUTE_READONLY = platform.ConstantInteger(
+            'FILE_ATTRIBUTE_READONLY')
+        INVALID_FILE_ATTRIBUTES = platform.ConstantInteger(
+            'INVALID_FILE_ATTRIBUTES')
+        ERROR_SHARING_VIOLATION = platform.ConstantInteger(
+            'ERROR_SHARING_VIOLATION')
+        _S_IFDIR = platform.ConstantInteger('_S_IFDIR')
+        _S_IFREG = platform.ConstantInteger('_S_IFREG')
+        _S_IFCHR = platform.ConstantInteger('_S_IFCHR')
+        _S_IFIFO = platform.ConstantInteger('_S_IFIFO')
+        FILE_TYPE_UNKNOWN = platform.ConstantInteger('FILE_TYPE_UNKNOWN')
+        FILE_TYPE_CHAR = platform.ConstantInteger('FILE_TYPE_CHAR')
+        FILE_TYPE_PIPE = platform.ConstantInteger('FILE_TYPE_PIPE')
+
+        FILE_WRITE_ATTRIBUTES = platform.ConstantInteger(
+            'FILE_WRITE_ATTRIBUTES')
+        OPEN_EXISTING = platform.ConstantInteger(
+            'OPEN_EXISTING')
+        FILE_FLAG_BACKUP_SEMANTICS = platform.ConstantInteger(
+            'FILE_FLAG_BACKUP_SEMANTICS')
+        VOLUME_NAME_DOS = platform.ConstantInteger('VOLUME_NAME_DOS')
+        VOLUME_NAME_NT = platform.ConstantInteger('VOLUME_NAME_NT')
+
+        WIN32_FILE_ATTRIBUTE_DATA = platform.Struct(
+            'WIN32_FILE_ATTRIBUTE_DATA',
+            [('dwFileAttributes', rwin32.DWORD),
+             ('nFileSizeHigh', rwin32.DWORD),
+             ('nFileSizeLow', rwin32.DWORD),
+             ('ftCreationTime', rwin32.FILETIME),
+             ('ftLastAccessTime', rwin32.FILETIME),
+             ('ftLastWriteTime', rwin32.FILETIME)])
+
+        BY_HANDLE_FILE_INFORMATION = platform.Struct(
+            'BY_HANDLE_FILE_INFORMATION',
+            [('dwFileAttributes', rwin32.DWORD),
+             ('ftCreationTime', rwin32.FILETIME),
+             ('ftLastAccessTime', rwin32.FILETIME),
+             ('ftLastWriteTime', rwin32.FILETIME),
+             ('dwVolumeSerialNumber', rwin32.DWORD),
+             ('nFileSizeHigh', rwin32.DWORD),
+             ('nFileSizeLow', rwin32.DWORD),
+             ('nNumberOfLinks', rwin32.DWORD),
+             ('nFileIndexHigh', rwin32.DWORD),
+             ('nFileIndexLow', rwin32.DWORD)])
+
+    config = platform.configure(CConfig)
+
+    def external(*args, **kwargs):
+        kwargs['compilation_info'] = CConfig._compilation_info_
+        llfunc = rffi.llexternal(calling_conv='win', *args, **kwargs)
+        return staticmethod(llfunc)
+
+    class Win32Traits:
+        apisuffix = suffix
+
+        for name in '''WIN32_FIND_DATA WIN32_FILE_ATTRIBUTE_DATA 
BY_HANDLE_FILE_INFORMATION
+                       GetFileExInfoStandard
+                       FILE_ATTRIBUTE_DIRECTORY FILE_ATTRIBUTE_READONLY
+                       INVALID_FILE_ATTRIBUTES
+                       _S_IFDIR _S_IFREG _S_IFCHR _S_IFIFO
+                       FILE_TYPE_UNKNOWN FILE_TYPE_CHAR FILE_TYPE_PIPE
+                       FILE_WRITE_ATTRIBUTES OPEN_EXISTING 
FILE_FLAG_BACKUP_SEMANTICS
+                       VOLUME_NAME_DOS VOLUME_NAME_NT
+                       ERROR_FILE_NOT_FOUND ERROR_NO_MORE_FILES
+                       ERROR_SHARING_VIOLATION
+                    '''.split():
+            locals()[name] = config[name]
+        LPWIN32_FIND_DATA    = lltype.Ptr(WIN32_FIND_DATA)
+        GET_FILEEX_INFO_LEVELS = rffi.ULONG # an enumeration
+
+        FindFirstFile = external('FindFirstFile' + suffix,
+                                 [traits.CCHARP, LPWIN32_FIND_DATA],
+                                 rwin32.HANDLE)
+        FindNextFile = external('FindNextFile' + suffix,
+                                [rwin32.HANDLE, LPWIN32_FIND_DATA],
+                                rwin32.BOOL)
+        FindClose = external('FindClose',
+                             [rwin32.HANDLE],
+                             rwin32.BOOL)
+
+        GetFileAttributes = external(
+            'GetFileAttributes' + suffix,
+            [traits.CCHARP],
+            rwin32.DWORD)
+
+        SetFileAttributes = external(
+            'SetFileAttributes' + suffix,
+            [traits.CCHARP, rwin32.DWORD],
+            rwin32.BOOL)
+
+        GetFileAttributesEx = external(
+            'GetFileAttributesEx' + suffix,
+            [traits.CCHARP, GET_FILEEX_INFO_LEVELS,
+             lltype.Ptr(WIN32_FILE_ATTRIBUTE_DATA)],
+            rwin32.BOOL)
+
+        GetFileInformationByHandle = external(
+            'GetFileInformationByHandle',
+            [rwin32.HANDLE, lltype.Ptr(BY_HANDLE_FILE_INFORMATION)],
+            rwin32.BOOL)
+
+        GetFileType = external(
+            'GetFileType',
+            [rwin32.HANDLE],
+            rwin32.DWORD)
+
+        LPSTRP = rffi.CArrayPtr(traits.CCHARP)
+
+        GetFullPathName = external(
+            'GetFullPathName' + suffix,
+            [traits.CCHARP, rwin32.DWORD,
+             traits.CCHARP, LPSTRP],
+            rwin32.DWORD)
+
+        GetCurrentDirectory = external(
+            'GetCurrentDirectory' + suffix,
+            [rwin32.DWORD, traits.CCHARP],
+            rwin32.DWORD)
+
+        SetCurrentDirectory = external(
+            'SetCurrentDirectory' + suffix,
+            [traits.CCHARP],
+            rwin32.BOOL)
+
+        CreateDirectory = external(
+            'CreateDirectory' + suffix,
+            [traits.CCHARP, rffi.VOIDP],
+            rwin32.BOOL)
+
+        SetEnvironmentVariable = external(
+            'SetEnvironmentVariable' + suffix,
+            [traits.CCHARP, traits.CCHARP],
+            rwin32.BOOL)
+
+        CreateFile = external(
+            'CreateFile' + apisuffix,
+            [traits.CCHARP, rwin32.DWORD, rwin32.DWORD,
+             rwin32.LPSECURITY_ATTRIBUTES, rwin32.DWORD, rwin32.DWORD,
+             rwin32.HANDLE],
+            rwin32.HANDLE)
+
+        DeleteFile = external(
+            'DeleteFile' + suffix,
+            [traits.CCHARP],
+            rwin32.BOOL)
+
+        MoveFile = external(
+            'MoveFile' + suffix,
+            [traits.CCHARP, traits.CCHARP],
+            rwin32.BOOL)
+
+    return Win32Traits
diff --git a/rpython/rtyper/module/ll_os.py b/rpython/rtyper/module/ll_os.py
--- a/rpython/rtyper/module/ll_os.py
+++ b/rpython/rtyper/module/ll_os.py
@@ -247,104 +247,6 @@
         return extdef([int], int, llimpl=c_func_llimpl,
                       export_name='ll_os.ll_os_' + name)
 
-    @registering_str_unicode(os.utime)
-    def register_os_utime(self, traits):
-        UTIMBUFP = lltype.Ptr(self.UTIMBUF)
-        os_utime = self.llexternal('utime', [rffi.CCHARP, UTIMBUFP], rffi.INT)
-
-        if not _WIN32:
-            includes = ['sys/time.h']
-        else:
-            includes = ['time.h']
-        eci = ExternalCompilationInfo(includes=includes)
-
-        class CConfig:
-            _compilation_info_ = eci
-            HAVE_UTIMES = platform.Has('utimes')
-        config = platform.configure(CConfig)
-
-        # XXX note that on Windows, calls to os.utime() are ignored on
-        # directories.  Remove that hack over there once it's fixed here!
-
-        if config['HAVE_UTIMES']:
-            class CConfig:
-                _compilation_info_ = eci
-                TIMEVAL = platform.Struct('struct timeval', [('tv_sec', 
rffi.LONG),
-                                                             ('tv_usec', 
rffi.LONG)])
-            config = platform.configure(CConfig)
-            TIMEVAL = config['TIMEVAL']
-            TIMEVAL2P = rffi.CArrayPtr(TIMEVAL)
-            os_utimes = self.llexternal('utimes', [rffi.CCHARP, TIMEVAL2P],
-                                        rffi.INT, compilation_info=eci)
-
-            def os_utime_platform(path, actime, modtime):
-                import math
-                l_times = lltype.malloc(TIMEVAL2P.TO, 2, flavor='raw')
-                fracpart, intpart = math.modf(actime)
-                rffi.setintfield(l_times[0], 'c_tv_sec', int(intpart))
-                rffi.setintfield(l_times[0], 'c_tv_usec', int(fracpart * 1E6))
-                fracpart, intpart = math.modf(modtime)
-                rffi.setintfield(l_times[1], 'c_tv_sec', int(intpart))
-                rffi.setintfield(l_times[1], 'c_tv_usec', int(fracpart * 1E6))
-                error = os_utimes(path, l_times)
-                lltype.free(l_times, flavor='raw')
-                return error
-        else:
-            # we only have utime(), which does not allow sub-second resolution
-            def os_utime_platform(path, actime, modtime):
-                l_utimbuf = lltype.malloc(UTIMBUFP.TO, flavor='raw')
-                l_utimbuf.c_actime  = rffi.r_time_t(actime)
-                l_utimbuf.c_modtime = rffi.r_time_t(modtime)
-                error = os_utime(path, l_utimbuf)
-                lltype.free(l_utimbuf, flavor='raw')
-                return error
-
-        # NB. this function is specialized; we get one version where
-        # tp is known to be None, and one version where it is known
-        # to be a tuple of 2 floats.
-        if not _WIN32:
-            assert traits.str is str
-
-            @specialize.argtype(1)
-            def os_utime_llimpl(path, tp):
-                if tp is None:
-                    error = os_utime(path, lltype.nullptr(UTIMBUFP.TO))
-                else:
-                    actime, modtime = tp
-                    error = os_utime_platform(path, actime, modtime)
-                    error = rffi.cast(lltype.Signed, error)
-                if error == -1:
-                    raise OSError(rposix.get_errno(), "os_utime failed")
-        else:
-            from rpython.rtyper.module.ll_win32file import make_utime_impl
-            os_utime_llimpl = make_utime_impl(traits)
-
-        s_tuple_of_2_floats = SomeTuple([SomeFloat(), SomeFloat()])
-
-        def os_utime_normalize_args(s_path, s_times):
-            # special handling of the arguments: they can be either
-            # [str, (float, float)] or [str, s_None], and get normalized
-            # to exactly one of these two.
-            if not traits.str0.contains(s_path):
-                raise Exception("os.utime() arg 1 must be a string, got %s" % (
-                    s_path,))
-            case1 = s_None.contains(s_times)
-            case2 = s_tuple_of_2_floats.contains(s_times)
-            if case1 and case2:
-                return [traits.str0, s_ImpossibleValue] #don't know which case 
yet
-            elif case1:
-                return [traits.str0, s_None]
-            elif case2:
-                return [traits.str0, s_tuple_of_2_floats]
-            else:
-                raise Exception("os.utime() arg 2 must be None or a tuple of "
-                                "2 floats, got %s" % (s_times,))
-        os_utime_normalize_args._default_signature_ = [traits.str0, None]
-
-        return extdef(os_utime_normalize_args, s_None,
-                      "ll_os.ll_os_utime",
-                      llimpl=os_utime_llimpl)
-
     @registering(os.times)
     def register_os_times(self):
         if sys.platform.startswith('win'):
@@ -1357,7 +1259,7 @@
                 raise OSError(rposix.get_errno(), "os_unlink failed")
 
         if sys.platform == 'win32':
-            from rpython.rtyper.module.ll_win32file import make_win32_traits
+            from rpython.rlib.rwin32file import make_win32_traits
             win32traits = make_win32_traits(traits)
 
             @func_renamer('unlink_llimpl_%s' % traits.str.__name__)
@@ -1392,7 +1294,7 @@
                                    [traits.CCHARP, rffi.MODE_T], rffi.INT)
 
         if sys.platform == 'win32':
-            from rpython.rtyper.module.ll_win32file import make_win32_traits
+            from rpython.rlib.rwin32file import make_win32_traits
             win32traits = make_win32_traits(traits)
 
             @func_renamer('mkdir_llimpl_%s' % traits.str.__name__)
@@ -1464,7 +1366,7 @@
                 raise OSError(rposix.get_errno(), "os_rename failed")
 
         if sys.platform == 'win32':
-            from rpython.rtyper.module.ll_win32file import make_win32_traits
+            from rpython.rlib.rwin32file import make_win32_traits
             win32traits = make_win32_traits(traits)
 
             @func_renamer('rename_llimpl_%s' % traits.str.__name__)
diff --git a/rpython/rtyper/module/ll_os_stat.py 
b/rpython/rtyper/module/ll_os_stat.py
--- a/rpython/rtyper/module/ll_os_stat.py
+++ b/rpython/rtyper/module/ll_os_stat.py
@@ -440,7 +440,7 @@
 
 def make_win32_stat_impl(name, traits):
     from rpython.rlib import rwin32
-    from rpython.rtyper.module.ll_win32file import make_win32_traits
+    from rpython.rlib.rwin32file import make_win32_traits
     win32traits = make_win32_traits(traits)
 
     # The CRT of Windows has a number of flaws wrt. its stat() implementation:
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,195 +10,14 @@
 from rpython.tool.sourcetools import func_renamer
 from rpython.rlib.objectmodel import specialize
 
-def make_win32_traits(traits):
-    from rpython.rlib import rwin32
-
-    if traits.str is unicode:
-        suffix = 'W'
-    else:
-        suffix = 'A'
-
-    class CConfig:
-        _compilation_info_ = ExternalCompilationInfo(
-            includes = ['windows.h', 'winbase.h', 'sys/stat.h'],
-        )
-        WIN32_FIND_DATA = platform.Struct(
-            'struct _WIN32_FIND_DATA' + suffix,
-            # Only interesting fields
-            [('dwFileAttributes', rwin32.DWORD),
-             ('nFileSizeHigh', rwin32.DWORD),
-             ('nFileSizeLow', rwin32.DWORD),
-             ('ftCreationTime', rwin32.FILETIME),
-             ('ftLastAccessTime', rwin32.FILETIME),
-             ('ftLastWriteTime', rwin32.FILETIME),
-             ('cFileName', lltype.FixedSizeArray(traits.CHAR, 250))])
-        ERROR_FILE_NOT_FOUND = platform.ConstantInteger(
-            'ERROR_FILE_NOT_FOUND')
-        ERROR_NO_MORE_FILES = platform.ConstantInteger(
-            'ERROR_NO_MORE_FILES')
-
-        GetFileExInfoStandard = platform.ConstantInteger(
-            'GetFileExInfoStandard')
-        FILE_ATTRIBUTE_DIRECTORY = platform.ConstantInteger(
-            'FILE_ATTRIBUTE_DIRECTORY')
-        FILE_ATTRIBUTE_READONLY = platform.ConstantInteger(
-            'FILE_ATTRIBUTE_READONLY')
-        INVALID_FILE_ATTRIBUTES = platform.ConstantInteger(
-            'INVALID_FILE_ATTRIBUTES')
-        ERROR_SHARING_VIOLATION = platform.ConstantInteger(
-            'ERROR_SHARING_VIOLATION')
-        _S_IFDIR = platform.ConstantInteger('_S_IFDIR')
-        _S_IFREG = platform.ConstantInteger('_S_IFREG')
-        _S_IFCHR = platform.ConstantInteger('_S_IFCHR')
-        _S_IFIFO = platform.ConstantInteger('_S_IFIFO')
-        FILE_TYPE_UNKNOWN = platform.ConstantInteger('FILE_TYPE_UNKNOWN')
-        FILE_TYPE_CHAR = platform.ConstantInteger('FILE_TYPE_CHAR')
-        FILE_TYPE_PIPE = platform.ConstantInteger('FILE_TYPE_PIPE')
-
-        FILE_WRITE_ATTRIBUTES = platform.ConstantInteger(
-            'FILE_WRITE_ATTRIBUTES')
-        OPEN_EXISTING = platform.ConstantInteger(
-            'OPEN_EXISTING')
-        FILE_FLAG_BACKUP_SEMANTICS = platform.ConstantInteger(
-            'FILE_FLAG_BACKUP_SEMANTICS')
-        VOLUME_NAME_DOS = platform.ConstantInteger('VOLUME_NAME_DOS')
-        VOLUME_NAME_NT = platform.ConstantInteger('VOLUME_NAME_NT')
-
-        WIN32_FILE_ATTRIBUTE_DATA = platform.Struct(
-            'WIN32_FILE_ATTRIBUTE_DATA',
-            [('dwFileAttributes', rwin32.DWORD),
-             ('nFileSizeHigh', rwin32.DWORD),
-             ('nFileSizeLow', rwin32.DWORD),
-             ('ftCreationTime', rwin32.FILETIME),
-             ('ftLastAccessTime', rwin32.FILETIME),
-             ('ftLastWriteTime', rwin32.FILETIME)])
-
-        BY_HANDLE_FILE_INFORMATION = platform.Struct(
-            'BY_HANDLE_FILE_INFORMATION',
-            [('dwFileAttributes', rwin32.DWORD),
-             ('ftCreationTime', rwin32.FILETIME),
-             ('ftLastAccessTime', rwin32.FILETIME),
-             ('ftLastWriteTime', rwin32.FILETIME),
-             ('dwVolumeSerialNumber', rwin32.DWORD),
-             ('nFileSizeHigh', rwin32.DWORD),
-             ('nFileSizeLow', rwin32.DWORD),
-             ('nNumberOfLinks', rwin32.DWORD),
-             ('nFileIndexHigh', rwin32.DWORD),
-             ('nFileIndexLow', rwin32.DWORD)])
-
-    config = platform.configure(CConfig)
-
-    def external(*args, **kwargs):
-        kwargs['compilation_info'] = CConfig._compilation_info_
-        llfunc = rffi.llexternal(calling_conv='win', *args, **kwargs)
-        return staticmethod(llfunc)
-
-    class Win32Traits:
-        apisuffix = suffix
-
-        for name in '''WIN32_FIND_DATA WIN32_FILE_ATTRIBUTE_DATA 
BY_HANDLE_FILE_INFORMATION
-                       GetFileExInfoStandard
-                       FILE_ATTRIBUTE_DIRECTORY FILE_ATTRIBUTE_READONLY
-                       INVALID_FILE_ATTRIBUTES
-                       _S_IFDIR _S_IFREG _S_IFCHR _S_IFIFO
-                       FILE_TYPE_UNKNOWN FILE_TYPE_CHAR FILE_TYPE_PIPE
-                       FILE_WRITE_ATTRIBUTES OPEN_EXISTING 
FILE_FLAG_BACKUP_SEMANTICS
-                       VOLUME_NAME_DOS VOLUME_NAME_NT
-                       ERROR_FILE_NOT_FOUND ERROR_NO_MORE_FILES
-                       ERROR_SHARING_VIOLATION
-                    '''.split():
-            locals()[name] = config[name]
-        LPWIN32_FIND_DATA    = lltype.Ptr(WIN32_FIND_DATA)
-        GET_FILEEX_INFO_LEVELS = rffi.ULONG # an enumeration
-
-        FindFirstFile = external('FindFirstFile' + suffix,
-                                 [traits.CCHARP, LPWIN32_FIND_DATA],
-                                 rwin32.HANDLE)
-        FindNextFile = external('FindNextFile' + suffix,
-                                [rwin32.HANDLE, LPWIN32_FIND_DATA],
-                                rwin32.BOOL)
-        FindClose = external('FindClose',
-                             [rwin32.HANDLE],
-                             rwin32.BOOL)
-
-        GetFileAttributes = external(
-            'GetFileAttributes' + suffix,
-            [traits.CCHARP],
-            rwin32.DWORD)
-
-        SetFileAttributes = external(
-            'SetFileAttributes' + suffix,
-            [traits.CCHARP, rwin32.DWORD],
-            rwin32.BOOL)
-
-        GetFileAttributesEx = external(
-            'GetFileAttributesEx' + suffix,
-            [traits.CCHARP, GET_FILEEX_INFO_LEVELS,
-             lltype.Ptr(WIN32_FILE_ATTRIBUTE_DATA)],
-            rwin32.BOOL)
-
-        GetFileInformationByHandle = external(
-            'GetFileInformationByHandle',
-            [rwin32.HANDLE, lltype.Ptr(BY_HANDLE_FILE_INFORMATION)],
-            rwin32.BOOL)
-
-        GetFileType = external(
-            'GetFileType',
-            [rwin32.HANDLE],
-            rwin32.DWORD)
-
-        LPSTRP = rffi.CArrayPtr(traits.CCHARP)
-
-        GetFullPathName = external(
-            'GetFullPathName' + suffix,
-            [traits.CCHARP, rwin32.DWORD,
-             traits.CCHARP, LPSTRP],
-            rwin32.DWORD)
-
-        GetCurrentDirectory = external(
-            'GetCurrentDirectory' + suffix,
-            [rwin32.DWORD, traits.CCHARP],
-            rwin32.DWORD)
-
-        SetCurrentDirectory = external(
-            'SetCurrentDirectory' + suffix,
-            [traits.CCHARP],
-            rwin32.BOOL)
-
-        CreateDirectory = external(
-            'CreateDirectory' + suffix,
-            [traits.CCHARP, rffi.VOIDP],
-            rwin32.BOOL)
-
-        SetEnvironmentVariable = external(
-            'SetEnvironmentVariable' + suffix,
-            [traits.CCHARP, traits.CCHARP],
-            rwin32.BOOL)
-
-        CreateFile = external(
-            'CreateFile' + apisuffix,
-            [traits.CCHARP, rwin32.DWORD, rwin32.DWORD,
-             rwin32.LPSECURITY_ATTRIBUTES, rwin32.DWORD, rwin32.DWORD,
-             rwin32.HANDLE],
-            rwin32.HANDLE)
-
-        DeleteFile = external(
-            'DeleteFile' + suffix,
-            [traits.CCHARP],
-            rwin32.BOOL)
-
-        MoveFile = external(
-            'MoveFile' + suffix,
-            [traits.CCHARP, traits.CCHARP],
-            rwin32.BOOL)
-
-    return Win32Traits
 
 #_______________________________________________________________
 # listdir
 
 def make_listdir_impl(traits):
     from rpython.rlib import rwin32
+    from rpython.rlib.rwin32file import make_win32_traits
+
     win32traits = make_win32_traits(traits)
 
     if traits.str is unicode:
@@ -256,6 +75,8 @@
 
 def make_chdir_impl(traits):
     from rpython.rlib import rwin32
+    from rpython.rlib.rwin32file import make_win32_traits
+
     win32traits = make_win32_traits(traits)
 
     if traits.str is unicode:
@@ -310,6 +131,8 @@
 
 def make_chmod_impl(traits):
     from rpython.rlib import rwin32
+    from rpython.rlib.rwin32file import make_win32_traits
+
     win32traits = make_win32_traits(traits)
 
     @func_renamer('chmod_llimpl_%s' % traits.str.__name__)
@@ -349,65 +172,3 @@
             lltype.free(lpBuffer, flavor='raw')
 
     return getfullpathname_llimpl
-
-def make_utime_impl(traits):
-    from rpython.rlib import rwin32
-    win32traits = make_win32_traits(traits)
-    from rpython.rtyper.module.ll_os_stat import time_t_to_FILE_TIME
-
-    GetSystemTime = rffi.llexternal(
-        'GetSystemTime',
-        [lltype.Ptr(rwin32.SYSTEMTIME)],
-        lltype.Void,
-        calling_conv='win')
-
-    SystemTimeToFileTime = rffi.llexternal(
-        'SystemTimeToFileTime',
-        [lltype.Ptr(rwin32.SYSTEMTIME),
-         lltype.Ptr(rwin32.FILETIME)],
-        rwin32.BOOL,
-        calling_conv='win')
-
-    SetFileTime = rffi.llexternal(
-        'SetFileTime',
-        [rwin32.HANDLE,
-         lltype.Ptr(rwin32.FILETIME),
-         lltype.Ptr(rwin32.FILETIME),
-         lltype.Ptr(rwin32.FILETIME)],
-        rwin32.BOOL,
-        calling_conv = 'win')
-
-    @specialize.argtype(1)
-    def os_utime_llimpl(path, tp):
-        hFile = win32traits.CreateFile(path,
-                           win32traits.FILE_WRITE_ATTRIBUTES, 0,
-                           None, win32traits.OPEN_EXISTING,
-                           win32traits.FILE_FLAG_BACKUP_SEMANTICS,
-                           rwin32.NULL_HANDLE)
-        if hFile == rwin32.INVALID_HANDLE_VALUE:
-            raise rwin32.lastWindowsError()
-        ctime = lltype.nullptr(rwin32.FILETIME)
-        atime = lltype.malloc(rwin32.FILETIME, flavor='raw')
-        mtime = lltype.malloc(rwin32.FILETIME, flavor='raw')
-        try:
-            if tp is None:
-                now = lltype.malloc(rwin32.SYSTEMTIME, flavor='raw')
-                try:
-                    GetSystemTime(now)
-                    if (not SystemTimeToFileTime(now, atime) or
-                        not SystemTimeToFileTime(now, mtime)):
-                        raise rwin32.lastWindowsError()
-                finally:
-                    lltype.free(now, flavor='raw')
-            else:
-                actime, modtime = tp
-                time_t_to_FILE_TIME(actime, atime)
-                time_t_to_FILE_TIME(modtime, mtime)
-            if not SetFileTime(hFile, ctime, atime, mtime):
-                raise rwin32.lastWindowsError()
-        finally:
-            rwin32.CloseHandle(hFile)
-            lltype.free(atime, flavor='raw')
-            lltype.free(mtime, flavor='raw')
-
-    return os_utime_llimpl
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to