]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Changed file.name to be the object passed as the 'name' argument to file()
authorNicholas Bastin <nick.bastin@gmail.com>
Sun, 21 Mar 2004 20:24:07 +0000 (20:24 +0000)
committerNicholas Bastin <nick.bastin@gmail.com>
Sun, 21 Mar 2004 20:24:07 +0000 (20:24 +0000)
Fixes SF Bug #773356

Misc/NEWS
Objects/fileobject.c

index dfb64322f80221b17a8fea08c0c3f4f3bc134f1f..a1655e7b37bf505e7c9689808c41fc1796fe0557 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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
index 1e8be6a393013e19a27e382176805ae6ba8f66a8..c97336602d1dea1e271adf73d4ae8a7ef3468daf 100644 (file)
@@ -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)