Skip to content

Commit 373bca0

Browse files
authored
GH-102181: Improve specialization stats for SEND (GH-102182)
1 parent 7b8d7f5 commit 373bca0

File tree

4 files changed

+49
-44
lines changed

4 files changed

+49
-44
lines changed

Include/cpython/genobject.h

+2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ PyAPI_FUNC(PyObject *) PyAsyncGen_New(PyFrameObject *,
7777

7878
#define PyAsyncGen_CheckExact(op) Py_IS_TYPE((op), &PyAsyncGen_Type)
7979

80+
#define PyAsyncGenASend_CheckExact(op) Py_IS_TYPE((op), &_PyAsyncGenASend_Type)
81+
8082

8183
#undef _PyGenObject_HEAD
8284

Objects/genobject.c

-3
Original file line numberDiff line numberDiff line change
@@ -1406,9 +1406,6 @@ typedef struct _PyAsyncGenWrappedValue {
14061406
#define _PyAsyncGenWrappedValue_CheckExact(o) \
14071407
Py_IS_TYPE(o, &_PyAsyncGenWrappedValue_Type)
14081408

1409-
#define PyAsyncGenASend_CheckExact(o) \
1410-
Py_IS_TYPE(o, &_PyAsyncGenASend_Type)
1411-
14121409

14131410
static int
14141411
async_gen_traverse(PyAsyncGenObject *gen, visitproc visit, void *arg)

Python/specialize.c

+45-41
Original file line numberDiff line numberDiff line change
@@ -436,27 +436,28 @@ _PyCode_Quicken(PyCodeObject *code)
436436
#define SPEC_FAIL_COMPARE_OP_FLOAT_LONG 21
437437
#define SPEC_FAIL_COMPARE_OP_LONG_FLOAT 22
438438

439-
/* FOR_ITER */
440-
#define SPEC_FAIL_FOR_ITER_GENERATOR 10
441-
#define SPEC_FAIL_FOR_ITER_COROUTINE 11
442-
#define SPEC_FAIL_FOR_ITER_ASYNC_GENERATOR 12
443-
#define SPEC_FAIL_FOR_ITER_LIST 13
444-
#define SPEC_FAIL_FOR_ITER_TUPLE 14
445-
#define SPEC_FAIL_FOR_ITER_SET 15
446-
#define SPEC_FAIL_FOR_ITER_STRING 16
447-
#define SPEC_FAIL_FOR_ITER_BYTES 17
448-
#define SPEC_FAIL_FOR_ITER_RANGE 18
449-
#define SPEC_FAIL_FOR_ITER_ITERTOOLS 19
450-
#define SPEC_FAIL_FOR_ITER_DICT_KEYS 20
451-
#define SPEC_FAIL_FOR_ITER_DICT_ITEMS 21
452-
#define SPEC_FAIL_FOR_ITER_DICT_VALUES 22
453-
#define SPEC_FAIL_FOR_ITER_ENUMERATE 23
454-
#define SPEC_FAIL_FOR_ITER_MAP 24
455-
#define SPEC_FAIL_FOR_ITER_ZIP 25
456-
#define SPEC_FAIL_FOR_ITER_SEQ_ITER 26
457-
#define SPEC_FAIL_FOR_ITER_REVERSED_LIST 27
458-
#define SPEC_FAIL_FOR_ITER_CALLABLE 28
459-
#define SPEC_FAIL_FOR_ITER_ASCII_STRING 29
439+
/* FOR_ITER and SEND */
440+
#define SPEC_FAIL_ITER_GENERATOR 10
441+
#define SPEC_FAIL_ITER_COROUTINE 11
442+
#define SPEC_FAIL_ITER_ASYNC_GENERATOR 12
443+
#define SPEC_FAIL_ITER_LIST 13
444+
#define SPEC_FAIL_ITER_TUPLE 14
445+
#define SPEC_FAIL_ITER_SET 15
446+
#define SPEC_FAIL_ITER_STRING 16
447+
#define SPEC_FAIL_ITER_BYTES 17
448+
#define SPEC_FAIL_ITER_RANGE 18
449+
#define SPEC_FAIL_ITER_ITERTOOLS 19
450+
#define SPEC_FAIL_ITER_DICT_KEYS 20
451+
#define SPEC_FAIL_ITER_DICT_ITEMS 21
452+
#define SPEC_FAIL_ITER_DICT_VALUES 22
453+
#define SPEC_FAIL_ITER_ENUMERATE 23
454+
#define SPEC_FAIL_ITER_MAP 24
455+
#define SPEC_FAIL_ITER_ZIP 25
456+
#define SPEC_FAIL_ITER_SEQ_ITER 26
457+
#define SPEC_FAIL_ITER_REVERSED_LIST 27
458+
#define SPEC_FAIL_ITER_CALLABLE 28
459+
#define SPEC_FAIL_ITER_ASCII_STRING 29
460+
#define SPEC_FAIL_ITER_ASYNC_GENERATOR_SEND 30
460461

461462
// UNPACK_SEQUENCE
462463

@@ -2122,66 +2123,69 @@ int
21222123
_PySpecialization_ClassifyIterator(PyObject *iter)
21232124
{
21242125
if (PyGen_CheckExact(iter)) {
2125-
return SPEC_FAIL_FOR_ITER_GENERATOR;
2126+
return SPEC_FAIL_ITER_GENERATOR;
21262127
}
21272128
if (PyCoro_CheckExact(iter)) {
2128-
return SPEC_FAIL_FOR_ITER_COROUTINE;
2129+
return SPEC_FAIL_ITER_COROUTINE;
21292130
}
21302131
if (PyAsyncGen_CheckExact(iter)) {
2131-
return SPEC_FAIL_FOR_ITER_ASYNC_GENERATOR;
2132+
return SPEC_FAIL_ITER_ASYNC_GENERATOR;
2133+
}
2134+
if (PyAsyncGenASend_CheckExact(iter)) {
2135+
return SPEC_FAIL_ITER_ASYNC_GENERATOR_SEND;
21322136
}
21332137
PyTypeObject *t = Py_TYPE(iter);
21342138
if (t == &PyListIter_Type) {
2135-
return SPEC_FAIL_FOR_ITER_LIST;
2139+
return SPEC_FAIL_ITER_LIST;
21362140
}
21372141
if (t == &PyTupleIter_Type) {
2138-
return SPEC_FAIL_FOR_ITER_TUPLE;
2142+
return SPEC_FAIL_ITER_TUPLE;
21392143
}
21402144
if (t == &PyDictIterKey_Type) {
2141-
return SPEC_FAIL_FOR_ITER_DICT_KEYS;
2145+
return SPEC_FAIL_ITER_DICT_KEYS;
21422146
}
21432147
if (t == &PyDictIterValue_Type) {
2144-
return SPEC_FAIL_FOR_ITER_DICT_VALUES;
2148+
return SPEC_FAIL_ITER_DICT_VALUES;
21452149
}
21462150
if (t == &PyDictIterItem_Type) {
2147-
return SPEC_FAIL_FOR_ITER_DICT_ITEMS;
2151+
return SPEC_FAIL_ITER_DICT_ITEMS;
21482152
}
21492153
if (t == &PySetIter_Type) {
2150-
return SPEC_FAIL_FOR_ITER_SET;
2154+
return SPEC_FAIL_ITER_SET;
21512155
}
21522156
if (t == &PyUnicodeIter_Type) {
2153-
return SPEC_FAIL_FOR_ITER_STRING;
2157+
return SPEC_FAIL_ITER_STRING;
21542158
}
21552159
if (t == &PyBytesIter_Type) {
2156-
return SPEC_FAIL_FOR_ITER_BYTES;
2160+
return SPEC_FAIL_ITER_BYTES;
21572161
}
21582162
if (t == &PyRangeIter_Type) {
2159-
return SPEC_FAIL_FOR_ITER_RANGE;
2163+
return SPEC_FAIL_ITER_RANGE;
21602164
}
21612165
if (t == &PyEnum_Type) {
2162-
return SPEC_FAIL_FOR_ITER_ENUMERATE;
2166+
return SPEC_FAIL_ITER_ENUMERATE;
21632167
}
21642168
if (t == &PyMap_Type) {
2165-
return SPEC_FAIL_FOR_ITER_MAP;
2169+
return SPEC_FAIL_ITER_MAP;
21662170
}
21672171
if (t == &PyZip_Type) {
2168-
return SPEC_FAIL_FOR_ITER_ZIP;
2172+
return SPEC_FAIL_ITER_ZIP;
21692173
}
21702174
if (t == &PySeqIter_Type) {
2171-
return SPEC_FAIL_FOR_ITER_SEQ_ITER;
2175+
return SPEC_FAIL_ITER_SEQ_ITER;
21722176
}
21732177
if (t == &PyListRevIter_Type) {
2174-
return SPEC_FAIL_FOR_ITER_REVERSED_LIST;
2178+
return SPEC_FAIL_ITER_REVERSED_LIST;
21752179
}
21762180
if (t == &_PyUnicodeASCIIIter_Type) {
2177-
return SPEC_FAIL_FOR_ITER_ASCII_STRING;
2181+
return SPEC_FAIL_ITER_ASCII_STRING;
21782182
}
21792183
const char *name = t->tp_name;
21802184
if (strncmp(name, "itertools", 9) == 0) {
2181-
return SPEC_FAIL_FOR_ITER_ITERTOOLS;
2185+
return SPEC_FAIL_ITER_ITERTOOLS;
21822186
}
21832187
if (strncmp(name, "callable_iterator", 17) == 0) {
2184-
return SPEC_FAIL_FOR_ITER_CALLABLE;
2188+
return SPEC_FAIL_ITER_CALLABLE;
21852189
}
21862190
return SPEC_FAIL_OTHER;
21872191
}

Tools/scripts/summarize_stats.py

+2
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ def kind_to_text(kind, defines, opname):
228228
return pretty(defines[kind][0])
229229
if opname.endswith("ATTR"):
230230
opname = "ATTR"
231+
if opname in ("FOR_ITER", "SEND"):
232+
opname = "ITER"
231233
if opname.endswith("SUBSCR"):
232234
opname = "SUBSCR"
233235
for name in defines[kind]:

0 commit comments

Comments
 (0)