summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Modules/_lsprof.c
diff options
context:
space:
mode:
authorshadchin <[email protected]>2022-04-18 12:39:32 +0300
committershadchin <[email protected]>2022-04-18 12:39:32 +0300
commitd4be68e361f4258cf0848fc70018dfe37a2acc24 (patch)
tree153e294cd97ac8b5d7a989612704a0c1f58e8ad4 /contrib/tools/python3/src/Modules/_lsprof.c
parent260c02f5ccf242d9d9b8a873afaf6588c00237d6 (diff)
IGNIETFERRO-1816 Update Python 3 from 3.9.12 to 3.10.4
ref:9f96be6d02ee8044fdd6f124b799b270c20ce641
Diffstat (limited to 'contrib/tools/python3/src/Modules/_lsprof.c')
-rw-r--r--contrib/tools/python3/src/Modules/_lsprof.c290
1 files changed, 167 insertions, 123 deletions
diff --git a/contrib/tools/python3/src/Modules/_lsprof.c b/contrib/tools/python3/src/Modules/_lsprof.c
index 5e53d839640..703067cc743 100644
--- a/contrib/tools/python3/src/Modules/_lsprof.c
+++ b/contrib/tools/python3/src/Modules/_lsprof.c
@@ -50,10 +50,27 @@ typedef struct {
#define POF_BUILTINS 0x004
#define POF_NOMEMORY 0x100
-static PyTypeObject PyProfiler_Type;
+/*[clinic input]
+module _lsprof
+class _lsprof.Profiler "ProfilerObject *" "&ProfilerType"
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=e349ac952152f336]*/
-#define PyProfiler_Check(op) PyObject_TypeCheck(op, &PyProfiler_Type)
-#define PyProfiler_CheckExact(op) Py_IS_TYPE(op, &PyProfiler_Type)
+#include "clinic/_lsprof.c.h"
+
+typedef struct {
+ PyTypeObject *profiler_type;
+ PyTypeObject *stats_entry_type;
+ PyTypeObject *stats_subentry_type;
+} _lsprof_state;
+
+static inline _lsprof_state*
+_lsprof_get_state(PyObject *module)
+{
+ void *state = PyModule_GetState(module);
+ assert(state != NULL);
+ return (_lsprof_state *)state;
+}
/*** External Timers ***/
@@ -471,28 +488,24 @@ static PyStructSequence_Field profiler_subentry_fields[] = {
};
static PyStructSequence_Desc profiler_entry_desc = {
- "_lsprof.profiler_entry", /* name */
- NULL, /* doc */
- profiler_entry_fields,
- 6
+ .name = "_lsprof.profiler_entry",
+ .fields = profiler_entry_fields,
+ .doc = NULL,
+ .n_in_sequence = 6
};
static PyStructSequence_Desc profiler_subentry_desc = {
- "_lsprof.profiler_subentry", /* name */
- NULL, /* doc */
- profiler_subentry_fields,
- 5
+ .name = "_lsprof.profiler_subentry",
+ .fields = profiler_subentry_fields,
+ .doc = NULL,
+ .n_in_sequence = 5
};
-static int initialized;
-static PyTypeObject StatsEntryType;
-static PyTypeObject StatsSubEntryType;
-
-
typedef struct {
PyObject *list;
PyObject *sublist;
double factor;
+ _lsprof_state *state;
} statscollector_t;
static int statsForSubEntry(rotating_node_t *node, void *arg)
@@ -502,7 +515,7 @@ static int statsForSubEntry(rotating_node_t *node, void *arg)
ProfilerEntry *entry = (ProfilerEntry*) sentry->header.key;
int err;
PyObject *sinfo;
- sinfo = PyObject_CallFunction((PyObject*) &StatsSubEntryType,
+ sinfo = PyObject_CallFunction((PyObject*) collect->state->stats_subentry_type,
"((Olldd))",
entry->userObj,
sentry->callcount,
@@ -540,7 +553,7 @@ static int statsForEntry(rotating_node_t *node, void *arg)
collect->sublist = Py_None;
}
- info = PyObject_CallFunction((PyObject*) &StatsEntryType,
+ info = PyObject_CallFunction((PyObject*) collect->state->stats_entry_type,
"((OllddO))",
entry->userObj,
entry->callcount,
@@ -556,49 +569,57 @@ static int statsForEntry(rotating_node_t *node, void *arg)
return err;
}
-PyDoc_STRVAR(getstats_doc, "\
-getstats() -> list of profiler_entry objects\n\
-\n\
-Return all information collected by the profiler.\n\
-Each profiler_entry is a tuple-like object with the\n\
-following attributes:\n\
-\n\
- code code object\n\
- callcount how many times this was called\n\
- reccallcount how many times called recursively\n\
- totaltime total time in this entry\n\
- inlinetime inline time in this entry (not in subcalls)\n\
- calls details of the calls\n\
-\n\
-The calls attribute is either None or a list of\n\
-profiler_subentry objects:\n\
-\n\
- code called code object\n\
- callcount how many times this is called\n\
- reccallcount how many times this is called recursively\n\
- totaltime total time spent in this call\n\
- inlinetime inline time (not in further subcalls)\n\
-");
+/*[clinic input]
+_lsprof.Profiler.getstats
-static PyObject*
-profiler_getstats(ProfilerObject *pObj, PyObject* noarg)
+ cls: defining_class
+
+list of profiler_entry objects.
+
+getstats() -> list of profiler_entry objects
+
+Return all information collected by the profiler.
+Each profiler_entry is a tuple-like object with the
+following attributes:
+
+ code code object
+ callcount how many times this was called
+ reccallcount how many times called recursively
+ totaltime total time in this entry
+ inlinetime inline time in this entry (not in subcalls)
+ calls details of the calls
+
+The calls attribute is either None or a list of
+profiler_subentry objects:
+
+ code called code object
+ callcount how many times this is called
+ reccallcount how many times this is called recursively
+ totaltime total time spent in this call
+ inlinetime inline time (not in further subcalls)
+[clinic start generated code]*/
+
+static PyObject *
+_lsprof_Profiler_getstats_impl(ProfilerObject *self, PyTypeObject *cls)
+/*[clinic end generated code: output=1806ef720019ee03 input=445e193ef4522902]*/
{
statscollector_t collect;
- if (pending_exception(pObj)) {
+ collect.state = PyType_GetModuleState(cls);
+ if (pending_exception(self)) {
return NULL;
}
- if (!pObj->externalTimer || pObj->externalTimerUnit == 0.0) {
+ if (!self->externalTimer || self->externalTimerUnit == 0.0) {
_PyTime_t onesec = _PyTime_FromSeconds(1);
collect.factor = (double)1 / onesec;
}
else {
- collect.factor = pObj->externalTimerUnit;
+ collect.factor = self->externalTimerUnit;
}
collect.list = PyList_New(0);
if (collect.list == NULL)
return NULL;
- if (RotatingTree_Enum(pObj->profilerEntries, statsForEntry, &collect)
+ if (RotatingTree_Enum(self->profilerEntries, statsForEntry, &collect)
!= 0) {
Py_DECREF(collect.list);
return NULL;
@@ -710,6 +731,13 @@ profiler_clear(ProfilerObject *pObj, PyObject* noarg)
Py_RETURN_NONE;
}
+static int
+profiler_traverse(ProfilerObject *op, visitproc visit, void *arg)
+{
+ Py_VISIT(Py_TYPE(op));
+ return 0;
+}
+
static void
profiler_dealloc(ProfilerObject *op)
{
@@ -723,7 +751,9 @@ profiler_dealloc(ProfilerObject *op)
flush_unmatched(op);
clearEntries(op);
Py_XDECREF(op->externalTimer);
- Py_TYPE(op)->tp_free(op);
+ PyTypeObject *tp = Py_TYPE(op);
+ tp->tp_free(op);
+ Py_DECREF(tp);
}
static int
@@ -750,8 +780,7 @@ profiler_init(ProfilerObject *pObj, PyObject *args, PyObject *kw)
}
static PyMethodDef profiler_methods[] = {
- {"getstats", (PyCFunction)profiler_getstats,
- METH_NOARGS, getstats_doc},
+ _LSPROF_PROFILER_GETSTATS_METHODDEF
{"enable", (PyCFunction)(void(*)(void))profiler_enable,
METH_VARARGS | METH_KEYWORDS, enable_doc},
{"disable", (PyCFunction)profiler_disable,
@@ -771,91 +800,106 @@ Profiler(timer=None, timeunit=None, subcalls=True, builtins=True)\n\
is, in seconds).\n\
");
-static PyTypeObject PyProfiler_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "_lsprof.Profiler", /* tp_name */
- sizeof(ProfilerObject), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)profiler_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- profiler_doc, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- profiler_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)profiler_init, /* tp_init */
- PyType_GenericAlloc, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
- PyObject_Del, /* tp_free */
+static PyType_Slot _lsprof_profiler_type_spec_slots[] = {
+ {Py_tp_doc, (void *)profiler_doc},
+ {Py_tp_methods, profiler_methods},
+ {Py_tp_dealloc, profiler_dealloc},
+ {Py_tp_init, profiler_init},
+ {Py_tp_traverse, profiler_traverse},
+ {0, 0}
+};
+
+static PyType_Spec _lsprof_profiler_type_spec = {
+ .name = "_lsprof.Profiler",
+ .basicsize = sizeof(ProfilerObject),
+ .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
+ Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE),
+ .slots = _lsprof_profiler_type_spec_slots,
};
static PyMethodDef moduleMethods[] = {
{NULL, NULL}
};
+static int
+_lsprof_traverse(PyObject *module, visitproc visit, void *arg)
+{
+ _lsprof_state *state = _lsprof_get_state(module);
+ Py_VISIT(state->profiler_type);
+ Py_VISIT(state->stats_entry_type);
+ Py_VISIT(state->stats_subentry_type);
+ return 0;
+}
+
+static int
+_lsprof_clear(PyObject *module)
+{
+ _lsprof_state *state = _lsprof_get_state(module);
+ Py_CLEAR(state->profiler_type);
+ Py_CLEAR(state->stats_entry_type);
+ Py_CLEAR(state->stats_subentry_type);
+ return 0;
+}
+
+static void
+_lsprof_free(void *module)
+{
+ _lsprof_clear((PyObject *)module);
+}
+
+static int
+_lsprof_exec(PyObject *module)
+{
+ _lsprof_state *state = PyModule_GetState(module);
+
+ state->profiler_type = (PyTypeObject *)PyType_FromModuleAndSpec(
+ module, &_lsprof_profiler_type_spec, NULL);
+ if (state->profiler_type == NULL) {
+ return -1;
+ }
+
+ if (PyModule_AddType(module, state->profiler_type) < 0) {
+ return -1;
+ }
+
+ state->stats_entry_type = PyStructSequence_NewType(&profiler_entry_desc);
+ if (state->stats_entry_type == NULL) {
+ return -1;
+ }
+ if (PyModule_AddType(module, state->stats_entry_type) < 0) {
+ return -1;
+ }
+
+ state->stats_subentry_type = PyStructSequence_NewType(&profiler_subentry_desc);
+ if (state->stats_subentry_type == NULL) {
+ return -1;
+ }
+ if (PyModule_AddType(module, state->stats_subentry_type) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+static PyModuleDef_Slot _lsprofslots[] = {
+ {Py_mod_exec, _lsprof_exec},
+ {0, NULL}
+};
static struct PyModuleDef _lsprofmodule = {
PyModuleDef_HEAD_INIT,
- "_lsprof",
- "Fast profiler",
- -1,
- moduleMethods,
- NULL,
- NULL,
- NULL,
- NULL
+ .m_name = "_lsprof",
+ .m_doc = "Fast profiler",
+ .m_size = sizeof(_lsprof_state),
+ .m_methods = moduleMethods,
+ .m_slots = _lsprofslots,
+ .m_traverse = _lsprof_traverse,
+ .m_clear = _lsprof_clear,
+ .m_free = _lsprof_free
};
PyMODINIT_FUNC
PyInit__lsprof(void)
{
- PyObject *module, *d;
- module = PyModule_Create(&_lsprofmodule);
- if (module == NULL)
- return NULL;
- d = PyModule_GetDict(module);
- if (PyType_Ready(&PyProfiler_Type) < 0)
- return NULL;
- PyDict_SetItemString(d, "Profiler", (PyObject *)&PyProfiler_Type);
-
- if (!initialized) {
- if (PyStructSequence_InitType2(&StatsEntryType,
- &profiler_entry_desc) < 0)
- return NULL;
- if (PyStructSequence_InitType2(&StatsSubEntryType,
- &profiler_subentry_desc) < 0)
- return NULL;
- }
- Py_INCREF((PyObject*) &StatsEntryType);
- Py_INCREF((PyObject*) &StatsSubEntryType);
- PyModule_AddObject(module, "profiler_entry",
- (PyObject*) &StatsEntryType);
- PyModule_AddObject(module, "profiler_subentry",
- (PyObject*) &StatsSubEntryType);
- initialized = 1;
- return module;
+ return PyModuleDef_Init(&_lsprofmodule);
}