From 8c9ef8f1f8fff3403572d50e77043c4bdc3aaf27 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Tue, 8 Apr 2025 09:50:51 +0100 Subject: gh-100239: more stats for BINARY_OP/SUBSCR specialization (#132230) --- Include/cpython/pystats.h | 2 +- Python/specialize.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Include/cpython/pystats.h b/Include/cpython/pystats.h index f16391f..7c1459b 100644 --- a/Include/cpython/pystats.h +++ b/Include/cpython/pystats.h @@ -31,7 +31,7 @@ #define PYSTATS_MAX_UOP_ID 512 -#define SPECIALIZATION_FAILURE_KINDS 44 +#define SPECIALIZATION_FAILURE_KINDS 50 /* Stats for determining who is calling PyEval_EvalFrame */ #define EVAL_CALL_TOTAL 0 diff --git a/Python/specialize.c b/Python/specialize.c index f73f322..498dcd3 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -604,6 +604,12 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t size, int enable_counters #define SPEC_FAIL_BINARY_OP_SUBSCR_DEQUE 42 #define SPEC_FAIL_BINARY_OP_SUBSCR_ENUMDICT 43 #define SPEC_FAIL_BINARY_OP_SUBSCR_STACKSUMMARY 44 +#define SPEC_FAIL_BINARY_OP_SUBSCR_DEFAULTDICT 45 +#define SPEC_FAIL_BINARY_OP_SUBSCR_COUNTER 46 +#define SPEC_FAIL_BINARY_OP_SUBSCR_ORDEREDDICT 47 +#define SPEC_FAIL_BINARY_OP_SUBSCR_BYTES 48 +#define SPEC_FAIL_BINARY_OP_SUBSCR_STRUCTTIME 49 +#define SPEC_FAIL_BINARY_OP_SUBSCR_RANGE 50 /* Calls */ @@ -2370,6 +2376,14 @@ binary_op_fail_kind(int oparg, PyObject *lhs, PyObject *rhs) return SPEC_FAIL_BINARY_OP_SUBSCR_MAPPINGPROXY; } + if (PyObject_TypeCheck(lhs, &PyBytes_Type)) { + return SPEC_FAIL_BINARY_OP_SUBSCR_BYTES; + } + + if (PyObject_TypeCheck(lhs, &PyRange_Type)) { + return SPEC_FAIL_BINARY_OP_SUBSCR_RANGE; + } + if (strcmp(container_type->tp_name, "array.array") == 0) { return SPEC_FAIL_BINARY_OP_SUBSCR_ARRAY; } @@ -2390,6 +2404,22 @@ binary_op_fail_kind(int oparg, PyObject *lhs, PyObject *rhs) return SPEC_FAIL_BINARY_OP_SUBSCR_STACKSUMMARY; } + if (strcmp(container_type->tp_name, "collections.defaultdict") == 0) { + return SPEC_FAIL_BINARY_OP_SUBSCR_DEFAULTDICT; + } + + if (strcmp(container_type->tp_name, "Counter") == 0) { + return SPEC_FAIL_BINARY_OP_SUBSCR_COUNTER; + } + + if (strcmp(container_type->tp_name, "collections.OrderedDict") == 0) { + return SPEC_FAIL_BINARY_OP_SUBSCR_ORDEREDDICT; + } + + if (strcmp(container_type->tp_name, "time.struct_time") == 0) { + return SPEC_FAIL_BINARY_OP_SUBSCR_STRUCTTIME; + } + if (PySlice_Check(rhs)) { return SPEC_FAIL_BINARY_OP_SUBSCR_OTHER_SLICE; } -- cgit v0.12