Index: Modules/posixmodule.c =================================================================== --- Modules/posixmodule.c (revision 72598) +++ Modules/posixmodule.c (working copy) @@ -568,23 +568,36 @@ return PyErr_SetFromWindowsErr(errno); } +/* Functions suitable for O&& conversion */ static int -convert_to_unicode(PyObject **param) +convert_to_unicode(PyObject *arg, void* _param) { - if (PyUnicode_CheckExact(*param)) - Py_INCREF(*param); - else if (PyUnicode_Check(*param)) + PyObject **param = (PyObject**)_param; + if (PyUnicode_CheckExact(arg)) { + Py_INCREF(arg); + *param = arg; + } + else if (PyUnicode_Check(arg)) { /* For a Unicode subtype that's not a Unicode object, return a true Unicode object with the same data. */ - *param = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(*param), - PyUnicode_GET_SIZE(*param)); + *param = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(arg), + PyUnicode_GET_SIZE(arg)); + return *param != NULL; + } else - *param = PyUnicode_FromEncodedObject(*param, + *param = PyUnicode_FromEncodedObject(arg, Py_FileSystemDefaultEncoding, "strict"); return (*param) != NULL; } +static void +cleanup_unicode(void* _param) +{ + PyObject **param = (PyObject**)_param; + Py_DECREF(*param); +} + #endif /* Py_WIN_WIDE_FILENAMES */ #endif @@ -2648,26 +2661,22 @@ char *p1, *p2; BOOL result; if (unicode_file_names()) { - if (!PyArg_ParseTuple(args, "OO:rename", &o1, &o2)) - goto error; - if (!convert_to_unicode(&o1)) - goto error; - if (!convert_to_unicode(&o2)) { - Py_DECREF(o1); - goto error; + if (!PyArg_ParseTuple(args, "O&&O&&:rename", + convert_to_unicode, &o1, cleanup_unicode, + convert_to_unicode, &o2, cleanup_unicode)) + PyErr_Clear(); + else { + Py_BEGIN_ALLOW_THREADS + result = MoveFileW(PyUnicode_AsUnicode(o1), + PyUnicode_AsUnicode(o2)); + Py_END_ALLOW_THREADS + Py_DECREF(o1); + Py_DECREF(o2); + if (!result) + return win32_error("rename", NULL); + Py_INCREF(Py_None); + return Py_None; } - Py_BEGIN_ALLOW_THREADS - result = MoveFileW(PyUnicode_AsUnicode(o1), - PyUnicode_AsUnicode(o2)); - Py_END_ALLOW_THREADS - Py_DECREF(o1); - Py_DECREF(o2); - if (!result) - return win32_error("rename", NULL); - Py_INCREF(Py_None); - return Py_None; -error: - PyErr_Clear(); } if (!PyArg_ParseTuple(args, "ss:rename", &p1, &p2)) return NULL; Index: Python/getargs.c =================================================================== --- Python/getargs.c (revision 72598) +++ Python/getargs.c (working copy) @@ -1207,6 +1207,14 @@ if (! (*convert)(arg, addr)) return converterr("(unspecified)", arg, msgbuf, bufsize); + if (*format == '&') { + typedef void (*cleanupper)(void *); + cleanupper cleanup = va_arg(*p_va, cleanupper); + format++; + if (addcleanup(addr, freelist, cleanup)) + return converterr("(cleanup problem)", + arg, msgbuf, bufsize); + } } else { p = va_arg(*p_va, PyObject **);