summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-04-10 11:44:59 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-04-10 11:44:59 (GMT)
commit03f17f86717372ca010273dc8946fd19914a534b (patch)
treefd087ee305e728af20e73127cae0a0d566e67a86 /Objects
parent96cdbe7bc85477c82c64c448c46c2c8b533671bb (diff)
downloadcpython-03f17f86717372ca010273dc8946fd19914a534b.zip
cpython-03f17f86717372ca010273dc8946fd19914a534b.tar.gz
cpython-03f17f86717372ca010273dc8946fd19914a534b.tar.bz2
Issue #17339: Improved TypeError message in bytes constructor.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/bytesobject.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 639ee71..cbf8166 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -3469,31 +3469,24 @@ _PyBytes_FromTuple(PyObject *x)
}
static PyObject *
-_PyBytes_FromIterator(PyObject *x)
+_PyBytes_FromIterator(PyObject *it, PyObject *x)
{
char *str;
- PyObject *it;
Py_ssize_t i, size;
_PyBytesWriter writer;
- _PyBytesWriter_Init(&writer);
-
/* For iterator version, create a string object and resize as needed */
size = PyObject_LengthHint(x, 64);
if (size == -1 && PyErr_Occurred())
return NULL;
+ _PyBytesWriter_Init(&writer);
str = _PyBytesWriter_Alloc(&writer, size);
if (str == NULL)
return NULL;
writer.overallocate = 1;
size = writer.allocated;
- /* Get the iterator */
- it = PyObject_GetIter(x);
- if (it == NULL)
- goto error;
-
/* Run the iterator to exhaustion */
for (i = 0; ; i++) {
PyObject *item;
@@ -3529,19 +3522,19 @@ _PyBytes_FromIterator(PyObject *x)
}
*str++ = (char) value;
}
- Py_DECREF(it);
return _PyBytesWriter_Finish(&writer, str);
error:
_PyBytesWriter_Dealloc(&writer);
- Py_XDECREF(it);
return NULL;
}
PyObject *
PyBytes_FromObject(PyObject *x)
{
+ PyObject *it, *result;
+
if (x == NULL) {
PyErr_BadInternalCall();
return NULL;
@@ -3562,13 +3555,19 @@ PyBytes_FromObject(PyObject *x)
if (PyTuple_CheckExact(x))
return _PyBytes_FromTuple(x);
- if (PyUnicode_Check(x)) {
- PyErr_SetString(PyExc_TypeError,
- "cannot convert unicode object to bytes");
- return NULL;
+ if (!PyUnicode_Check(x)) {
+ it = PyObject_GetIter(x);
+ if (it != NULL) {
+ result = _PyBytes_FromIterator(it, x);
+ Py_DECREF(it);
+ return result;
+ }
}
- return _PyBytes_FromIterator(x);
+ PyErr_Format(PyExc_TypeError,
+ "cannot convert '%.200s' object to bytes",
+ x->ob_type->tp_name);
+ return NULL;
}
static PyObject *