mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
GH-132554: Add stats for GET_ITER (GH-132592)
* Add stats for GET_ITER * Look for common iterable types, not iterator types * Add stats for self iter and fix naming in summary
This commit is contained in:
parent
01f11a0e4e
commit
622300bdfa
6 changed files with 64 additions and 1 deletions
|
@ -146,6 +146,7 @@ print_spec_stats(FILE *out, OpcodeStats *stats)
|
|||
* even though we don't specialize them yet. */
|
||||
fprintf(out, "opcode[BINARY_SLICE].specializable : 1\n");
|
||||
fprintf(out, "opcode[STORE_SLICE].specializable : 1\n");
|
||||
fprintf(out, "opcode[GET_ITER].specializable : 1\n");
|
||||
for (int i = 0; i < 256; i++) {
|
||||
if (_PyOpcode_Caches[i]) {
|
||||
/* Ignore jumps as they cannot be specialized */
|
||||
|
@ -668,6 +669,7 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters
|
|||
#define SPEC_FAIL_ITER_CALLABLE 28
|
||||
#define SPEC_FAIL_ITER_ASCII_STRING 29
|
||||
#define SPEC_FAIL_ITER_ASYNC_GENERATOR_SEND 30
|
||||
#define SPEC_FAIL_ITER_SELF 31
|
||||
|
||||
// UNPACK_SEQUENCE
|
||||
|
||||
|
@ -3115,6 +3117,53 @@ _Py_Specialize_ContainsOp(_PyStackRef value_st, _Py_CODEUNIT *instr)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef Py_STATS
|
||||
void
|
||||
_Py_GatherStats_GetIter(_PyStackRef iterable)
|
||||
{
|
||||
PyTypeObject *tp = PyStackRef_TYPE(iterable);
|
||||
int kind = SPEC_FAIL_OTHER;
|
||||
if (tp == &PyTuple_Type) {
|
||||
kind = SPEC_FAIL_ITER_TUPLE;
|
||||
}
|
||||
else if (tp == &PyList_Type) {
|
||||
kind = SPEC_FAIL_ITER_LIST;
|
||||
}
|
||||
else if (tp == &PyDict_Type) {
|
||||
kind = SPEC_FAIL_ITER_DICT_KEYS;
|
||||
}
|
||||
else if (tp == &PySet_Type) {
|
||||
kind = SPEC_FAIL_ITER_SET;
|
||||
}
|
||||
else if (tp == &PyBytes_Type) {
|
||||
kind = SPEC_FAIL_ITER_BYTES;
|
||||
}
|
||||
else if (tp == &PyEnum_Type) {
|
||||
kind = SPEC_FAIL_ITER_ENUMERATE;
|
||||
}
|
||||
else if (tp == &PyUnicode_Type) {
|
||||
kind = SPEC_FAIL_ITER_STRING;
|
||||
}
|
||||
else if (tp == &PyGen_Type) {
|
||||
kind = SPEC_FAIL_ITER_GENERATOR;
|
||||
}
|
||||
else if (tp == &PyCoro_Type) {
|
||||
kind = SPEC_FAIL_ITER_COROUTINE;
|
||||
}
|
||||
else if (tp == &PyAsyncGen_Type) {
|
||||
kind = SPEC_FAIL_ITER_ASYNC_GENERATOR;
|
||||
}
|
||||
else if (tp == &_PyAsyncGenASend_Type) {
|
||||
kind = SPEC_FAIL_ITER_ASYNC_GENERATOR_SEND;
|
||||
}
|
||||
else if (tp->tp_iter == PyObject_SelfIter) {
|
||||
kind = SPEC_FAIL_ITER_SELF;
|
||||
}
|
||||
SPECIALIZATION_FAIL(GET_ITER, kind);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Code init cleanup.
|
||||
* CALL_ALLOC_AND_ENTER_INIT will set up
|
||||
* the frame to execute the EXIT_INIT_CHECK
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue