diff -r d1b706e57fbe Modules/clinic/posixmodule.c.h --- a/Modules/clinic/posixmodule.c.h Thu Apr 23 11:25:41 2015 +0200 +++ b/Modules/clinic/posixmodule.c.h Thu Apr 23 21:56:50 2015 +0300 @@ -910,6 +910,40 @@ exit: #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" @@ -942,6 +976,40 @@ exit: #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" @@ -5467,10 +5535,18 @@ exit: #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) */ @@ -5870,4 +5946,4 @@ exit: #ifndef OS_SET_HANDLE_INHERITABLE_METHODDEF #define OS_SET_HANDLE_INHERITABLE_METHODDEF #endif /* !defined(OS_SET_HANDLE_INHERITABLE_METHODDEF) */ -/*[clinic end generated code: output=0e3fb3bb5df25fea input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d96ea7b59fb7a49f input=a9049054013a1b77]*/ diff -r d1b706e57fbe Modules/posixmodule.c --- a/Modules/posixmodule.c Thu Apr 23 11:25:41 2015 +0200 +++ b/Modules/posixmodule.c Thu Apr 23 21:56:50 2015 +0300 @@ -3728,62 +3728,53 @@ os_listdir_impl(PyModuleDef *module, pat #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); + } } @@ -3852,37 +3843,28 @@ os__getfinalpathname_impl(PyModuleDef *m 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 @@ -12331,10 +12313,8 @@ static PyMethodDef posix_methods[] = { 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