Commit 160a2e6f authored by Nicholas Bastin's avatar Nicholas Bastin

Changed file.name to be the object passed as the 'name' argument to file()

Fixes SF Bug #773356
parent afbafaa0
...@@ -12,6 +12,8 @@ What's New in Python 2.4 alpha 1? ...@@ -12,6 +12,8 @@ What's New in Python 2.4 alpha 1?
Core and builtins Core and builtins
----------------- -----------------
- Set file.name to the object passed to open (instead of a new string)
- Moved tracebackobject into traceback.h and renamed to PyTracebackObject - Moved tracebackobject into traceback.h and renamed to PyTracebackObject
- Optimized the byte coding for multiple assignments like "a,b=b,a" and - Optimized the byte coding for multiple assignments like "a,b=b,a" and
......
...@@ -95,8 +95,8 @@ dircheck(PyFileObject* f) ...@@ -95,8 +95,8 @@ dircheck(PyFileObject* f)
static PyObject * static PyObject *
fill_file_fields(PyFileObject *f, FILE *fp, char *name, char *mode, fill_file_fields(PyFileObject *f, FILE *fp, PyObject *name, char *mode,
int (*close)(FILE *), PyObject *wname) int (*close)(FILE *))
{ {
assert(f != NULL); assert(f != NULL);
assert(PyFile_Check(f)); assert(PyFile_Check(f));
...@@ -105,12 +105,10 @@ fill_file_fields(PyFileObject *f, FILE *fp, char *name, char *mode, ...@@ -105,12 +105,10 @@ fill_file_fields(PyFileObject *f, FILE *fp, char *name, char *mode,
Py_DECREF(f->f_name); Py_DECREF(f->f_name);
Py_DECREF(f->f_mode); Py_DECREF(f->f_mode);
Py_DECREF(f->f_encoding); Py_DECREF(f->f_encoding);
#ifdef Py_USING_UNICODE
if (wname) Py_INCREF (name);
f->f_name = PyUnicode_FromObject(wname); f->f_name = name;
else
#endif
f->f_name = PyString_FromString(name);
f->f_mode = PyString_FromString(mode); f->f_mode = PyString_FromString(mode);
f->f_close = close; f->f_close = close;
...@@ -202,11 +200,7 @@ open_the_file(PyFileObject *f, char *name, char *mode) ...@@ -202,11 +200,7 @@ open_the_file(PyFileObject *f, char *name, char *mode)
PyErr_Format(PyExc_IOError, "invalid mode: %s", PyErr_Format(PyExc_IOError, "invalid mode: %s",
mode); mode);
else else
#ifdef MS_WINDOWS
PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, f->f_name); PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, f->f_name);
#else
PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
#endif /* MS_WINDOWS */
f = NULL; f = NULL;
} }
if (f != NULL) if (f != NULL)
...@@ -220,10 +214,12 @@ PyFile_FromFile(FILE *fp, char *name, char *mode, int (*close)(FILE *)) ...@@ -220,10 +214,12 @@ PyFile_FromFile(FILE *fp, char *name, char *mode, int (*close)(FILE *))
PyFileObject *f = (PyFileObject *)PyFile_Type.tp_new(&PyFile_Type, PyFileObject *f = (PyFileObject *)PyFile_Type.tp_new(&PyFile_Type,
NULL, NULL); NULL, NULL);
if (f != NULL) { if (f != NULL) {
if (fill_file_fields(f, fp, name, mode, close, NULL) == NULL) { PyObject *o_name = PyString_FromString(name);
if (fill_file_fields(f, fp, o_name, mode, close) == NULL) {
Py_DECREF(f); Py_DECREF(f);
f = NULL; f = NULL;
} }
Py_DECREF(o_name);
} }
return (PyObject *) f; return (PyObject *) f;
} }
...@@ -1853,8 +1849,8 @@ file_init(PyObject *self, PyObject *args, PyObject *kwds) ...@@ -1853,8 +1849,8 @@ file_init(PyObject *self, PyObject *args, PyObject *kwds)
if (PyArg_ParseTupleAndKeywords(args, kwds, "U|si:file", if (PyArg_ParseTupleAndKeywords(args, kwds, "U|si:file",
kwlist, &po, &mode, &bufsize)) { kwlist, &po, &mode, &bufsize)) {
wideargument = 1; wideargument = 1;
if (fill_file_fields(foself, NULL, name, mode, if (fill_file_fields(foself, NULL, po, mode,
fclose, po) == NULL) fclose) == NULL)
goto Error; goto Error;
} else { } else {
/* Drop the argument parsing error as narrow /* Drop the argument parsing error as narrow
...@@ -1865,13 +1861,21 @@ file_init(PyObject *self, PyObject *args, PyObject *kwds) ...@@ -1865,13 +1861,21 @@ file_init(PyObject *self, PyObject *args, PyObject *kwds)
#endif #endif
if (!wideargument) { if (!wideargument) {
PyObject *o_name;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "et|si:file", kwlist, if (!PyArg_ParseTupleAndKeywords(args, kwds, "et|si:file", kwlist,
Py_FileSystemDefaultEncoding, Py_FileSystemDefaultEncoding,
&name, &name,
&mode, &bufsize)) &mode, &bufsize))
return -1; return -1;
if (fill_file_fields(foself, NULL, name, mode,
fclose, NULL) == NULL) /* We parse again to get the name as a PyObject */
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|si:file", kwlist,
&o_name, &mode, &bufsize))
return -1;
if (fill_file_fields(foself, NULL, o_name, mode,
fclose) == NULL)
goto Error; goto Error;
} }
if (open_the_file(foself, name, mode) == NULL) if (open_the_file(foself, name, mode) == NULL)
......
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