Author: Armin Rigo <[email protected]>
Branch:
Changeset: r87263:adb3947f8bb6
Date: 2016-09-21 13:36 +0200
http://bitbucket.org/pypy/pypy/changeset/adb3947f8bb6/
Log: Tweaks: don't use 'int(float-value-of-st.st_Xtime)': because
precision loss can occur, this could in theory give a result that is
one larger than what the system call returned.
diff --git a/pypy/module/posix/interp_posix.py
b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -226,13 +226,13 @@
w_keywords = space.newdict()
stat_float_times = space.fromcache(StatState).stat_float_times
for i, (name, TYPE) in FIELDS:
- value = getattr(st, name)
- if name in ('st_atime', 'st_mtime', 'st_ctime'):
- value = int(value) # rounded to an integer for indexed access
- w_value = space.wrap(value)
if i < rposix_stat.N_INDEXABLE_FIELDS:
+ # get the first 10 items by indexing; this gives us
+ # 'st_Xtime' as an integer, too
+ w_value = space.wrap(st[i])
lst[i] = w_value
- else:
+ elif name.startswith('st_'): # exclude 'nsec_Xtime'
+ w_value = space.wrap(getattr(st, name))
space.setitem(w_keywords, space.wrap(name), w_value)
# non-rounded values for name-based access
@@ -243,13 +243,8 @@
space.wrap('st_mtime'), space.wrap(st.st_mtime))
space.setitem(w_keywords,
space.wrap('st_ctime'), space.wrap(st.st_ctime))
- else:
- space.setitem(w_keywords,
- space.wrap('st_atime'), space.wrap(int(st.st_atime)))
- space.setitem(w_keywords,
- space.wrap('st_mtime'), space.wrap(int(st.st_mtime)))
- space.setitem(w_keywords,
- space.wrap('st_ctime'), space.wrap(int(st.st_ctime)))
+ #else:
+ # filled by the __init__ method
w_tuple = space.newtuple(lst)
w_stat_result = space.getattr(space.getbuiltinmodule(os.name),
diff --git a/pypy/module/posix/test/test_posix2.py
b/pypy/module/posix/test/test_posix2.py
--- a/pypy/module/posix/test/test_posix2.py
+++ b/pypy/module/posix/test/test_posix2.py
@@ -129,9 +129,9 @@
assert st[4] == st.st_uid
assert st[5] == st.st_gid
assert st[6] == st.st_size
- assert st[7] == int(st.st_atime)
- assert st[8] == int(st.st_mtime)
- assert st[9] == int(st.st_ctime)
+ assert st[7] == int(st.st_atime) # in complete corner cases, rounding
+ assert st[8] == int(st.st_mtime) # here could maybe get the wrong
+ assert st[9] == int(st.st_ctime) # integer...
assert stat.S_IMODE(st.st_mode) & stat.S_IRUSR
assert stat.S_IMODE(st.st_mode) & stat.S_IWUSR
@@ -141,13 +141,12 @@
assert st.st_size == 14
assert st.st_nlink == 1
- #if sys.platform.startswith('linux'):
- # # expects non-integer timestamps - it's unlikely that they are
- # # all three integers
- # assert ((st.st_atime, st.st_mtime, st.st_ctime) !=
- # (st[7], st[8], st[9]))
- # assert st.st_blksize * st.st_blocks >= st.st_size
+ assert not hasattr(st, 'nsec_atime')
+
if sys.platform.startswith('linux'):
+ assert isinstance(st.st_atime, float)
+ assert isinstance(st.st_mtime, float)
+ assert isinstance(st.st_ctime, float)
assert hasattr(st, 'st_rdev')
def test_stat_float_times(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit