[Python-checkins] cpython: Converted os._getfullpathname() and os._isdir() to Argument Clinic.

serhiy.storchaka python-checkins at python.org
Tue May 12 23:53:00 CEST 2015


https://hg.python.org/cpython/rev/4d7175af607e
changeset:   95994:4d7175af607e
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Wed May 13 00:52:39 2015 +0300
summary:
  Converted os._getfullpathname() and os._isdir() to Argument Clinic.

files:
  Modules/clinic/posixmodule.c.h |   74 +++++++++++++-
  Modules/posixmodule.c          |  112 ++++++++------------
  2 files changed, 119 insertions(+), 67 deletions(-)


diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h
--- a/Modules/clinic/posixmodule.c.h
+++ b/Modules/clinic/posixmodule.c.h
@@ -890,6 +890,38 @@
 
 #if defined(MS_WINDOWS)
 
+PyDoc_STRVAR(os__getfullpathname__doc__,
+"_getfullpathname($module, path, /)\n"
+"--\n"
+"\n");
+
+#define OS__GETFULLPATHNAME_METHODDEF    \
+    {"_getfullpathname", (PyCFunction)os__getfullpathname, METH_O, os__getfullpathname__doc__},
+
+static PyObject *
+os__getfullpathname_impl(PyModuleDef *module, path_t *path);
+
+static PyObject *
+os__getfullpathname(PyModuleDef *module, PyObject *arg)
+{
+    PyObject *return_value = NULL;
+    path_t path = PATH_T_INITIALIZE("_getfullpathname", "path", 0, 0);
+
+    if (!PyArg_Parse(arg, "O&:_getfullpathname", path_converter, &path))
+        goto exit;
+    return_value = os__getfullpathname_impl(module, &path);
+
+exit:
+    /* Cleanup for path */
+    path_cleanup(&path);
+
+    return return_value;
+}
+
+#endif /* defined(MS_WINDOWS) */
+
+#if defined(MS_WINDOWS)
+
 PyDoc_STRVAR(os__getfinalpathname__doc__,
 "_getfinalpathname($module, path, /)\n"
 "--\n"
@@ -920,6 +952,38 @@
 
 #if defined(MS_WINDOWS)
 
+PyDoc_STRVAR(os__isdir__doc__,
+"_isdir($module, path, /)\n"
+"--\n"
+"\n");
+
+#define OS__ISDIR_METHODDEF    \
+    {"_isdir", (PyCFunction)os__isdir, METH_O, os__isdir__doc__},
+
+static PyObject *
+os__isdir_impl(PyModuleDef *module, path_t *path);
+
+static PyObject *
+os__isdir(PyModuleDef *module, PyObject *arg)
+{
+    PyObject *return_value = NULL;
+    path_t path = PATH_T_INITIALIZE("_isdir", "path", 0, 0);
+
+    if (!PyArg_Parse(arg, "O&:_isdir", path_converter, &path))
+        goto exit;
+    return_value = os__isdir_impl(module, &path);
+
+exit:
+    /* Cleanup for path */
+    path_cleanup(&path);
+
+    return return_value;
+}
+
+#endif /* defined(MS_WINDOWS) */
+
+#if defined(MS_WINDOWS)
+
 PyDoc_STRVAR(os__getvolumepathname__doc__,
 "_getvolumepathname($module, /, path)\n"
 "--\n"
@@ -5313,10 +5377,18 @@
     #define OS_LINK_METHODDEF
 #endif /* !defined(OS_LINK_METHODDEF) */
 
+#ifndef OS__GETFULLPATHNAME_METHODDEF
+    #define OS__GETFULLPATHNAME_METHODDEF
+#endif /* !defined(OS__GETFULLPATHNAME_METHODDEF) */
+
 #ifndef OS__GETFINALPATHNAME_METHODDEF
     #define OS__GETFINALPATHNAME_METHODDEF
 #endif /* !defined(OS__GETFINALPATHNAME_METHODDEF) */
 
+#ifndef OS__ISDIR_METHODDEF
+    #define OS__ISDIR_METHODDEF
+#endif /* !defined(OS__ISDIR_METHODDEF) */
+
 #ifndef OS__GETVOLUMEPATHNAME_METHODDEF
     #define OS__GETVOLUMEPATHNAME_METHODDEF
 #endif /* !defined(OS__GETVOLUMEPATHNAME_METHODDEF) */
@@ -5716,4 +5788,4 @@
 #ifndef OS_SET_HANDLE_INHERITABLE_METHODDEF
     #define OS_SET_HANDLE_INHERITABLE_METHODDEF
 #endif /* !defined(OS_SET_HANDLE_INHERITABLE_METHODDEF) */
-/*[clinic end generated code: output=bba73c13a01c09a0 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=f3f92b2d2e2c3fe3 input=a9049054013a1b77]*/
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -3748,62 +3748,53 @@
 
 #ifdef MS_WINDOWS
 /* A helper function for abspath on win32 */
-/* AC 3.5: probably just convert to using path converter */
-static PyObject *
-posix__getfullpathname(PyObject *self, PyObject *args)
-{
-    const char *path;
-    char outbuf[MAX_PATH];
-    char *temp;
-    PyObject *po;
-
-    if (PyArg_ParseTuple(args, "U|:_getfullpathname", &po))
+/*[clinic input]
+os._getfullpathname
+
+    path: path_t
+    /
+
+[clinic start generated code]*/
+
+static PyObject *
+os__getfullpathname_impl(PyModuleDef *module, path_t *path)
+/*[clinic end generated code: output=b90b1f103b08773f input=332ed537c29d0a3e]*/
+{
+    if (!path->narrow)
     {
-        wchar_t *wpath;
         wchar_t woutbuf[MAX_PATH], *woutbufp = woutbuf;
         wchar_t *wtemp;
         DWORD result;
         PyObject *v;
 
-        wpath = PyUnicode_AsUnicode(po);
-        if (wpath == NULL)
-            return NULL;
-        result = GetFullPathNameW(wpath,
+        result = GetFullPathNameW(path->wide,
                                   Py_ARRAY_LENGTH(woutbuf),
                                   woutbuf, &wtemp);
         if (result > Py_ARRAY_LENGTH(woutbuf)) {
             woutbufp = PyMem_New(wchar_t, result);
             if (!woutbufp)
                 return PyErr_NoMemory();
-            result = GetFullPathNameW(wpath, result, woutbufp, &wtemp);
+            result = GetFullPathNameW(path->wide, result, woutbufp, &wtemp);
         }
         if (result)
             v = PyUnicode_FromWideChar(woutbufp, wcslen(woutbufp));
         else
-            v = win32_error_object("GetFullPathNameW", po);
+            v = win32_error_object("GetFullPathNameW", path->object);
         if (woutbufp != woutbuf)
             PyMem_Free(woutbufp);
         return v;
     }
-    /* Drop the argument parsing error as narrow strings
-       are also valid. */
-    PyErr_Clear();
-
-    if (!PyArg_ParseTuple (args, "y:_getfullpathname",
-                           &path))
-        return NULL;
-    if (win32_warn_bytes_api())
-        return NULL;
-    if (!GetFullPathName(path, Py_ARRAY_LENGTH(outbuf),
-                         outbuf, &temp)) {
-        win32_error("GetFullPathName", path);
-        return NULL;
-    }
-    if (PyUnicode_Check(PyTuple_GetItem(args, 0))) {
-        return PyUnicode_Decode(outbuf, strlen(outbuf),
-                                Py_FileSystemDefaultEncoding, NULL);
-    }
-    return PyBytes_FromString(outbuf);
+    else {
+        char outbuf[MAX_PATH];
+        char *temp;
+
+        if (!GetFullPathName(path->narrow, Py_ARRAY_LENGTH(outbuf),
+                             outbuf, &temp)) {
+            win32_error_object("GetFullPathName", path->object);
+            return NULL;
+        }
+        return PyBytes_FromString(outbuf);
+    }
 }
 
 
@@ -3872,37 +3863,28 @@
 PyDoc_STRVAR(posix__isdir__doc__,
 "Return true if the pathname refers to an existing directory.");
 
-/* AC 3.5: convert using path converter */
-static PyObject *
-posix__isdir(PyObject *self, PyObject *args)
-{
-    const char *path;
-    PyObject *po;
+/*[clinic input]
+os._isdir
+
+    path: path_t
+    /
+
+[clinic start generated code]*/
+
+static PyObject *
+os__isdir_impl(PyModuleDef *module, path_t *path)
+/*[clinic end generated code: output=f17b2d4e1994b0ff input=e794f12faab62a2a]*/
+{
     DWORD attributes;
 
-    if (PyArg_ParseTuple(args, "U|:_isdir", &po)) {
-        wchar_t *wpath = PyUnicode_AsUnicode(po);
-        if (wpath == NULL)
-            return NULL;
-
-        attributes = GetFileAttributesW(wpath);
-        if (attributes == INVALID_FILE_ATTRIBUTES)
-            Py_RETURN_FALSE;
-        goto check;
-    }
-    /* Drop the argument parsing error as narrow strings
-       are also valid. */
-    PyErr_Clear();
-
-    if (!PyArg_ParseTuple(args, "y:_isdir", &path))
-        return NULL;
-    if (win32_warn_bytes_api())
-        return NULL;
-    attributes = GetFileAttributesA(path);
+    if (!path->narrow)
+        attributes = GetFileAttributesW(path->wide);
+    else
+        attributes = GetFileAttributesA(path->narrow);
+
     if (attributes == INVALID_FILE_ATTRIBUTES)
         Py_RETURN_FALSE;
 
-check:
     if (attributes & FILE_ATTRIBUTE_DIRECTORY)
         Py_RETURN_TRUE;
     else
@@ -12351,10 +12333,8 @@
     OS_FPATHCONF_METHODDEF
     OS_PATHCONF_METHODDEF
     OS_ABORT_METHODDEF
-#ifdef MS_WINDOWS
-    {"_getfullpathname",        posix__getfullpathname, METH_VARARGS, NULL},
-    {"_isdir",                  posix__isdir, METH_VARARGS, posix__isdir__doc__},
-#endif
+    OS__GETFULLPATHNAME_METHODDEF
+    OS__ISDIR_METHODDEF
     OS__GETDISKUSAGE_METHODDEF
     OS__GETFINALPATHNAME_METHODDEF
     OS__GETVOLUMEPATHNAME_METHODDEF

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list