summaryrefslogtreecommitdiffstats
path: root/Objects/bytesobject.c
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2012-12-19 21:28:46 (GMT)
committerBenjamin Peterson <benjamin@python.org>2012-12-19 21:28:46 (GMT)
commit7643c92cdd0e8a3cfd83be9edae3964097b63f0e (patch)
tree2eccc052cc4b4d7e8f51f152c601a5dc48bb53b7 /Objects/bytesobject.c
parentaf5e29a769c1db9c1dd24b6d7344b9c6e0f2713f (diff)
parent5ff3f73d94305900c0773e67ebdd9701d856a0fe (diff)
downloadcpython-7643c92cdd0e8a3cfd83be9edae3964097b63f0e.zip
cpython-7643c92cdd0e8a3cfd83be9edae3964097b63f0e.tar.gz
cpython-7643c92cdd0e8a3cfd83be9edae3964097b63f0e.tar.bz2
merge 3.3 (#16722)
Diffstat (limited to 'Objects/bytesobject.c')
-rw-r--r--Objects/bytesobject.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 8d8cb05..91f65f9 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -2428,8 +2428,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);
@@ -2459,6 +2461,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()) {
@@ -2472,12 +2496,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;
}
@@ -2487,7 +2509,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 *