[Python-checkins] r70161 - in python/branches/py3k: Lib/test/test_fileio.py Modules/_fileio.c

antoine.pitrou python-checkins at python.org
Wed Mar 4 12:14:02 CET 2009


Author: antoine.pitrou
Date: Wed Mar  4 12:14:01 2009
New Revision: 70161

Log:
Fix failures introduced by buggy merge (1)



Modified:
   python/branches/py3k/Lib/test/test_fileio.py
   python/branches/py3k/Modules/_fileio.c

Modified: python/branches/py3k/Lib/test/test_fileio.py
==============================================================================
--- python/branches/py3k/Lib/test/test_fileio.py	(original)
+++ python/branches/py3k/Lib/test/test_fileio.py	Wed Mar  4 12:14:01 2009
@@ -193,8 +193,8 @@
             os.unlink(TESTFN)
 
     def testInvalidFd(self):
-        self.assertRaises(ValueError, _fileio._FileIO, -10)
-        self.assertRaises(OSError, _fileio._FileIO, make_bad_fd())
+        self.assertRaises(ValueError, _FileIO, -10)
+        self.assertRaises(OSError, _FileIO, make_bad_fd())
 
     def testBadModeArgument(self):
         # verify that we get a sensible error message for bad mode argument

Modified: python/branches/py3k/Modules/_fileio.c
==============================================================================
--- python/branches/py3k/Modules/_fileio.c	(original)
+++ python/branches/py3k/Modules/_fileio.c	Wed Mar  4 12:14:01 2009
@@ -57,13 +57,15 @@
 
 #define PyFileIO_Check(op) (PyObject_TypeCheck((op), &PyFileIO_Type))
 
-
 int
 _PyFileIO_closed(PyObject *self)
 {
 	return ((PyFileIOObject *)self)->fd < 0;
 }
 
+static PyObject *
+portable_lseek(int fd, PyObject *posobj, int whence);
+
 /* Returns 0 on success, -1 with exception set on failure. */
 static int
 internal_close(PyFileIOObject *self)
@@ -156,7 +158,7 @@
 {
 #if defined(HAVE_FSTAT)
 	struct stat buf;
-	if (fstat(fd, &buf) < 0 && errno == EBADF) {
+	if (!_PyVerify_fd(fd) || (fstat(fd, &buf) < 0 && errno == EBADF)) {
 		PyObject *exc;
 		char *msg = strerror(EBADF);
 		exc = PyObject_CallFunction(PyExc_OSError, "(is)",
@@ -176,7 +178,7 @@
 	PyFileIOObject *self = (PyFileIOObject *) oself;
 	static char *kwlist[] = {"file", "mode", "closefd", NULL};
 	const char *name = NULL;
-	PyObject *nameobj;
+	PyObject *nameobj, *stringobj = NULL;
 	char *mode = "r";
 	char *s;
 #ifdef MS_WINDOWS
@@ -226,26 +228,27 @@
 	if (fd < 0)
 	{
 		if (PyBytes_Check(nameobj) || PyByteArray_Check(nameobj)) {
-			if (PyObject_AsCharBuffer(nameobj, &name, NULL) < 0)
+			Py_ssize_t namelen;
+			if (PyObject_AsCharBuffer(nameobj, &name, &namelen) < 0)
 				return -1;
 		}
 		else {
-			PyObject *s;
 			PyObject *u = PyUnicode_FromObject(nameobj);
 
 			if (u == NULL)
 				return -1;
 
-			s = PyUnicode_AsEncodedString(
+			stringobj = PyUnicode_AsEncodedString(
 				u, Py_FileSystemDefaultEncoding, NULL);
 			Py_DECREF(u);
-			if (s == NULL)
+			if (stringobj == NULL)
 				return -1;
-			if (!PyBytes_Check(s)) {
+			if (!PyBytes_Check(stringobj)) {
 				PyErr_SetString(PyExc_TypeError,
 						"encoder failed to return bytes");
+				goto error;
 			}
-			name = PyBytes_AS_STRING(s);
+			name = PyBytes_AS_STRING(stringobj);
 		}
 	}
 
@@ -312,10 +315,10 @@
 #endif
 
 	if (fd >= 0) {
-		self->fd = fd;
-		self->closefd = closefd;
 		if (check_fd(fd))
 			goto error;
+		self->fd = fd;
+		self->closefd = closefd;
 	}
 	else {
 		self->closefd = 1;
@@ -350,12 +353,23 @@
 	if (PyObject_SetAttrString((PyObject *)self, "name", nameobj) < 0)
 		goto error;
 
+	if (append) {
+		/* For consistent behaviour, we explicitly seek to the
+		   end of file (otherwise, it might be done only on the
+		   first write()). */
+		PyObject *pos = portable_lseek(self->fd, NULL, 2);
+		if (pos == NULL)
+			goto error;
+		Py_DECREF(pos);
+	}
+
 	goto done;
 
  error:
 	ret = -1;
 
  done:
+	Py_CLEAR(stringobj);
 	return ret;
 }
 
@@ -942,14 +956,14 @@
 
 PyTypeObject PyFileIO_Type = {
 	PyVarObject_HEAD_INIT(NULL, 0)
-	"FileIO",
+	"_io.FileIO",
 	sizeof(PyFileIOObject),
 	0,
 	(destructor)fileio_dealloc,		/* tp_dealloc */
 	0,					/* tp_print */
 	0,					/* tp_getattr */
 	0,					/* tp_setattr */
-	0,					/* tp_compare */
+	0,					/* tp_reserved */
 	(reprfunc)fileio_repr,			/* tp_repr */
 	0,					/* tp_as_number */
 	0,					/* tp_as_sequence */


More information about the Python-checkins mailing list