cpython: fa2f8dd077e0 (original) (raw)
Mercurial > cpython
changeset 73617:fa2f8dd077e0
Issue #10227: Add an allocation cache for a single slice object. Patch by Stefan Behnel. [#10227]
Antoine Pitrou solipsis@pitrou.net | |
---|---|
date | Fri, 18 Nov 2011 20:14:34 +0100 |
parents | 196d485ed26d |
children | 76d414cc3e38 |
files | Include/pythonrun.h Misc/NEWS Objects/sliceobject.c Python/pythonrun.c |
diffstat | 4 files changed, 34 insertions(+), 7 deletions(-)[+] [-] Include/pythonrun.h 1 Misc/NEWS 3 Objects/sliceobject.c 36 Python/pythonrun.c 1 |
line wrap: on
line diff
--- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -211,6 +211,7 @@ PyAPI_FUNC(void) PyByteArray_Fini(void); PyAPI_FUNC(void) PyFloat_Fini(void); PyAPI_FUNC(void) PyOS_FiniInterrupts(void); PyAPI_FUNC(void) _PyGC_Fini(void); +PyAPI_FUNC(void) PySlice_Fini(void); PyAPI_DATA(PyThreadState *) _Py_Finalizing; #endif
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.3 Alpha 1? Core and Builtins ----------------- +- Issue #10227: Add an allocation cache for a single slice object. Patch by
- Issue #13393: BufferedReader.read1() now asks the full requested size to the raw stream instead of limiting itself to the buffer size.
--- 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
- */ +static PySliceObject *slice_cache = NULL; +void PySlice_Fini(void) +{
- PySliceObject *obj = slice_cache;
- if (obj != NULL) {
slice_cache = NULL;[](#l3.19)
PyObject_Del(obj);[](#l3.20)
- }
+} + +/* 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;
- if (slice_cache != NULL) {
obj = slice_cache;[](#l3.37)
slice_cache = NULL;[](#l3.38)
_Py_NewReference((PyObject *)obj);[](#l3.39)
- } else {
obj = PyObject_New(PySliceObject, &PySlice_Type);[](#l3.41)
if (obj == NULL)[](#l3.42)
return NULL;[](#l3.43)
- }
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);
--- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -531,6 +531,7 @@ Py_Finalize(void) PyLong_Fini(); PyFloat_Fini(); PyDict_Fini();