Commit 11f8b687 authored by Ezio Melotti's avatar Ezio Melotti

#14161: fix the __repr__ of file objects to escape the file name.

parent f60845b7
...@@ -89,6 +89,13 @@ class AutoFileTests(unittest.TestCase): ...@@ -89,6 +89,13 @@ class AutoFileTests(unittest.TestCase):
def testRepr(self): def testRepr(self):
# verify repr works # verify repr works
self.assertTrue(repr(self.f).startswith("<open file '" + TESTFN)) self.assertTrue(repr(self.f).startswith("<open file '" + TESTFN))
# see issue #14161
# Windows doesn't like \r\n\t" in the file name, but ' is ok
fname = 'xx\rxx\nxx\'xx"xx' if sys.platform != "win32" else "xx'xx"
with open(fname, 'w') as f:
self.addCleanup(os.remove, fname)
self.assertTrue(repr(f).startswith(
"<open file %r, mode 'w' at" % fname))
def testErrors(self): def testErrors(self):
self.f.close() self.f.close()
......
...@@ -9,6 +9,8 @@ What's New in Python 2.7.4 ...@@ -9,6 +9,8 @@ What's New in Python 2.7.4
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #14161: fix the __repr__ of file objects to escape the file name.
- Issue #1469629: Allow cycles through an object's __dict__ slot to be - Issue #1469629: Allow cycles through an object's __dict__ slot to be
collected. (For example if ``x.__dict__ is x``). collected. (For example if ``x.__dict__ is x``).
......
...@@ -635,10 +635,11 @@ file_dealloc(PyFileObject *f) ...@@ -635,10 +635,11 @@ file_dealloc(PyFileObject *f)
static PyObject * static PyObject *
file_repr(PyFileObject *f) file_repr(PyFileObject *f)
{ {
PyObject *ret = NULL;
PyObject *name = NULL;
if (PyUnicode_Check(f->f_name)) { if (PyUnicode_Check(f->f_name)) {
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE
PyObject *ret = NULL; name = PyUnicode_AsUnicodeEscapeString(f->f_name);
PyObject *name = PyUnicode_AsUnicodeEscapeString(f->f_name);
const char *name_str = name ? PyString_AsString(name) : "?"; const char *name_str = name ? PyString_AsString(name) : "?";
ret = PyString_FromFormat("<%s file u'%s', mode '%s' at %p>", ret = PyString_FromFormat("<%s file u'%s', mode '%s' at %p>",
f->f_fp == NULL ? "closed" : "open", f->f_fp == NULL ? "closed" : "open",
...@@ -649,11 +650,16 @@ file_repr(PyFileObject *f) ...@@ -649,11 +650,16 @@ file_repr(PyFileObject *f)
return ret; return ret;
#endif #endif
} else { } else {
return PyString_FromFormat("<%s file '%s', mode '%s' at %p>", name = PyObject_Repr(f->f_name);
if (name == NULL)
return NULL;
ret = PyString_FromFormat("<%s file %s, mode '%s' at %p>",
f->f_fp == NULL ? "closed" : "open", f->f_fp == NULL ? "closed" : "open",
PyString_AsString(f->f_name), PyString_AsString(name),
PyString_AsString(f->f_mode), PyString_AsString(f->f_mode),
f); f);
Py_XDECREF(name);
return ret;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment