Issue #10227: Add an allocation cache for a single slice object.
Patch by Stefan Behnel.
This commit is contained in:
parent
2251a3d233
commit
f34a0cdc6c
|
@ -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
|
||||
|
|
|
@ -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
|
||||
Stefan Behnel.
|
||||
|
||||
- Issue #13393: BufferedReader.read1() now asks the full requested size to
|
||||
the raw stream instead of limiting itself to the buffer size.
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
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,6 +279,9 @@ slice_dealloc(PySliceObject *r)
|
|||
Py_DECREF(r->step);
|
||||
Py_DECREF(r->start);
|
||||
Py_DECREF(r->stop);
|
||||
if (slice_cache == NULL)
|
||||
slice_cache = r;
|
||||
else
|
||||
PyObject_Del(r);
|
||||
}
|
||||
|
||||
|
|
|
@ -531,6 +531,7 @@ Py_Finalize(void)
|
|||
PyLong_Fini();
|
||||
PyFloat_Fini();
|
||||
PyDict_Fini();
|
||||
PySlice_Fini();
|
||||
|
||||
/* Cleanup Unicode implementation */
|
||||
_PyUnicode_Fini();
|
||||
|
|
Loading…
Reference in New Issue