Kaydet (Commit) f2eafa32 authored tarafından Victor Stinner's avatar Victor Stinner

Split PyBytes_FromObject() into subfunctions

üst 2ec8063c
...@@ -3384,88 +3384,99 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ...@@ -3384,88 +3384,99 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return PyBytes_FromObject(x); return PyBytes_FromObject(x);
} }
PyObject * static PyObject*
PyBytes_FromObject(PyObject *x) _PyBytes_FromBuffer(PyObject *x)
{ {
PyObject *new, *it; PyObject *new;
Py_ssize_t i, size; Py_buffer view;
if (x == NULL) { if (PyObject_GetBuffer(x, &view, PyBUF_FULL_RO) < 0)
PyErr_BadInternalCall();
return NULL; return NULL;
}
if (PyBytes_CheckExact(x)) { new = PyBytes_FromStringAndSize(NULL, view.len);
Py_INCREF(x); if (!new)
return x; goto fail;
} if (PyBuffer_ToContiguous(((PyBytesObject *)new)->ob_sval,
&view, view.len, 'C') < 0)
goto fail;
PyBuffer_Release(&view);
return new;
/* Use the modern buffer interface */ fail:
if (PyObject_CheckBuffer(x)) { Py_XDECREF(new);
Py_buffer view; PyBuffer_Release(&view);
if (PyObject_GetBuffer(x, &view, PyBUF_FULL_RO) < 0) return NULL;
return NULL; }
new = PyBytes_FromStringAndSize(NULL, view.len);
if (!new) static PyObject*
goto fail; _PyBytes_FromList(PyObject *x)
if (PyBuffer_ToContiguous(((PyBytesObject *)new)->ob_sval, {
&view, view.len, 'C') < 0) PyObject *new;
goto fail; Py_ssize_t i;
PyBuffer_Release(&view); Py_ssize_t value;
return new; char *str;
fail:
Py_XDECREF(new); new = PyBytes_FromStringAndSize(NULL, Py_SIZE(x));
PyBuffer_Release(&view); if (new == NULL)
return NULL;
}
if (PyUnicode_Check(x)) {
PyErr_SetString(PyExc_TypeError,
"cannot convert unicode object to bytes");
return NULL; return NULL;
} str = ((PyBytesObject *)new)->ob_sval;
if (PyList_CheckExact(x)) { for (i = 0; i < Py_SIZE(x); i++) {
new = PyBytes_FromStringAndSize(NULL, Py_SIZE(x)); value = PyNumber_AsSsize_t(PyList_GET_ITEM(x, i), PyExc_ValueError);
if (new == NULL) if (value == -1 && PyErr_Occurred())
return NULL; goto error;
for (i = 0; i < Py_SIZE(x); i++) {
Py_ssize_t value = PyNumber_AsSsize_t( if (value < 0 || value >= 256) {
PyList_GET_ITEM(x, i), PyExc_ValueError); PyErr_SetString(PyExc_ValueError,
if (value == -1 && PyErr_Occurred()) { "bytes must be in range(0, 256)");
Py_DECREF(new); goto error;
return NULL;
}
if (value < 0 || value >= 256) {
PyErr_SetString(PyExc_ValueError,
"bytes must be in range(0, 256)");
Py_DECREF(new);
return NULL;
}
((PyBytesObject *)new)->ob_sval[i] = (char) value;
} }
return new; *str++ = (char) value;
} }
if (PyTuple_CheckExact(x)) { return new;
new = PyBytes_FromStringAndSize(NULL, Py_SIZE(x));
if (new == NULL) error:
return NULL; Py_DECREF(new);
for (i = 0; i < Py_SIZE(x); i++) { return NULL;
Py_ssize_t value = PyNumber_AsSsize_t( }
PyTuple_GET_ITEM(x, i), PyExc_ValueError);
if (value == -1 && PyErr_Occurred()) { static PyObject*
Py_DECREF(new); _PyBytes_FromTuple(PyObject *x)
return NULL; {
} PyObject *new;
if (value < 0 || value >= 256) { Py_ssize_t i;
PyErr_SetString(PyExc_ValueError, Py_ssize_t value;
"bytes must be in range(0, 256)"); char *str;
Py_DECREF(new);
return NULL; new = PyBytes_FromStringAndSize(NULL, Py_SIZE(x));
} if (new == NULL)
((PyBytesObject *)new)->ob_sval[i] = (char) value; return NULL;
str = ((PyBytesObject *)new)->ob_sval;
for (i = 0; i < Py_SIZE(x); i++) {
value = PyNumber_AsSsize_t(PyTuple_GET_ITEM(x, i), PyExc_ValueError);
if (value == -1 && PyErr_Occurred())
goto error;
if (value < 0 || value >= 256) {
PyErr_SetString(PyExc_ValueError,
"bytes must be in range(0, 256)");
goto error;
} }
return new; *str++ = (char) value;
} }
return new;
error:
Py_DECREF(new);
return NULL;
}
static PyObject *
_PyBytes_FromIterator(PyObject *x)
{
PyObject *new, *it;
Py_ssize_t i, size;
/* For iterator version, create a string object and resize as needed */ /* For iterator version, create a string object and resize as needed */
size = PyObject_LengthHint(x, 64); size = PyObject_LengthHint(x, 64);
...@@ -3533,6 +3544,38 @@ PyBytes_FromObject(PyObject *x) ...@@ -3533,6 +3544,38 @@ PyBytes_FromObject(PyObject *x)
return NULL; return NULL;
} }
PyObject *
PyBytes_FromObject(PyObject *x)
{
if (x == NULL) {
PyErr_BadInternalCall();
return NULL;
}
if (PyBytes_CheckExact(x)) {
Py_INCREF(x);
return x;
}
/* Use the modern buffer interface */
if (PyObject_CheckBuffer(x))
return _PyBytes_FromBuffer(x);
if (PyList_CheckExact(x))
return _PyBytes_FromList(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;
}
return _PyBytes_FromIterator(x);
}
static PyObject * static PyObject *
str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment