summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c6
-rw-r--r--Python/specialize.c17
2 files changed, 22 insertions, 1 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 3197fe8..b4029d1 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2792,6 +2792,12 @@ handle_eval_breaker:
TARGET(UNPACK_SEQUENCE) {
PREDICTED(UNPACK_SEQUENCE);
PyObject *seq = POP(), *item, **items;
+#ifdef Py_STATS
+ extern int _PySpecialization_ClassifySequence(PyObject *);
+ _py_stats.opcode_stats[UNPACK_SEQUENCE].specialization.failure++;
+ _py_stats.opcode_stats[UNPACK_SEQUENCE].specialization.
+ failure_kinds[_PySpecialization_ClassifySequence(seq)]++;
+#endif
if (PyTuple_CheckExact(seq) &&
PyTuple_GET_SIZE(seq) == oparg) {
items = ((PyTupleObject *)seq)->ob_item;
diff --git a/Python/specialize.c b/Python/specialize.c
index 214f297..4070d6a 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -572,6 +572,10 @@ initial_counter_value(void) {
#define SPEC_FAIL_ITER_DICT_VALUES 22
#define SPEC_FAIL_ITER_ENUMERATE 23
+/* UNPACK_SEQUENCE */
+#define SPEC_FAIL_TUPLE 10
+#define SPEC_FAIL_LIST 11
+
static int
specialize_module_load_attr(
@@ -1880,7 +1884,6 @@ success:
adaptive->counter = initial_counter_value();
}
-
int
_PySpecialization_ClassifyIterator(PyObject *iter)
{
@@ -1930,3 +1933,15 @@ int
}
return SPEC_FAIL_OTHER;
}
+
+int
+_PySpecialization_ClassifySequence(PyObject *seq)
+{
+ if (PyTuple_CheckExact(seq)) {
+ return SPEC_FAIL_TUPLE;
+ }
+ if (PyList_CheckExact(seq)) {
+ return SPEC_FAIL_LIST;
+ }
+ return SPEC_FAIL_OTHER;
+}