[pypy-svn] r46263 - in pypy/branch/pypy-more-rtti-inprogress: rpython/module translator/c/test
arigo at codespeak.net
arigo at codespeak.net
Mon Sep 3 12:23:36 CEST 2007
Author: arigo
Date: Mon Sep 3 12:23:36 2007
New Revision: 46263
Modified:
pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_os_stat.py
pypy/branch/pypy-more-rtti-inprogress/translator/c/test/test_extfunc.py
Log:
os.stat() returns bogus times on Windows.
Skip the tests for now. This check-in contains the start
of the "correct" implementation and the reason why I stopped
working on it for now.
Modified: pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_os_stat.py
==============================================================================
--- pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_os_stat.py (original)
+++ pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_os_stat.py Mon Sep 3 12:23:36 2007
@@ -199,3 +199,58 @@
"ll_os.ll_os_%s" % (name,),
llimpl=func_with_new_name(os_mystat_llimpl,
'os_%s_llimpl' % (name,)))
+
+# ____________________________________________________________
+
+if 0:
+ XXX - """
+ disabled for now:
+ error codes are different when returned from the Win32 API,
+ which makes things a mess that I don't want to tackle now...
+ """
+ # The CRT of Windows has a number of flaws wrt. its stat() implementation:
+ # - for when we implement subsecond resolution in RPython, time stamps
+ # would be restricted to second resolution
+ # - file modification times suffer from forth-and-back conversions between
+ # UTC and local time
+ # Therefore, we implement our own stat, based on the Win32 API directly.
+ from pypy.rpython.tool import rffi_platform as platform
+
+ assert len(STAT_FIELDS) == 10 # no extra fields on Windows
+ FILETIME = rffi.CStruct('_FILETIME', ('dwLowDateTime', rffi.LONG),
+ ('dwHighDateTime', rffi.LONG))
+ class CConfig:
+ GET_FILEEX_INFO_LEVELS = platform.SimpleType('GET_FILEEX_INFO_LEVELS',
+ rffi.INT)
+ GetFileExInfoStandard = platform.ConstantInteger(
+ 'GetFileExInfoStandard')
+ WIN32_FILE_ATTRIBUTE_DATA = platform.Struct(
+ '_WIN32_FILE_ATTRIBUTE_DATA',
+ [('dwFileAttributes', rffi.ULONG),
+ ('nFileSizeHigh', rffi.ULONG),
+ ('nFileSizeLow', rffi.ULONG),
+ ('ftCreationTime', FILETIME),
+ ('ftLastAccessTime', FILETIME),
+ ('ftCreationTime', FILETIME)])
+
+ globals().update(platform.configure(CConfig))
+
+ GetFileAttributesEx = rffi.llexternal(
+ 'GetFileAttributesExA', [rffi.CCHARP,
+ GET_FILEEX_INFO_LEVELS,
+ lltype.Ptr(WIN32_FILE_ATTRIBUTE_DATA)],
+ rffi.INT)
+
+ def os_stat_llimpl(path):
+ data = lltype.malloc(WIN32_FILE_ATTRIBUTE_DATA, flavor='raw')
+ try:
+ l_path = rffi.str2charp(path)
+ res = GetFileAttributesEx(l_path, GetFileExInfoStandard, data)
+ rffi.free_charp(l_path)
+ if res == 0:
+ # ignore the GetLastError() which is a number that we cannot
+ # easily report...
+ XXX
+ YYY
+ finally:
+ lltype.free(data, flavor='raw')
Modified: pypy/branch/pypy-more-rtti-inprogress/translator/c/test/test_extfunc.py
==============================================================================
--- pypy/branch/pypy-more-rtti-inprogress/translator/c/test/test_extfunc.py (original)
+++ pypy/branch/pypy-more-rtti-inprogress/translator/c/test/test_extfunc.py Mon Sep 3 12:23:36 2007
@@ -176,6 +176,8 @@
res = f()
assert res[0] == os.stat(filename).st_mode
assert res[1] == os.stat(filename).st_ino
+ if sys.platform.startswith('win'):
+ py.test.skip("in-progress - bogus stat().st_time")
st_ctime = res[2]
if isinstance(st_ctime, float):
assert st_ctime == os.stat(filename).st_ctime
@@ -200,6 +202,8 @@
os.close(fd)
assert st_mode == osstat.st_mode
assert st_ino == osstat.st_ino
+ if sys.platform.startswith('win'):
+ py.test.skip("in-progress - bogus stat().st_time")
if isinstance(st_mtime, float):
assert st_mtime == osstat.st_mtime
else:
More information about the Pypy-commit
mailing list