diff options
author | Nicholas Bastin <nick.bastin@gmail.com> | 2004-03-21 20:24:07 (GMT) |
---|---|---|
committer | Nicholas Bastin <nick.bastin@gmail.com> | 2004-03-21 20:24:07 (GMT) |
commit | abce8a681c499382de3cb8fbdf5b2eba036eca26 (patch) | |
tree | 47f8436f72945a1ae69b57b4c49c852d87e33121 | |
parent | 67867eaf8ceca3d061194b7819832aae05202c8c (diff) | |
download | cpython-abce8a681c499382de3cb8fbdf5b2eba036eca26.zip cpython-abce8a681c499382de3cb8fbdf5b2eba036eca26.tar.gz cpython-abce8a681c499382de3cb8fbdf5b2eba036eca26.tar.bz2 |
Changed file.name to be the object passed as the 'name' argument to file()
Fixes SF Bug #773356
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Objects/fileobject.c | 38 |
2 files changed, 23 insertions, 17 deletions
@@ -12,6 +12,8 @@ What's New in Python 2.4 alpha 1? 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 - Optimized the byte coding for multiple assignments like "a,b=b,a" and diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 1e8be6a..c973366 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -95,8 +95,8 @@ dircheck(PyFileObject* f) static PyObject * -fill_file_fields(PyFileObject *f, FILE *fp, char *name, char *mode, - int (*close)(FILE *), PyObject *wname) +fill_file_fields(PyFileObject *f, FILE *fp, PyObject *name, char *mode, + int (*close)(FILE *)) { assert(f != NULL); assert(PyFile_Check(f)); @@ -105,12 +105,10 @@ fill_file_fields(PyFileObject *f, FILE *fp, char *name, char *mode, Py_DECREF(f->f_name); Py_DECREF(f->f_mode); Py_DECREF(f->f_encoding); -#ifdef Py_USING_UNICODE - if (wname) - f->f_name = PyUnicode_FromObject(wname); - else -#endif - f->f_name = PyString_FromString(name); + + Py_INCREF (name); + f->f_name = name; + f->f_mode = PyString_FromString(mode); f->f_close = close; @@ -202,11 +200,7 @@ open_the_file(PyFileObject *f, char *name, char *mode) PyErr_Format(PyExc_IOError, "invalid mode: %s", mode); else -#ifdef MS_WINDOWS PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, f->f_name); -#else - PyErr_SetFromErrnoWithFilename(PyExc_IOError, name); -#endif /* MS_WINDOWS */ f = NULL; } if (f != NULL) @@ -220,10 +214,12 @@ PyFile_FromFile(FILE *fp, char *name, char *mode, int (*close)(FILE *)) PyFileObject *f = (PyFileObject *)PyFile_Type.tp_new(&PyFile_Type, NULL, 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); f = NULL; } + Py_DECREF(o_name); } return (PyObject *) f; } @@ -1853,8 +1849,8 @@ file_init(PyObject *self, PyObject *args, PyObject *kwds) if (PyArg_ParseTupleAndKeywords(args, kwds, "U|si:file", kwlist, &po, &mode, &bufsize)) { wideargument = 1; - if (fill_file_fields(foself, NULL, name, mode, - fclose, po) == NULL) + if (fill_file_fields(foself, NULL, po, mode, + fclose) == NULL) goto Error; } else { /* Drop the argument parsing error as narrow @@ -1865,13 +1861,21 @@ file_init(PyObject *self, PyObject *args, PyObject *kwds) #endif if (!wideargument) { + PyObject *o_name; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "et|si:file", kwlist, Py_FileSystemDefaultEncoding, &name, &mode, &bufsize)) 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; } if (open_the_file(foself, name, mode) == NULL) |