Author: Philip Jenvey <pjen...@underboss.org>
Branch: py3k
Changeset: r84694:022c27e72693
Date: 2016-05-25 21:09 -0700
http://bitbucket.org/pypy/pypy/changeset/022c27e72693/

Log:    refactor into do_utimes

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
@@ -1448,39 +1448,47 @@
             # see comment above
             raise wrap_oserror(space, e)
 
+    if (rposix.HAVE_LUTIMES and
+        (dir_fd == DEFAULT_DIR_FD and not follow_symlinks)):
+        if path.as_bytes is None:
+            raise oefmt(space.w_NotImplementedError,
+                        "utime: unsupported value for 'path'")
+        do_utimes(space, rposix.lutimes, path.as_bytes,
+                  atime_s, atime_ns, mtime_s, mtime_ns, now)
+        return
+
+    if not follow_symlinks:
+        raise argument_unavailable(space, "utime", "follow_symlinks")
+
+    do_utimes(space, rposix.utime, path,
+              atime_s, atime_ns, mtime_s, mtime_ns, now)
+
+
+@specialize.arg(1)
+def do_utimes(space, func, arg, atime_s, atime_ns, mtime_s, mtime_ns, now):
+    """Common implementation for f/l/utimes"""
+    # convert back to utimes style floats. loses precision of
+    # nanoseconds but utimes only support microseconds anyway
     if now:
         # satisfy the translator
         atime = mtime = 0.0
     else:
-        # convert back to utimes style floats. loses precision of
-        # nanoseconds but utimes only support microseconds anyway
         atime = atime_s + (atime_ns / 1e9)
         mtime = mtime_s + (mtime_ns / 1e9)
 
-    if (rposix.HAVE_LUTIMES and
-        (dir_fd == DEFAULT_DIR_FD and not follow_symlinks)):
-        path_b = path.as_bytes
-        if path_b is None:
-            raise oefmt(space.w_NotImplementedError,
-                        "utime: unsupported value for 'path'")
-        try:
+    try:
+        if func is rposix.utime:
+            # XXX: specialize rposix.utime taking a Path (call_rposix)
+            # for win32 (unicode filenames) support
             if now:
-                rposix.lutimes(path_b, None)
+                call_rposix(utime_now, arg, None)
             else:
-                rposix.lutimes(path_b, (atime, mtime))
-            return
-        except OSError as e:
-            # see comment above
-            raise wrap_oserror(space, e)
-
-    if not follow_symlinks:
-        raise argument_unavailable(space, "utime", "follow_symlinks")
-
-    try:
-        if now:
-            call_rposix(utime_now, path, None)
+                call_rposix(rposix.utime, arg, (atime, mtime))
         else:
-            call_rposix(rposix.utime, path, (atime, mtime))
+            if now:
+                func(arg, None)
+            else:
+                func(arg, (atime, mtime))
     except OSError as e:
         # see comment above
         raise wrap_oserror(space, e)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to