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

Lines changed: 2 additions & 0 deletions
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

Lines changed: 0 additions & 3 deletions
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

Lines changed: 45 additions & 41 deletions
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

Lines changed: 2 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy