[Python-checkins] r67103 - in sandbox/trunk/io-c: io.c io.py

amaury.forgeotdarc python-checkins at python.org
Tue Nov 4 22:37:44 CET 2008


Author: amaury.forgeotdarc
Date: Tue Nov 4 22:37:44 2008
New Revision: 67103
Log:
Implement io.BufferedRWPair
Modified:
 sandbox/trunk/io-c/io.c
 sandbox/trunk/io-c/io.py
Modified: sandbox/trunk/io-c/io.c
==============================================================================
--- sandbox/trunk/io-c/io.c	(original)
+++ sandbox/trunk/io-c/io.c	Tue Nov 4 22:37:44 2008
@@ -726,6 +726,7 @@
 Py_RETURN_FALSE;
 }
 
+/* May be called with any object */
 static int
 IOBase_checkReadable(PyObject *self)
 {
@@ -752,6 +753,7 @@
 Py_RETURN_FALSE;
 }
 
+/* May be called with any object */
 static int
 IOBase_checkWritable(PyObject *self)
 {
@@ -1561,7 +1563,7 @@
 self->raw = raw;
 
 self->buffer_size = buffer_size;
- self->read_buf = NULL;
+ self->read_buf = NULL;
 
 if( _BufferedReader_reset_read_buf(self) < 0)
 return -1;
@@ -2379,6 +2381,227 @@
 };
 
 
+
+/*
+ * BufferedRWPair
+ */
+
+PyDoc_STRVAR(BufferedRWPair_doc,
+ "A buffered reader and writer object together.\n"
+ "\n"
+ "A buffered reader object and buffered writer object put together to\n"
+ "form a sequential IO object that can read and write. This is typically\n"
+ "used with a socket or two-way pipe.\n"
+ "\n"
+ "reader and writer are RawIOBase objects that are readable and\n"
+ "writeable respectively. If the buffer_size is omitted it defaults to\n"
+ "DEFAULT_BUFFER_SIZE. The max_buffer_size (for the buffered writer)\n"
+ "defaults to twice the buffer size.\n"
+ );
+
+/* XXX The usefulness of this (compared to having two separate IO objects) is
+ * questionable.
+ */
+
+typedef struct {
+ PyObject_HEAD
+ BufferedObject *reader;
+ BufferedObject *writer;
+} BufferedRWPairObject;
+
+static int
+BufferedRWPair_init(BufferedRWPairObject *self, PyObject *args,
+ PyObject *kwds)
+{
+ PyObject *reader, *writer;
+ Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE;
+ Py_ssize_t max_buffer_size = -1;
+
+ if (!PyArg_ParseTuple(args, "OO|nn:BufferedRWPair", &reader, &writer,
+			 &buffer_size, &max_buffer_size)) {
+ return -1;
+ }
+
+ if (IOBase_checkReadable(reader) < 0)
+	return -1;
+ if (IOBase_checkWritable(writer) < 0)
+	return -1;
+
+ args = Py_BuildValue("(n)", buffer_size);
+ if (args == NULL) {
+	Py_CLEAR(self->reader);
+	return -1;
+ }
+ self->reader = (BufferedObject*)PyType_GenericNew(&BufferedReader_Type, args, NULL);
+ Py_DECREF(args);
+ if (self->reader == NULL)
+	return -1;
+
+ args = Py_BuildValue("(nn)", buffer_size, max_buffer_size);
+ if (args == NULL) {
+	Py_CLEAR(self->reader);
+	return -1;
+ }
+ self->writer = (BufferedObject*)PyType_GenericNew(&BufferedWriter_Type, args, NULL);
+ Py_DECREF(args);
+ if (self->writer == NULL) {
+	Py_CLEAR(self->reader);
+	return -1;
+ }
+ return 0;
+}
+
+static void
+BufferedRWPair_dealloc(BufferedRWPairObject *self)
+{
+ Py_CLEAR(self->reader);
+ Py_CLEAR(self->writer);
+}
+
+static PyObject *
+_forward_call(BufferedObject *self, const char* name, PyObject *args)
+{
+ PyObject *func = PyObject_GetAttrString((PyObject*)self, name);
+ PyObject *ret;
+
+ if (func == NULL) {
+	PyErr_SetString(PyExc_AttributeError, name);
+	return NULL;
+ }
+
+ ret = PyObject_CallObject(func, args);
+ Py_DECREF(func);
+ return ret;
+}
+
+static PyObject *
+BufferedRWPair_read(BufferedRWPairObject *self, PyObject *args)
+{
+ return _forward_call(self->reader, "read", args);
+}
+
+static PyObject *
+BufferedRWPair_peek(BufferedRWPairObject *self, PyObject *args)
+{
+ return _forward_call(self->reader, "peek", args);
+}
+
+static PyObject *
+BufferedRWPair_read1(BufferedRWPairObject *self, PyObject *args)
+{
+ return _forward_call(self->reader, "read1", args);
+}
+
+static PyObject *
+BufferedRWPair_write(BufferedRWPairObject *self, PyObject *args)
+{
+ return _forward_call(self->writer, "write", args);
+}
+
+static PyObject *
+BufferedRWPair_flush(BufferedRWPairObject *self, PyObject *args)
+{
+ return _forward_call(self->writer, "flush", args);
+}
+
+static PyObject *
+BufferedRWPair_readable(BufferedRWPairObject *self, PyObject *args)
+{
+ return _forward_call(self->reader, "readable", args);
+}
+
+static PyObject *
+BufferedRWPair_writable(BufferedRWPairObject *self, PyObject *args)
+{
+ return _forward_call(self->writer, "writable", args);
+}
+
+static PyObject *
+BufferedRWPair_close(BufferedRWPairObject *self, PyObject *args)
+{
+ PyObject *ret = _forward_call(self->writer, "close", args);
+ if (ret == NULL)
+	return NULL;
+ Py_DECREF(ret);
+
+ return _forward_call(self->reader, "close", args);
+}
+
+static PyObject *
+BufferedRWPair_isatty(BufferedRWPairObject *self, PyObject *args)
+{
+ PyObject *ret = _forward_call(self->writer, "isatty", args);
+
+ if (ret != Py_False) {
+	/* either True or exception */
+	return ret;
+ }
+ Py_DECREF(ret);
+
+ return _forward_call(self->reader, "isatty", args);
+}
+
+
+static PyMethodDef BufferedRWPair_methods[] = {
+ {"read", (PyCFunction)BufferedRWPair_read, METH_VARARGS},
+ {"peek", (PyCFunction)BufferedRWPair_peek, METH_VARARGS},
+ {"read1", (PyCFunction)BufferedRWPair_read1, METH_VARARGS},
+
+ {"write", (PyCFunction)BufferedRWPair_write, METH_VARARGS},
+ {"flush", (PyCFunction)BufferedRWPair_flush, METH_NOARGS},
+
+ {"readable", (PyCFunction)BufferedRWPair_readable, METH_NOARGS},
+ {"writable", (PyCFunction)BufferedRWPair_writable, METH_NOARGS},
+
+ {"close", (PyCFunction)BufferedRWPair_close, METH_NOARGS},
+ {"isatty", (PyCFunction)BufferedRWPair_isatty, METH_NOARGS},
+
+ {NULL, NULL}
+};
+
+PyTypeObject BufferedRWPair_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "BufferedRWPair", /*tp_name*/
+ sizeof(BufferedObject), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)BufferedRWPair_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare */
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash */
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ BufferedRWPair_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ offsetof(BufferedObject, weakreflist), /*tp_weaklistoffset*/
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ BufferedRWPair_methods, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ offsetof(BufferedObject, dict), /* tp_dictoffset */
+ (initproc)BufferedRWPair_init, /* tp_init */
+ 0, /* tp_alloc */
+ PyType_GenericNew, /* tp_new */
+};
+
+
+
 /*
 * BufferedRandom
 */
@@ -2769,6 +2992,13 @@
 Py_INCREF(&BufferedWriter_Type);
 PyModule_AddObject(m, "BufferedWriter", (PyObject *) &BufferedWriter_Type);
 
+ /* BufferedRWPair */
+ BufferedRWPair_Type.tp_base = &_BufferedIOBase_Type;
+ if (PyType_Ready(&BufferedRWPair_Type) < 0)
+ goto fail;
+ Py_INCREF(&BufferedRWPair_Type);
+ PyModule_AddObject(m, "BufferedRWPair", (PyObject *) &BufferedRWPair_Type);
+
 /* BufferedRandom */
 BufferedRandom_Type.tp_base = &_BufferedIOBase_Type;
 if (PyType_Ready(&BufferedRandom_Type) < 0)
Modified: sandbox/trunk/io-c/io.py
==============================================================================
--- sandbox/trunk/io-c/io.py	(original)
+++ sandbox/trunk/io-c/io.py	Tue Nov 4 22:37:44 2008
@@ -1106,7 +1106,7 @@
 BufferedWriter = _io.BufferedWriter
 
 
-class BufferedRWPair(BufferedIOBase):
+class unused_BufferedRWPair(BufferedIOBase):
 
 """A buffered reader and writer object together.
 
@@ -1170,6 +1170,7 @@
 @property
 def closed(self):
 return self.writer.closed()
+BufferedRWPair = _io.BufferedRWPair
 
 class unused_BufferedRandom(unused_BufferedWriter, unused_BufferedReader):
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /