summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Objects/sliceobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tools/python3/Objects/sliceobject.c')
-rw-r--r--contrib/tools/python3/Objects/sliceobject.c65
1 files changed, 38 insertions, 27 deletions
diff --git a/contrib/tools/python3/Objects/sliceobject.c b/contrib/tools/python3/Objects/sliceobject.c
index e6776ac92b6..245bea98d58 100644
--- a/contrib/tools/python3/Objects/sliceobject.c
+++ b/contrib/tools/python3/Objects/sliceobject.c
@@ -16,8 +16,9 @@ this type and there is exactly one in existence.
#include "Python.h"
#include "pycore_abstract.h" // _PyIndex_Check()
#include "pycore_long.h" // _PyLong_GetZero()
+#include "pycore_modsupport.h" // _PyArg_NoKeywords()
#include "pycore_object.h" // _PyObject_GC_TRACK()
-#include "structmember.h" // PyMemberDef
+
static PyObject *
ellipsis_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
@@ -26,7 +27,7 @@ ellipsis_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
PyErr_SetString(PyExc_TypeError, "EllipsisType takes no arguments");
return NULL;
}
- return Py_NewRef(Py_Ellipsis);
+ return Py_Ellipsis;
}
static void
@@ -56,6 +57,11 @@ static PyMethodDef ellipsis_methods[] = {
{NULL, NULL}
};
+PyDoc_STRVAR(ellipsis_doc,
+"ellipsis()\n"
+"--\n\n"
+"The type of the Ellipsis singleton.");
+
PyTypeObject PyEllipsis_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"ellipsis", /* tp_name */
@@ -77,7 +83,7 @@ PyTypeObject PyEllipsis_Type = {
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
+ ellipsis_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
@@ -97,23 +103,23 @@ PyTypeObject PyEllipsis_Type = {
ellipsis_new, /* tp_new */
};
-PyObject _Py_EllipsisObject = {
- _PyObject_EXTRA_INIT
- { _Py_IMMORTAL_REFCNT },
- &PyEllipsis_Type
-};
+PyObject _Py_EllipsisObject = _PyObject_HEAD_INIT(&PyEllipsis_Type);
/* Slice object implementation */
-
-void _PySlice_Fini(PyInterpreterState *interp)
+void _PySlice_ClearFreeList(struct _Py_object_freelists *freelists, int is_finalization)
{
- PySliceObject *obj = interp->slice_cache;
+ if (!is_finalization) {
+ return;
+ }
+#ifdef WITH_FREELISTS
+ PySliceObject *obj = freelists->slices.slice_cache;
if (obj != NULL) {
- interp->slice_cache = NULL;
+ freelists->slices.slice_cache = NULL;
PyObject_GC_Del(obj);
}
+#endif
}
/* start, stop, and step are python objects with None indicating no
@@ -124,15 +130,17 @@ static PySliceObject *
_PyBuildSlice_Consume2(PyObject *start, PyObject *stop, PyObject *step)
{
assert(start != NULL && stop != NULL && step != NULL);
-
- PyInterpreterState *interp = _PyInterpreterState_GET();
PySliceObject *obj;
- if (interp->slice_cache != NULL) {
- obj = interp->slice_cache;
- interp->slice_cache = NULL;
+#ifdef WITH_FREELISTS
+ struct _Py_object_freelists *freelists = _Py_object_freelists_GET();
+ if (freelists->slices.slice_cache != NULL) {
+ obj = freelists->slices.slice_cache;
+ freelists->slices.slice_cache = NULL;
_Py_NewReference((PyObject *)obj);
}
- else {
+ else
+#endif
+ {
obj = PyObject_GC_New(PySliceObject, &PySlice_Type);
if (obj == NULL) {
goto error;
@@ -357,15 +365,18 @@ Create a slice object. This is used for extended slicing (e.g. a[0:10:2]).");
static void
slice_dealloc(PySliceObject *r)
{
- PyInterpreterState *interp = _PyInterpreterState_GET();
_PyObject_GC_UNTRACK(r);
Py_DECREF(r->step);
Py_DECREF(r->start);
Py_DECREF(r->stop);
- if (interp->slice_cache == NULL) {
- interp->slice_cache = r;
+#ifdef WITH_FREELISTS
+ struct _Py_object_freelists *freelists = _Py_object_freelists_GET();
+ if (freelists->slices.slice_cache == NULL) {
+ freelists->slices.slice_cache = r;
}
- else {
+ else
+#endif
+ {
PyObject_GC_Del(r);
}
}
@@ -377,9 +388,9 @@ slice_repr(PySliceObject *r)
}
static PyMemberDef slice_members[] = {
- {"start", T_OBJECT, offsetof(PySliceObject, start), READONLY},
- {"stop", T_OBJECT, offsetof(PySliceObject, stop), READONLY},
- {"step", T_OBJECT, offsetof(PySliceObject, step), READONLY},
+ {"start", _Py_T_OBJECT, offsetof(PySliceObject, start), Py_READONLY},
+ {"stop", _Py_T_OBJECT, offsetof(PySliceObject, stop), Py_READONLY},
+ {"step", _Py_T_OBJECT, offsetof(PySliceObject, step), Py_READONLY},
{0}
};
@@ -415,7 +426,7 @@ _PySlice_GetLongIndices(PySliceObject *self, PyObject *length,
/* Convert step to an integer; raise for zero step. */
if (self->step == Py_None) {
- step = Py_NewRef(_PyLong_GetOne());
+ step = _PyLong_GetOne();
step_is_negative = 0;
}
else {
@@ -443,7 +454,7 @@ _PySlice_GetLongIndices(PySliceObject *self, PyObject *length,
goto error;
}
else {
- lower = Py_NewRef(_PyLong_GetZero());
+ lower = _PyLong_GetZero();
upper = Py_NewRef(length);
}