diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2011-11-18 19:14:34 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2011-11-18 19:14:34 (GMT) |
commit | f34a0cdc6cbf6507508392e4588a9ca0ce8cb6b0 (patch) | |
tree | cfa9a741a50b0fdff952e849431d39043e80b5dd /Objects | |
parent | 2251a3d233f8c57072b5999b13d82ce06f7ecfe4 (diff) | |
download | cpython-f34a0cdc6cbf6507508392e4588a9ca0ce8cb6b0.zip cpython-f34a0cdc6cbf6507508392e4588a9ca0ce8cb6b0.tar.gz cpython-f34a0cdc6cbf6507508392e4588a9ca0ce8cb6b0.tar.bz2 |
Issue #10227: Add an allocation cache for a single slice object.
Patch by Stefan Behnel.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/sliceobject.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index 2f5c045..c4a1907 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -80,19 +80,38 @@ PyObject _Py_EllipsisObject = { }; -/* Slice object implementation +/* Slice object implementation */ - start, stop, and step are python objects with None indicating no +/* Using a cache is very effective since typically only a single slice is + * created and then deleted again + */ +static PySliceObject *slice_cache = NULL; +void PySlice_Fini(void) +{ + PySliceObject *obj = slice_cache; + if (obj != NULL) { + slice_cache = NULL; + PyObject_Del(obj); + } +} + +/* start, stop, and step are python objects with None indicating no index is present. */ PyObject * PySlice_New(PyObject *start, PyObject *stop, PyObject *step) { - PySliceObject *obj = PyObject_New(PySliceObject, &PySlice_Type); - - if (obj == NULL) - return NULL; + PySliceObject *obj; + if (slice_cache != NULL) { + obj = slice_cache; + slice_cache = NULL; + _Py_NewReference((PyObject *)obj); + } else { + obj = PyObject_New(PySliceObject, &PySlice_Type); + if (obj == NULL) + return NULL; + } if (step == NULL) step = Py_None; Py_INCREF(step); @@ -260,7 +279,10 @@ slice_dealloc(PySliceObject *r) Py_DECREF(r->step); Py_DECREF(r->start); Py_DECREF(r->stop); - PyObject_Del(r); + if (slice_cache == NULL) + slice_cache = r; + else + PyObject_Del(r); } static PyObject * |