[Python-checkins] r57019 - python/branches/alex-py3k/Modules/_bytesiomodule.c python/branches/alex-py3k/Modules/_stringiomodule.c

alexandre.vassalotti python-checkins at python.org
Tue Aug 14 16:25:53 CEST 2007


Author: alexandre.vassalotti
Date: Tue Aug 14 16:25:52 2007
New Revision: 57019

Modified:
   python/branches/alex-py3k/Modules/_bytesiomodule.c
   python/branches/alex-py3k/Modules/_stringiomodule.c
Log:
Remove duplicate code in writelines() by using the write() method.


Modified: python/branches/alex-py3k/Modules/_bytesiomodule.c
==============================================================================
--- python/branches/alex-py3k/Modules/_bytesiomodule.c	(original)
+++ python/branches/alex-py3k/Modules/_bytesiomodule.c	Tue Aug 14 16:25:52 2007
@@ -415,8 +415,7 @@
 bytesio_writelines(BytesIOObject *self, PyObject *v)
 {
     PyObject *it, *item;
-    const char *bytes;
-    Py_ssize_t len;
+    PyObject *ret;
 
     if (self->buf == NULL)
         return err_closed();
@@ -426,17 +425,11 @@
         return NULL;
 
     while ((item = PyIter_Next(it)) != NULL) {
-        if (PyObject_AsCharBuffer(item, &bytes, &len) < 0) {
-            Py_DECREF(it);
-            Py_DECREF(item);
+        ret = bytesio_write(self, item);
+        if (ret == NULL)
             return NULL;
-        }
+        Py_DECREF(ret);
         Py_DECREF(item);
-
-        if (write_bytes(self, bytes, len) == -1) {
-            Py_DECREF(it);
-            return NULL;
-        }
     }
     Py_DECREF(it);
 

Modified: python/branches/alex-py3k/Modules/_stringiomodule.c
==============================================================================
--- python/branches/alex-py3k/Modules/_stringiomodule.c	(original)
+++ python/branches/alex-py3k/Modules/_stringiomodule.c	Tue Aug 14 16:25:52 2007
@@ -363,30 +363,36 @@
 }
 
 static PyObject *
-stringio_write(StringIOObject *self, PyObject *args)
+stringio_write(StringIOObject *self, PyObject *obj)
 {
-    const Py_UNICODE *ustr;
-    Py_ssize_t len, n;
+    const Py_UNICODE *str;
+    Py_ssize_t size, n;
 
     if (self->buf == NULL)
         return err_closed();
 
-    if (!PyArg_ParseTuple(args,
-                  "u#;write() may only be called on"
-                  " unicode strings", &ustr, &n))
+    if (PyUnicode_Check(obj)) {
+        str = PyUnicode_AsUnicode(obj);
+        size = PyUnicode_GetSize(obj);
+    }
+    else {
+        PyErr_Format(PyExc_TypeError, "expected a string, got %s instead",
+                     Py_Type(obj)->tp_name);
         return NULL;
+    }
 
-    len = write_str(self, ustr, n);
-    if (len == -1)
+    n = write_str(self, str, size);
+    if (n == -1)
         return NULL;
 
-    return PyInt_FromSsize_t(len);
+    return PyInt_FromSsize_t(n);
 }
 
 static PyObject *
 stringio_writelines(StringIOObject *self, PyObject *v)
 {
     PyObject *it, *item;
+    PyObject *ret;
 
     if (self->buf == NULL)
         return err_closed();
@@ -396,22 +402,11 @@
         return NULL;
 
     while ((item = PyIter_Next(it)) != NULL) {
-        Py_ssize_t n;
-        Py_UNICODE *ustr;
-        if ((ustr = PyUnicode_AsUnicode(item)) == NULL) {
-            PyErr_SetString(PyExc_TypeError,
-                    "Need a list of unicode objects");
-            Py_DECREF(it);
-            Py_DECREF(item);
+        ret = stringio_write(self, item);
+        if (ret == NULL)
             return NULL;
-        }
-        n = PyUnicode_GetSize(item);
+        Py_DECREF(ret);
         Py_DECREF(item);
-
-        if (write_str(self, ustr, n) == -1) {
-            Py_DECREF(it);
-            return NULL;
-        }
     }
     Py_DECREF(it);
 
@@ -593,7 +588,7 @@
      StringIO_close_doc},
     {"seek",       (PyCFunction) stringio_seek, METH_VARARGS,
      StringIO_seek_doc},
-    {"write",      (PyCFunction) stringio_write, METH_VARARGS,
+    {"write",      (PyCFunction) stringio_write, METH_O,
      StringIO_write_doc},
     {"writelines", (PyCFunction) stringio_writelines, METH_O,
      StringIO_writelines_doc},


More information about the Python-checkins mailing list