mirror of
https://github.com/python/cpython.git
synced 2025-10-09 08:31:26 +00:00
Issue #6687: Moved the special-case for integers out of PyBytes_FromObject.
This commit is contained in:
parent
b05e73d9c8
commit
eb6f8de8bf
3 changed files with 33 additions and 25 deletions
|
@ -2884,6 +2884,7 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
const char *encoding = NULL;
|
||||
const char *errors = NULL;
|
||||
PyObject *new = NULL;
|
||||
Py_ssize_t size;
|
||||
static char *kwlist[] = {"source", "encoding", "errors", 0};
|
||||
|
||||
if (type != &PyBytes_Type)
|
||||
|
@ -2914,6 +2915,25 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
assert(PyBytes_Check(new));
|
||||
return new;
|
||||
}
|
||||
/* Is it an integer? */
|
||||
size = PyNumber_AsSsize_t(x, PyExc_ValueError);
|
||||
if (size == -1 && PyErr_Occurred()) {
|
||||
PyErr_Clear();
|
||||
}
|
||||
else {
|
||||
if (size < 0) {
|
||||
PyErr_SetString(PyExc_ValueError, "negative count");
|
||||
return NULL;
|
||||
}
|
||||
new = PyBytes_FromStringAndSize(NULL, size);
|
||||
if (new == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if (size > 0) {
|
||||
memset(((PyBytesObject*)new)->ob_sval, 0, size);
|
||||
}
|
||||
return new;
|
||||
}
|
||||
|
||||
/* If it's not unicode, there can't be encoding or errors */
|
||||
if (encoding != NULL || errors != NULL) {
|
||||
|
@ -2934,27 +2954,6 @@ PyBytes_FromObject(PyObject *x)
|
|||
PyErr_BadInternalCall();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Is it an int? */
|
||||
size = PyNumber_AsSsize_t(x, PyExc_ValueError);
|
||||
if (size == -1 && PyErr_Occurred()) {
|
||||
PyErr_Clear();
|
||||
}
|
||||
else {
|
||||
if (size < 0) {
|
||||
PyErr_SetString(PyExc_ValueError, "negative count");
|
||||
return NULL;
|
||||
}
|
||||
new = PyBytes_FromStringAndSize(NULL, size);
|
||||
if (new == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if (size > 0) {
|
||||
memset(((PyBytesObject*)new)->ob_sval, 0, size);
|
||||
}
|
||||
return new;
|
||||
}
|
||||
|
||||
/* Use the modern buffer interface */
|
||||
if (PyObject_CheckBuffer(x)) {
|
||||
Py_buffer view;
|
||||
|
@ -2974,6 +2973,11 @@ PyBytes_FromObject(PyObject *x)
|
|||
PyBuffer_Release(&view);
|
||||
return NULL;
|
||||
}
|
||||
if (PyUnicode_Check(x)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"cannot convert unicode object to bytes");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* For iterator version, create a string object and resize as needed */
|
||||
/* XXX(gb): is 64 a good value? also, optimize if length is known */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue