diff options
author | Alexandre Vassalotti <alexandre@peadrop.com> | 2009-04-03 06:38:02 (GMT) |
---|---|---|
committer | Alexandre Vassalotti <alexandre@peadrop.com> | 2009-04-03 06:38:02 (GMT) |
commit | e2641f45b6305f9371cecdcb8765998e2946ca94 (patch) | |
tree | 320793635bb0dd2574ee2e561426f9c7fd88abac /Objects | |
parent | 1102062abb05e6558ecd93b014e532014b8eb4bf (diff) | |
download | cpython-e2641f45b6305f9371cecdcb8765998e2946ca94.zip cpython-e2641f45b6305f9371cecdcb8765998e2946ca94.tar.gz cpython-e2641f45b6305f9371cecdcb8765998e2946ca94.tar.bz2 |
Optimize slicing of bytes and bytearray by avoiding useless copying.
This restores the behavior that was present in Python 2.x.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/bytearrayobject.c | 10 | ||||
-rw-r--r-- | Objects/bytesobject.c | 12 |
2 files changed, 10 insertions, 12 deletions
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 428ee57..fc12452 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -411,18 +411,18 @@ bytes_subscript(PyByteArrayObject *self, PyObject *index) } else { char *source_buf = PyByteArray_AS_STRING(self); - char *result_buf = (char *)PyMem_Malloc(slicelength); + char *result_buf; PyObject *result; - if (result_buf == NULL) - return PyErr_NoMemory(); + result = PyByteArray_FromStringAndSize(NULL, slicelength); + if (result == NULL) + return NULL; + result_buf = PyByteArray_AS_STRING(result); for (cur = start, i = 0; i < slicelength; cur += step, i++) { result_buf[i] = source_buf[cur]; } - result = PyByteArray_FromStringAndSize(result_buf, slicelength); - PyMem_Free(result_buf); return result; } } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index a4a2e65..d3b598e 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -951,19 +951,17 @@ string_subscript(PyBytesObject* self, PyObject* item) slicelength); } else { - source_buf = PyBytes_AsString((PyObject*)self); - result_buf = (char *)PyMem_Malloc(slicelength); - if (result_buf == NULL) - return PyErr_NoMemory(); + source_buf = PyBytes_AS_STRING(self); + result = PyBytes_FromStringAndSize(NULL, slicelength); + if (result == NULL) + return NULL; + result_buf = PyBytes_AS_STRING(result); for (cur = start, i = 0; i < slicelength; cur += step, i++) { result_buf[i] = source_buf[cur]; } - result = PyBytes_FromStringAndSize(result_buf, - slicelength); - PyMem_Free(result_buf); return result; } } |