Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r68134:203930ef1f4f Date: 2013-11-15 09:41 +0100 http://bitbucket.org/pypy/pypy/changeset/203930ef1f4f/
Log: Windows: attempt to fix stat() for long ints. 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 @@ -466,16 +466,14 @@ def attribute_data_to_stat(info): st_mode = attributes_to_mode(info.c_dwFileAttributes) st_size = make_longlong(info.c_nFileSizeHigh, info.c_nFileSizeLow) - ctime, ctime_ns = FILE_TIME_to_time_t_nsec(info.c_ftCreationTime) - mtime, mtime_ns = FILE_TIME_to_time_t_nsec(info.c_ftLastWriteTime) - atime, atime_ns = FILE_TIME_to_time_t_nsec(info.c_ftLastAccessTime) + ctime = FILE_TIME_to_time_t_float(info.c_ftCreationTime) + mtime = FILE_TIME_to_time_t_float(info.c_ftLastWriteTime) + atime = FILE_TIME_to_time_t_float(info.c_ftLastAccessTime) result = (st_mode, 0, 0, 0, 0, 0, st_size, - float(atime) + atime_ns * 1e-9, - float(mtime) + mtime_ns * 1e-9, - float(ctime) + ctime_ns * 1e-9) + atime, mtime, ctime) return make_stat_result(result) @@ -483,9 +481,9 @@ # similar to the one above st_mode = attributes_to_mode(info.c_dwFileAttributes) st_size = make_longlong(info.c_nFileSizeHigh, info.c_nFileSizeLow) - ctime, ctime_ns = FILE_TIME_to_time_t_nsec(info.c_ftCreationTime) - mtime, mtime_ns = FILE_TIME_to_time_t_nsec(info.c_ftLastWriteTime) - atime, atime_ns = FILE_TIME_to_time_t_nsec(info.c_ftLastAccessTime) + ctime = FILE_TIME_to_time_t_float(info.c_ftCreationTime) + mtime = FILE_TIME_to_time_t_float(info.c_ftLastWriteTime) + atime = FILE_TIME_to_time_t_float(info.c_ftLastAccessTime) # specific to fstat() st_ino = make_longlong(info.c_nFileIndexHigh, info.c_nFileIndexLow) @@ -494,9 +492,7 @@ result = (st_mode, st_ino, 0, st_nlink, 0, 0, st_size, - atime + atime_ns * 1e-9, - mtime + mtime_ns * 1e-9, - ctime + ctime_ns * 1e-9) + atime, mtime, ctime) return make_stat_result(result) @@ -579,12 +575,10 @@ # Seconds between 1.1.1601 and 1.1.1970 secs_between_epochs = rffi.r_longlong(11644473600) -def FILE_TIME_to_time_t_nsec(filetime): +def FILE_TIME_to_time_t_float(filetime): ft = make_longlong(filetime.c_dwHighDateTime, filetime.c_dwLowDateTime) # FILETIME is in units of 100 nsec - nsec = (ft % 10000000) * 100 - time = (ft / 10000000) - secs_between_epochs - return intmask(time), intmask(nsec) + return float(ft) * (1.0 / 10000000.0) - secs_between_epochs def time_t_to_FILE_TIME(time, filetime): ft = rffi.r_longlong((time + secs_between_epochs) * 10000000) diff --git a/rpython/rtyper/module/test/test_ll_os.py b/rpython/rtyper/module/test/test_ll_os.py --- a/rpython/rtyper/module/test/test_ll_os.py +++ b/rpython/rtyper/module/test/test_ll_os.py @@ -76,6 +76,11 @@ t1 = 1159195039.25 compile(f, (str, float))(str(fname), t1) assert t1 == os.stat(str(fname)).st_mtime + if sys.version_info < (2, 7): + py.test.skip('requires Python 2.7') + t1 = 5000000000.0 + compile(f, (str, float))(str(fname), t1) + assert t1 == os.stat(str(fname)).st_mtime def test__getfullpathname(): if os.name != 'nt': diff --git a/rpython/rtyper/module/test/test_ll_os_stat.py b/rpython/rtyper/module/test/test_ll_os_stat.py --- a/rpython/rtyper/module/test/test_ll_os_stat.py +++ b/rpython/rtyper/module/test/test_ll_os_stat.py @@ -1,4 +1,5 @@ from rpython.rtyper.module import ll_os_stat, ll_os +from rpython.tool.udir import udir import sys, os import py @@ -33,3 +34,13 @@ fstat = ll_os_stat.make_win32_stat_impl('fstat', ll_os.StringTraits()) stat = fstat(0) # stdout assert stat.st_mode != 0 + + def test_stat_large_number(self): + if sys.version_info < (2, 7): + py.test.skip('requires Python 2.7') + fname = udir.join('test_stat_large_number.txt') + fname.ensure() + t1 = 5000000000.0 + os.utime(str(fname), (t1, t1)) + stat = ll_os_stat.make_win32_stat_impl('stat', ll_os.StringTraits()) + assert stat(str(fname)).st_mtime == t1 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit