]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Include length in stats for UNPACK_SEQUENCE. (GH-31254)
authorMark Shannon <mark@hotpy.org>
Mon, 14 Feb 2022 10:01:31 +0000 (10:01 +0000)
committerGitHub <noreply@github.com>
Mon, 14 Feb 2022 10:01:31 +0000 (10:01 +0000)
Python/ceval.c
Python/specialize.c

index 5eb91502c3010c72c7468d5c4f30669950c722b1..ad8b05400d5645f50611cb8338a00a1df929741a 100644 (file)
@@ -2740,10 +2740,10 @@ handle_eval_breaker:
             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) {
index 1259a3ca3ecccbfdd63aac709d4e21a2a52fe1a2..b54a2ecd506fc637113803d2d9467d6a32067e78 100644 (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