diff -r 3653d8174b0b Modules/_io/textio.c --- a/Modules/_io/textio.c Sat Feb 02 15:12:59 2013 -0800 +++ b/Modules/_io/textio.c Sun Feb 03 10:42:13 2013 +0200 @@ -290,8 +290,9 @@ return NULL; if (!PyUnicode_Check(output)) { - PyErr_SetString(PyExc_TypeError, - "decoder should return a string result"); + PyErr_Format(PyExc_TypeError, + "decoder should return a string result, not '%.200s'", + Py_TYPE(output)->tp_name); goto error; } @@ -1458,7 +1459,13 @@ Py_DECREF(chunk_size); if (input_chunk == NULL) goto fail; - assert(PyBytes_Check(input_chunk)); + if (!PyBytes_Check(input_chunk)) { + PyErr_Format(PyExc_IOError, + "underlying %s() should have returned a bytes object, " + "not '%.200s'", (self->has_read1 ? "read1": "read"), + Py_TYPE(input_chunk)->tp_name); + goto fail; + } nbytes = PyBytes_Size(input_chunk); eof = (nbytes == 0); @@ -1493,7 +1500,14 @@ PyObject *next_input = PyNumber_Add(dec_buffer, input_chunk); if (next_input == NULL) goto fail; - assert (PyBytes_Check(next_input)); + if (!PyBytes_Check(next_input)) { + PyErr_Format(PyExc_TypeError, + "decoder getstate() should have returned a bytes " + "object, not '%.200s'", + Py_TYPE(next_input)->tp_name); + Py_DECREF(next_input); + goto fail; + } Py_DECREF(dec_buffer); Py_CLEAR(self->snapshot); self->snapshot = Py_BuildValue("NN", dec_flags, next_input); @@ -2151,7 +2165,14 @@ if (input_chunk == NULL) goto fail; - assert (PyBytes_Check(input_chunk)); + if (!PyBytes_Check(input_chunk)) { + PyErr_Format(PyExc_IOError, + "underlying read() should have returned a bytes " + "object, not '%.200s'", + Py_TYPE(input_chunk)->tp_name); + Py_DECREF(input_chunk); + goto fail; + } self->snapshot = Py_BuildValue("iN", cookie.dec_flags, input_chunk); if (self->snapshot == NULL) { @@ -2283,13 +2304,18 @@ Py_DECREF(_state); \ } while (0) - /* TODO: replace assert with exception */ #define DECODER_DECODE(start, len, res) do { \ PyObject *_decoded = _PyObject_CallMethodId( \ self->decoder, &PyId_decode, "y#", start, len); \ if (_decoded == NULL) \ goto fail; \ - assert (PyUnicode_Check(_decoded)); \ + if (!PyUnicode_Check(_decoded)) { \ + PyErr_Format(PyExc_TypeError, \ + "decoder should return a string result, not '%.200s'", \ + Py_TYPE(_decoded)->tp_name); \ + Py_DECREF(_decoded); \ + goto fail; \ + } \ res = PyUnicode_GET_LENGTH(_decoded); \ Py_DECREF(_decoded); \ } while (0) @@ -2372,7 +2398,13 @@ self->decoder, &PyId_decode, "yi", "", /* final = */ 1); if (decoded == NULL) goto fail; - assert (PyUnicode_Check(decoded)); + if (!PyUnicode_Check(decoded)) { + PyErr_Format(PyExc_TypeError, + "decoder should return a string result, not '%.200s'", + Py_TYPE(decoded)->tp_name); + Py_DECREF(decoded); + goto fail; + } chars_decoded += PyUnicode_GET_LENGTH(decoded); Py_DECREF(decoded); cookie.need_eof = 1;