|
|
|
@ -2505,8 +2505,10 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
|
|
const char *encoding = NULL; |
|
|
|
const char *errors = NULL; |
|
|
|
PyObject *new = NULL; |
|
|
|
PyObject *func; |
|
|
|
Py_ssize_t size; |
|
|
|
static char *kwlist[] = {"source", "encoding", "errors", 0}; |
|
|
|
_Py_IDENTIFIER(__bytes__); |
|
|
|
|
|
|
|
if (type != &PyBytes_Type) |
|
|
|
return str_subtype_new(type, args, kwds); |
|
|
|
@ -2536,6 +2538,28 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
|
|
assert(PyBytes_Check(new)); |
|
|
|
return new; |
|
|
|
} |
|
|
|
|
|
|
|
/* We'd like to call PyObject_Bytes here, but we need to check for an |
|
|
|
integer argument before deferring to PyBytes_FromObject, something |
|
|
|
PyObject_Bytes doesn't do. */ |
|
|
|
func = _PyObject_LookupSpecial(x, &PyId___bytes__); |
|
|
|
if (func != NULL) { |
|
|
|
new = PyObject_CallFunctionObjArgs(func, NULL); |
|
|
|
Py_DECREF(func); |
|
|
|
if (new == NULL) |
|
|
|
return NULL; |
|
|
|
if (!PyBytes_Check(new)) { |
|
|
|
PyErr_Format(PyExc_TypeError, |
|
|
|
"__bytes__ returned non-bytes (type %.200s)", |
|
|
|
Py_TYPE(new)->tp_name); |
|
|
|
Py_DECREF(new); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
return new; |
|
|
|
} |
|
|
|
else if (PyErr_Occurred()) |
|
|
|
return NULL; |
|
|
|
|
|
|
|
/* Is it an integer? */ |
|
|
|
size = PyNumber_AsSsize_t(x, PyExc_OverflowError); |
|
|
|
if (size == -1 && PyErr_Occurred()) { |
|
|
|
@ -2549,12 +2573,10 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
|
|
} |
|
|
|
else { |
|
|
|
new = PyBytes_FromStringAndSize(NULL, size); |
|
|
|
if (new == NULL) { |
|
|
|
if (new == NULL) |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
if (size > 0) { |
|
|
|
if (size > 0) |
|
|
|
memset(((PyBytesObject*)new)->ob_sval, 0, size); |
|
|
|
} |
|
|
|
return new; |
|
|
|
} |
|
|
|
|
|
|
|
@ -2564,7 +2586,8 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
|
|
"encoding or errors without a string argument"); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
return PyObject_Bytes(x); |
|
|
|
|
|
|
|
return PyBytes_FromObject(x); |
|
|
|
} |
|
|
|
|
|
|
|
PyObject * |
|
|
|
|