[pypy-commit] pypy more-rposix: Fix translation on Windows
amauryfa
noreply at buildbot.pypy.org
Mon Apr 6 22:21:29 CEST 2015
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: more-rposix
Changeset: r76730:7cc288b7e843
Date: 2015-04-06 22:17 +0200
http://bitbucket.org/pypy/pypy/changeset/7cc288b7e843/
Log: Fix translation on Windows
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -1033,7 +1033,7 @@
handle_posix_error('rename',
c_rename(_as_bytes0(path1), _as_bytes0(path2)))
else:
- traits = _preferred_traits(path)
+ traits = _preferred_traits(path1)
win32traits = make_win32_traits(traits)
path1 = traits.as_str0(path1)
path2 = traits.as_str0(path2)
@@ -1087,8 +1087,8 @@
finally:
lltype.free(pwrite, flavor='raw')
lltype.free(pread, flavor='raw')
- fdread = _open_osfhandle(hread, 0)
- fdwrite = _open_osfhandle(hwrite, 1)
+ fdread = c_open_osfhandle(hread, 0)
+ fdwrite = c_open_osfhandle(hwrite, 1)
return (fdread, fdwrite)
else:
filedes = lltype.malloc(INT_ARRAY_P.TO, 2, flavor='raw')
diff --git a/rpython/rlib/rposix_stat.py b/rpython/rlib/rposix_stat.py
--- a/rpython/rlib/rposix_stat.py
+++ b/rpython/rlib/rposix_stat.py
@@ -14,12 +14,18 @@
from rpython.rlib.objectmodel import specialize
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.translator.tool.cbuild import ExternalCompilationInfo
+from rpython.rlib.rarithmetic import intmask
from rpython.rlib.rposix import (
- replace_os_function, handle_posix_error, _as_bytes0)
+ replace_os_function, handle_posix_error, _as_bytes0,
+ _preferred_traits, string_traits)
_WIN32 = sys.platform.startswith('win')
_LINUX = sys.platform.startswith('linux')
+if _WIN32:
+ from rpython.rlib import rwin32
+ from rpython.rlib.rwin32file import make_win32_traits
+
# Support for float times is here.
# - ALL_STAT_FIELDS contains Float fields if the system can retrieve
# sub-second timestamps.
@@ -321,93 +327,94 @@
# Implement and register os.stat() & variants
-c_fstat = rffi.llexternal('fstat64' if _LINUX else 'fstat',
- [rffi.INT, STAT_STRUCT], rffi.INT,
- compilation_info=compilation_info,
- save_err=rffi.RFFI_SAVE_ERRNO,
- macro=True)
-c_stat = rffi.llexternal('stat64' if _LINUX else 'stat',
- [rffi.CCHARP, STAT_STRUCT], rffi.INT,
- compilation_info=compilation_info,
- save_err=rffi.RFFI_SAVE_ERRNO,
- macro=True)
-c_lstat = rffi.llexternal('lstat64' if _LINUX else 'lstat',
- [rffi.CCHARP, STAT_STRUCT], rffi.INT,
- compilation_info=compilation_info,
- save_err=rffi.RFFI_SAVE_ERRNO,
- macro=True)
+if not _WIN32:
+ c_fstat = rffi.llexternal('fstat64' if _LINUX else 'fstat',
+ [rffi.INT, STAT_STRUCT], rffi.INT,
+ compilation_info=compilation_info,
+ save_err=rffi.RFFI_SAVE_ERRNO,
+ macro=True)
+ c_stat = rffi.llexternal('stat64' if _LINUX else 'stat',
+ [rffi.CCHARP, STAT_STRUCT], rffi.INT,
+ compilation_info=compilation_info,
+ save_err=rffi.RFFI_SAVE_ERRNO,
+ macro=True)
+ c_lstat = rffi.llexternal('lstat64' if _LINUX else 'lstat',
+ [rffi.CCHARP, STAT_STRUCT], rffi.INT,
+ compilation_info=compilation_info,
+ save_err=rffi.RFFI_SAVE_ERRNO,
+ macro=True)
-c_fstatvfs = rffi.llexternal('fstatvfs',
- [rffi.INT, STATVFS_STRUCT], rffi.INT,
- compilation_info=compilation_info,
- save_err=rffi.RFFI_SAVE_ERRNO)
-c_statvfs = rffi.llexternal('statvfs',
- [rffi.CCHARP, STATVFS_STRUCT], rffi.INT,
- compilation_info=compilation_info,
- save_err=rffi.RFFI_SAVE_ERRNO)
+ c_fstatvfs = rffi.llexternal('fstatvfs',
+ [rffi.INT, STATVFS_STRUCT], rffi.INT,
+ compilation_info=compilation_info,
+ save_err=rffi.RFFI_SAVE_ERRNO)
+ c_statvfs = rffi.llexternal('statvfs',
+ [rffi.CCHARP, STATVFS_STRUCT], rffi.INT,
+ compilation_info=compilation_info,
+ save_err=rffi.RFFI_SAVE_ERRNO)
@replace_os_function('fstat')
def fstat(fd):
- with lltype.scoped_alloc(STAT_STRUCT.TO) as stresult:
- if not _WIN32:
+ if not _WIN32:
+ with lltype.scoped_alloc(STAT_STRUCT.TO) as stresult:
handle_posix_error('fstat', c_fstat(fd, stresult))
return build_stat_result(stresult)
- else:
- handle = rwin32.get_osfhandle(fd)
- filetype = win32traits.GetFileType(handle)
- if filetype == win32traits.FILE_TYPE_CHAR:
- # console or LPT device
- return make_stat_result((win32traits._S_IFCHR,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0))
- elif filetype == win32traits.FILE_TYPE_PIPE:
- # socket or named pipe
- return make_stat_result((win32traits._S_IFIFO,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0))
- elif filetype == win32traits.FILE_TYPE_UNKNOWN:
- error = rwin32.GetLastError_saved()
- if error != 0:
- raise WindowsError(error, "os_fstat failed")
- # else: unknown but valid file
+ else:
+ handle = rwin32.get_osfhandle(fd)
+ win32traits = make_win32_traits(string_traits)
+ filetype = win32traits.GetFileType(handle)
+ if filetype == win32traits.FILE_TYPE_CHAR:
+ # console or LPT device
+ return make_stat_result((win32traits._S_IFCHR,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0))
+ elif filetype == win32traits.FILE_TYPE_PIPE:
+ # socket or named pipe
+ return make_stat_result((win32traits._S_IFIFO,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0))
+ elif filetype == win32traits.FILE_TYPE_UNKNOWN:
+ error = rwin32.GetLastError_saved()
+ if error != 0:
+ raise WindowsError(error, "os_fstat failed")
+ # else: unknown but valid file
- # normal disk file (FILE_TYPE_DISK)
- info = lltype.malloc(win32traits.BY_HANDLE_FILE_INFORMATION,
- flavor='raw', zero=True)
- try:
- res = win32traits.GetFileInformationByHandle(handle, info)
- if res == 0:
- raise WindowsError(rwin32.GetLastError_saved(),
- "os_fstat failed")
- return win32_by_handle_info_to_stat(info)
- finally:
- lltype.free(info, flavor='raw')
+ # normal disk file (FILE_TYPE_DISK)
+ info = lltype.malloc(win32traits.BY_HANDLE_FILE_INFORMATION,
+ flavor='raw', zero=True)
+ try:
+ res = win32traits.GetFileInformationByHandle(handle, info)
+ if res == 0:
+ raise WindowsError(rwin32.GetLastError_saved(),
+ "os_fstat failed")
+ return win32_by_handle_info_to_stat(win32traits, info)
+ finally:
+ lltype.free(info, flavor='raw')
@replace_os_function('stat')
@specialize.argtype(0)
def stat(path):
- with lltype.scoped_alloc(STAT_STRUCT.TO) as stresult:
- if not _WIN32:
+ if not _WIN32:
+ with lltype.scoped_alloc(STAT_STRUCT.TO) as stresult:
arg = _as_bytes0(path)
handle_posix_error('stat', c_stat(arg, stresult))
return build_stat_result(stresult)
- else:
- traits = _preferred_traits(path)
- path = traits._as_str0(path)
- return win32_xstat(path, traverse=True)
+ else:
+ traits = _preferred_traits(path)
+ path = traits.as_str0(path)
+ return win32_xstat(traits, path, traverse=True)
@replace_os_function('lstat')
@specialize.argtype(0)
def lstat(path):
- with lltype.scoped_alloc(STAT_STRUCT.TO) as stresult:
- if not _WIN32:
+ if not _WIN32:
+ with lltype.scoped_alloc(STAT_STRUCT.TO) as stresult:
arg = _as_bytes0(path)
handle_posix_error('lstat', c_stat(arg, stresult))
- else:
- traits = _preferred_traits(path)
- arg = traits._as_str0(path)
- handle_posix_error('lstat', c_stat(arg, stresult))
- return build_stat_result(stresult)
+ else:
+ traits = _preferred_traits(path)
+ path = traits.as_str0(path)
+ return win32_xstat(traits, path, traverse=False)
@replace_os_function('fstatvfs')
def fstatvfs(fd):
@@ -434,6 +441,7 @@
# Seconds between 1.1.1601 and 1.1.1970
secs_between_epochs = rffi.r_longlong(11644473600)
+ @specialize.arg(0)
def win32_xstat(traits, path, traverse=False):
win32traits = make_win32_traits(traits)
with lltype.scoped_alloc(
@@ -443,13 +451,15 @@
if res == 0:
errcode = rwin32.GetLastError_saved()
if errcode == win32traits.ERROR_SHARING_VIOLATION:
- res = win32_attributes_from_dir(path, data)
+ res = win32_attributes_from_dir(
+ win32traits, path, data)
if res == 0:
errcode = rwin32.GetLastError_saved()
raise WindowsError(errcode, "os_stat failed")
- return attribute_data_to_stat(data)
+ return win32_attribute_data_to_stat(win32traits, data)
- def win32_attributes_to_mode(attributes):
+ @specialize.arg(0)
+ def win32_attributes_to_mode(win32traits, attributes):
m = 0
attributes = intmask(attributes)
if attributes & win32traits.FILE_ATTRIBUTE_DIRECTORY:
@@ -462,8 +472,9 @@
m |= 0666
return m
- def win32_attribute_data_to_stat(info):
- st_mode = win32_attributes_to_mode(info.c_dwFileAttributes)
+ @specialize.arg(0)
+ def win32_attribute_data_to_stat(win32traits, info):
+ st_mode = win32_attributes_to_mode(win32traits, info.c_dwFileAttributes)
st_size = make_longlong(info.c_nFileSizeHigh, info.c_nFileSizeLow)
ctime = FILE_TIME_to_time_t_float(info.c_ftCreationTime)
mtime = FILE_TIME_to_time_t_float(info.c_ftLastWriteTime)
@@ -476,9 +487,9 @@
return make_stat_result(result)
- def win32_by_handle_info_to_stat(info):
+ def win32_by_handle_info_to_stat(win32traits, info):
# similar to the one above
- st_mode = win32_attributes_to_mode(info.c_dwFileAttributes)
+ st_mode = win32_attributes_to_mode(win32traits, info.c_dwFileAttributes)
st_size = make_longlong(info.c_nFileSizeHigh, info.c_nFileSizeLow)
ctime = FILE_TIME_to_time_t_float(info.c_ftCreationTime)
mtime = FILE_TIME_to_time_t_float(info.c_ftLastWriteTime)
@@ -495,10 +506,11 @@
return make_stat_result(result)
- def win32_attributes_from_dir(l_path, data):
+ @specialize.arg(0)
+ def win32_attributes_from_dir(win32traits, path, data):
filedata = lltype.malloc(win32traits.WIN32_FIND_DATA, flavor='raw')
try:
- hFindFile = win32traits.FindFirstFile(l_path, filedata)
+ hFindFile = win32traits.FindFirstFile(path, filedata)
if hFindFile == rwin32.INVALID_HANDLE_VALUE:
return 0
win32traits.FindClose(hFindFile)
diff --git a/rpython/rtyper/module/support.py b/rpython/rtyper/module/support.py
--- a/rpython/rtyper/module/support.py
+++ b/rpython/rtyper/module/support.py
@@ -117,6 +117,7 @@
return path.as_unicode()
@staticmethod
+ @specialize.argtype(0)
def as_str0(path):
res = UnicodeTraits.as_str(path)
rstring.check_str0(res)
More information about the pypy-commit
mailing list