Commit f34a0cdc authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #10227: Add an allocation cache for a single slice object.

Patch by Stefan Behnel.
parent 2251a3d2
...@@ -211,6 +211,7 @@ PyAPI_FUNC(void) PyByteArray_Fini(void); ...@@ -211,6 +211,7 @@ PyAPI_FUNC(void) PyByteArray_Fini(void);
PyAPI_FUNC(void) PyFloat_Fini(void); PyAPI_FUNC(void) PyFloat_Fini(void);
PyAPI_FUNC(void) PyOS_FiniInterrupts(void); PyAPI_FUNC(void) PyOS_FiniInterrupts(void);
PyAPI_FUNC(void) _PyGC_Fini(void); PyAPI_FUNC(void) _PyGC_Fini(void);
PyAPI_FUNC(void) PySlice_Fini(void);
PyAPI_DATA(PyThreadState *) _Py_Finalizing; PyAPI_DATA(PyThreadState *) _Py_Finalizing;
#endif #endif
......
...@@ -10,6 +10,9 @@ What's New in Python 3.3 Alpha 1? ...@@ -10,6 +10,9 @@ What's New in Python 3.3 Alpha 1?
Core and Builtins 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 - Issue #13393: BufferedReader.read1() now asks the full requested size to
the raw stream instead of limiting itself to the buffer size. the raw stream instead of limiting itself to the buffer size.
......
...@@ -80,19 +80,38 @@ PyObject _Py_EllipsisObject = { ...@@ -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. index is present.
*/ */
PyObject * PyObject *
PySlice_New(PyObject *start, PyObject *stop, PyObject *step) PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
{ {
PySliceObject *obj = PyObject_New(PySliceObject, &PySlice_Type); PySliceObject *obj;
if (slice_cache != NULL) {
if (obj == NULL) obj = slice_cache;
return NULL; 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; if (step == NULL) step = Py_None;
Py_INCREF(step); Py_INCREF(step);
...@@ -260,7 +279,10 @@ slice_dealloc(PySliceObject *r) ...@@ -260,7 +279,10 @@ slice_dealloc(PySliceObject *r)
Py_DECREF(r->step); Py_DECREF(r->step);
Py_DECREF(r->start); Py_DECREF(r->start);
Py_DECREF(r->stop); Py_DECREF(r->stop);
PyObject_Del(r); if (slice_cache == NULL)
slice_cache = r;
else
PyObject_Del(r);
} }
static PyObject * static PyObject *
......
...@@ -531,6 +531,7 @@ Py_Finalize(void) ...@@ -531,6 +531,7 @@ Py_Finalize(void)
PyLong_Fini(); PyLong_Fini();
PyFloat_Fini(); PyFloat_Fini();
PyDict_Fini(); PyDict_Fini();
PySlice_Fini();
/* Cleanup Unicode implementation */ /* Cleanup Unicode implementation */
_PyUnicode_Fini(); _PyUnicode_Fini();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment