Include length in stats for UNPACK_SEQUENCE. (GH-31254)

This commit is contained in:
Mark Shannon 2022-02-14 10:01:31 +00:00 committed by GitHub
parent 1d6ce67c29
commit 15ee55528e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 8 deletions

View file

@ -2740,10 +2740,10 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
PREDICTED(UNPACK_SEQUENCE);
PyObject *seq = POP(), *item, **items;
#ifdef Py_STATS
extern int _PySpecialization_ClassifySequence(PyObject *);
extern int _PySpecialization_ClassifySequence(PyObject *, int);
_py_stats.opcode_stats[UNPACK_SEQUENCE].specialization.failure++;
_py_stats.opcode_stats[UNPACK_SEQUENCE].specialization.
failure_kinds[_PySpecialization_ClassifySequence(seq)]++;
failure_kinds[_PySpecialization_ClassifySequence(seq, oparg)]++;
#endif
if (PyTuple_CheckExact(seq) &&
PyTuple_GET_SIZE(seq) == oparg) {

View file

@ -602,8 +602,26 @@ initial_counter_value(void) {
#define SPEC_FAIL_FOR_ITER_ENUMERATE 23
/* UNPACK_SEQUENCE */
#define SPEC_FAIL_UNPACK_SEQUENCE_TUPLE 10
#define SPEC_FAIL_UNPACK_SEQUENCE_LIST 11
#define SPEC_FAIL_UNPACK_SEQUENCE_TUPLE_0 9
#define SPEC_FAIL_UNPACK_SEQUENCE_TUPLE_1 10
#define SPEC_FAIL_UNPACK_SEQUENCE_TUPLE_2 11
#define SPEC_FAIL_UNPACK_SEQUENCE_TUPLE_3 12
#define SPEC_FAIL_UNPACK_SEQUENCE_TUPLE_4 13
#define SPEC_FAIL_UNPACK_SEQUENCE_TUPLE_N 14
#define SPEC_FAIL_UNPACK_SEQUENCE_LIST_0 15
#define SPEC_FAIL_UNPACK_SEQUENCE_LIST_1 16
#define SPEC_FAIL_UNPACK_SEQUENCE_LIST_2 17
#define SPEC_FAIL_UNPACK_SEQUENCE_LIST_3 18
#define SPEC_FAIL_UNPACK_SEQUENCE_LIST_4 19
#define SPEC_FAIL_UNPACK_SEQUENCE_LIST_N 20
#define SPEC_FAIL_UNPACK_SEQUENCE_OTHER_0 21
#define SPEC_FAIL_UNPACK_SEQUENCE_OTHER_1 22
#define SPEC_FAIL_UNPACK_SEQUENCE_OTHER_2 23
#define SPEC_FAIL_UNPACK_SEQUENCE_OTHER_3 24
#define SPEC_FAIL_UNPACK_SEQUENCE_OTHER_4 25
#define SPEC_FAIL_UNPACK_SEQUENCE_OTHER_N 26
static int
@ -1978,15 +1996,19 @@ int
}
int
_PySpecialization_ClassifySequence(PyObject *seq)
_PySpecialization_ClassifySequence(PyObject *seq, int n)
{
assert(n >= 0);
if (n > 4) {
n = 5;
}
if (PyTuple_CheckExact(seq)) {
return SPEC_FAIL_UNPACK_SEQUENCE_TUPLE;
return SPEC_FAIL_UNPACK_SEQUENCE_TUPLE_0 + n;
}
if (PyList_CheckExact(seq)) {
return SPEC_FAIL_UNPACK_SEQUENCE_LIST;
return SPEC_FAIL_UNPACK_SEQUENCE_LIST_0 + n;
}
return SPEC_FAIL_OTHER;
return SPEC_FAIL_UNPACK_SEQUENCE_OTHER_0 + n;
}
int