Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit a021612

Browse filesBrowse files
authored
GH-99770: Make the correct call specialization fail kind show up in the stats (GH-99771)
1 parent 2b82c36 commit a021612
Copy full SHA for a021612

File tree

2 files changed

+85
-64
lines changed
Filter options

2 files changed

+85
-64
lines changed

‎Python/specialize.c

Copy file name to clipboardExpand all lines: Python/specialize.c
+84-63Lines changed: 84 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -309,26 +309,27 @@ _PyCode_Quicken(PyCodeObject *code)
309309
#define SPEC_FAIL_OUT_OF_RANGE 4
310310
#define SPEC_FAIL_EXPECTED_ERROR 5
311311
#define SPEC_FAIL_WRONG_NUMBER_ARGUMENTS 6
312-
#define SPEC_FAIL_NOT_PY_FUNCTION 7
312+
#define SPEC_FAIL_CODE_COMPLEX_PARAMETERS 7
313+
#define SPEC_FAIL_CODE_NOT_OPTIMIZED 8
313314

314315

315316
#define SPEC_FAIL_LOAD_GLOBAL_NON_DICT 17
316317
#define SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT 18
317318

318319
/* Attributes */
319320

320-
#define SPEC_FAIL_ATTR_OVERRIDING_DESCRIPTOR 8
321-
#define SPEC_FAIL_ATTR_NON_OVERRIDING_DESCRIPTOR 9
322-
#define SPEC_FAIL_ATTR_NOT_DESCRIPTOR 10
323-
#define SPEC_FAIL_ATTR_METHOD 11
324-
#define SPEC_FAIL_ATTR_MUTABLE_CLASS 12
325-
#define SPEC_FAIL_ATTR_PROPERTY 13
326-
#define SPEC_FAIL_ATTR_NON_OBJECT_SLOT 14
327-
#define SPEC_FAIL_ATTR_READ_ONLY 15
328-
#define SPEC_FAIL_ATTR_AUDITED_SLOT 16
329-
#define SPEC_FAIL_ATTR_NOT_MANAGED_DICT 17
330-
#define SPEC_FAIL_ATTR_NON_STRING_OR_SPLIT 18
331-
#define SPEC_FAIL_ATTR_MODULE_ATTR_NOT_FOUND 19
321+
#define SPEC_FAIL_ATTR_OVERRIDING_DESCRIPTOR 9
322+
#define SPEC_FAIL_ATTR_NON_OVERRIDING_DESCRIPTOR 10
323+
#define SPEC_FAIL_ATTR_NOT_DESCRIPTOR 11
324+
#define SPEC_FAIL_ATTR_METHOD 12
325+
#define SPEC_FAIL_ATTR_MUTABLE_CLASS 13
326+
#define SPEC_FAIL_ATTR_PROPERTY 14
327+
#define SPEC_FAIL_ATTR_NON_OBJECT_SLOT 15
328+
#define SPEC_FAIL_ATTR_READ_ONLY 16
329+
#define SPEC_FAIL_ATTR_AUDITED_SLOT 17
330+
#define SPEC_FAIL_ATTR_NOT_MANAGED_DICT 18
331+
#define SPEC_FAIL_ATTR_NON_STRING_OR_SPLIT 19
332+
#define SPEC_FAIL_ATTR_MODULE_ATTR_NOT_FOUND 20
332333

333334
#define SPEC_FAIL_ATTR_SHADOWED 21
334335
#define SPEC_FAIL_ATTR_BUILTIN_CLASS_METHOD 22
@@ -346,12 +347,12 @@ _PyCode_Quicken(PyCodeObject *code)
346347

347348
/* Binary subscr and store subscr */
348349

349-
#define SPEC_FAIL_SUBSCR_ARRAY_INT 8
350-
#define SPEC_FAIL_SUBSCR_ARRAY_SLICE 9
351-
#define SPEC_FAIL_SUBSCR_LIST_SLICE 10
352-
#define SPEC_FAIL_SUBSCR_TUPLE_SLICE 11
353-
#define SPEC_FAIL_SUBSCR_STRING_INT 12
354-
#define SPEC_FAIL_SUBSCR_STRING_SLICE 13
350+
#define SPEC_FAIL_SUBSCR_ARRAY_INT 9
351+
#define SPEC_FAIL_SUBSCR_ARRAY_SLICE 10
352+
#define SPEC_FAIL_SUBSCR_LIST_SLICE 11
353+
#define SPEC_FAIL_SUBSCR_TUPLE_SLICE 12
354+
#define SPEC_FAIL_SUBSCR_STRING_INT 13
355+
#define SPEC_FAIL_SUBSCR_STRING_SLICE 14
355356
#define SPEC_FAIL_SUBSCR_BUFFER_INT 15
356357
#define SPEC_FAIL_SUBSCR_BUFFER_SLICE 16
357358
#define SPEC_FAIL_SUBSCR_SEQUENCE_INT 17
@@ -366,49 +367,48 @@ _PyCode_Quicken(PyCodeObject *code)
366367

367368
/* Binary op */
368369

369-
#define SPEC_FAIL_BINARY_OP_ADD_DIFFERENT_TYPES 8
370-
#define SPEC_FAIL_BINARY_OP_ADD_OTHER 9
371-
#define SPEC_FAIL_BINARY_OP_AND_DIFFERENT_TYPES 10
372-
#define SPEC_FAIL_BINARY_OP_AND_INT 11
373-
#define SPEC_FAIL_BINARY_OP_AND_OTHER 12
374-
#define SPEC_FAIL_BINARY_OP_FLOOR_DIVIDE 13
375-
#define SPEC_FAIL_BINARY_OP_LSHIFT 14
376-
#define SPEC_FAIL_BINARY_OP_MATRIX_MULTIPLY 15
377-
#define SPEC_FAIL_BINARY_OP_MULTIPLY_DIFFERENT_TYPES 16
378-
#define SPEC_FAIL_BINARY_OP_MULTIPLY_OTHER 17
379-
#define SPEC_FAIL_BINARY_OP_OR 18
380-
#define SPEC_FAIL_BINARY_OP_POWER 19
381-
#define SPEC_FAIL_BINARY_OP_REMAINDER 20
382-
#define SPEC_FAIL_BINARY_OP_RSHIFT 21
383-
#define SPEC_FAIL_BINARY_OP_SUBTRACT_DIFFERENT_TYPES 22
384-
#define SPEC_FAIL_BINARY_OP_SUBTRACT_OTHER 23
385-
#define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_DIFFERENT_TYPES 24
386-
#define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_FLOAT 25
387-
#define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_OTHER 26
388-
#define SPEC_FAIL_BINARY_OP_XOR 27
370+
#define SPEC_FAIL_BINARY_OP_ADD_DIFFERENT_TYPES 9
371+
#define SPEC_FAIL_BINARY_OP_ADD_OTHER 10
372+
#define SPEC_FAIL_BINARY_OP_AND_DIFFERENT_TYPES 11
373+
#define SPEC_FAIL_BINARY_OP_AND_INT 12
374+
#define SPEC_FAIL_BINARY_OP_AND_OTHER 13
375+
#define SPEC_FAIL_BINARY_OP_FLOOR_DIVIDE 14
376+
#define SPEC_FAIL_BINARY_OP_LSHIFT 15
377+
#define SPEC_FAIL_BINARY_OP_MATRIX_MULTIPLY 16
378+
#define SPEC_FAIL_BINARY_OP_MULTIPLY_DIFFERENT_TYPES 17
379+
#define SPEC_FAIL_BINARY_OP_MULTIPLY_OTHER 18
380+
#define SPEC_FAIL_BINARY_OP_OR 19
381+
#define SPEC_FAIL_BINARY_OP_POWER 20
382+
#define SPEC_FAIL_BINARY_OP_REMAINDER 21
383+
#define SPEC_FAIL_BINARY_OP_RSHIFT 22
384+
#define SPEC_FAIL_BINARY_OP_SUBTRACT_DIFFERENT_TYPES 23
385+
#define SPEC_FAIL_BINARY_OP_SUBTRACT_OTHER 24
386+
#define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_DIFFERENT_TYPES 25
387+
#define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_FLOAT 26
388+
#define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_OTHER 27
389+
#define SPEC_FAIL_BINARY_OP_XOR 28
389390

390391
/* Calls */
391-
#define SPEC_FAIL_CALL_COMPLEX_PARAMETERS 9
392-
#define SPEC_FAIL_CALL_CO_NOT_OPTIMIZED 10
393-
/* SPEC_FAIL_METHOD defined as 11 above */
394392

395393
#define SPEC_FAIL_CALL_INSTANCE_METHOD 11
396394
#define SPEC_FAIL_CALL_CMETHOD 12
397395
#define SPEC_FAIL_CALL_CFUNC_VARARGS 13
398396
#define SPEC_FAIL_CALL_CFUNC_VARARGS_KEYWORDS 14
399-
#define SPEC_FAIL_CALL_CFUNC_FASTCALL_KEYWORDS 15
400-
#define SPEC_FAIL_CALL_CFUNC_NOARGS 16
401-
#define SPEC_FAIL_CALL_BAD_CALL_FLAGS 17
402-
#define SPEC_FAIL_CALL_CFUNC_METHOD_FASTCALL_KEYWORDS 18
403-
#define SPEC_FAIL_CALL_PYTHON_CLASS 19
404-
#define SPEC_FAIL_CALL_PEP_523 20
405-
#define SPEC_FAIL_CALL_BOUND_METHOD 21
406-
#define SPEC_FAIL_CALL_STR 22
407-
#define SPEC_FAIL_CALL_CLASS_NO_VECTORCALL 23
408-
#define SPEC_FAIL_CALL_CLASS_MUTABLE 24
409-
#define SPEC_FAIL_CALL_KWNAMES 25
410-
#define SPEC_FAIL_CALL_METHOD_WRAPPER 26
411-
#define SPEC_FAIL_CALL_OPERATOR_WRAPPER 27
397+
#define SPEC_FAIL_CALL_CFUNC_NOARGS 15
398+
#define SPEC_FAIL_CALL_CFUNC_METHOD_FASTCALL_KEYWORDS 16
399+
#define SPEC_FAIL_CALL_METH_DESCR_VARARGS 17
400+
#define SPEC_FAIL_CALL_METH_DESCR_VARARGS_KEYWORDS 18
401+
#define SPEC_FAIL_CALL_METH_DESCR_METHOD_FASTCALL_KEYWORDS 19
402+
#define SPEC_FAIL_CALL_BAD_CALL_FLAGS 20
403+
#define SPEC_FAIL_CALL_PYTHON_CLASS 21
404+
#define SPEC_FAIL_CALL_PEP_523 22
405+
#define SPEC_FAIL_CALL_BOUND_METHOD 23
406+
#define SPEC_FAIL_CALL_STR 24
407+
#define SPEC_FAIL_CALL_CLASS_NO_VECTORCALL 25
408+
#define SPEC_FAIL_CALL_CLASS_MUTABLE 26
409+
#define SPEC_FAIL_CALL_KWNAMES 27
410+
#define SPEC_FAIL_CALL_METHOD_WRAPPER 28
411+
#define SPEC_FAIL_CALL_OPERATOR_WRAPPER 29
412412

413413
/* COMPARE_OP */
414414
#define SPEC_FAIL_COMPARE_OP_DIFFERENT_TYPES 12
@@ -449,8 +449,8 @@ _PyCode_Quicken(PyCodeObject *code)
449449

450450
// UNPACK_SEQUENCE
451451

452-
#define SPEC_FAIL_UNPACK_SEQUENCE_ITERATOR 8
453-
#define SPEC_FAIL_UNPACK_SEQUENCE_SEQUENCE 9
452+
#define SPEC_FAIL_UNPACK_SEQUENCE_ITERATOR 9
453+
#define SPEC_FAIL_UNPACK_SEQUENCE_SEQUENCE 10
454454

455455
static int function_kind(PyCodeObject *code);
456456
static bool function_check_args(PyObject *o, int expected_argcount, int opcode);
@@ -1251,10 +1251,10 @@ static int
12511251
function_kind(PyCodeObject *code) {
12521252
int flags = code->co_flags;
12531253
if ((flags & (CO_VARKEYWORDS | CO_VARARGS)) || code->co_kwonlyargcount) {
1254-
return SPEC_FAIL_CALL_COMPLEX_PARAMETERS;
1254+
return SPEC_FAIL_CODE_COMPLEX_PARAMETERS;
12551255
}
12561256
if ((flags & CO_OPTIMIZED) == 0) {
1257-
return SPEC_FAIL_CALL_CO_NOT_OPTIMIZED;
1257+
return SPEC_FAIL_CODE_NOT_OPTIMIZED;
12581258
}
12591259
return SIMPLE_FUNCTION;
12601260
}
@@ -1526,15 +1526,36 @@ builtin_call_fail_kind(int ml_flags)
15261526
return SPEC_FAIL_CALL_CFUNC_VARARGS;
15271527
case METH_VARARGS | METH_KEYWORDS:
15281528
return SPEC_FAIL_CALL_CFUNC_VARARGS_KEYWORDS;
1529-
case METH_FASTCALL | METH_KEYWORDS:
1530-
return SPEC_FAIL_CALL_CFUNC_FASTCALL_KEYWORDS;
15311529
case METH_NOARGS:
15321530
return SPEC_FAIL_CALL_CFUNC_NOARGS;
15331531
case METH_METHOD | METH_FASTCALL | METH_KEYWORDS:
15341532
return SPEC_FAIL_CALL_CFUNC_METHOD_FASTCALL_KEYWORDS;
15351533
/* These cases should be optimized, but return "other" just in case */
15361534
case METH_O:
15371535
case METH_FASTCALL:
1536+
case METH_FASTCALL | METH_KEYWORDS:
1537+
return SPEC_FAIL_OTHER;
1538+
default:
1539+
return SPEC_FAIL_CALL_BAD_CALL_FLAGS;
1540+
}
1541+
}
1542+
1543+
static int
1544+
meth_descr_call_fail_kind(int ml_flags)
1545+
{
1546+
switch (ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O |
1547+
METH_KEYWORDS | METH_METHOD)) {
1548+
case METH_VARARGS:
1549+
return SPEC_FAIL_CALL_METH_DESCR_VARARGS;
1550+
case METH_VARARGS | METH_KEYWORDS:
1551+
return SPEC_FAIL_CALL_METH_DESCR_VARARGS_KEYWORDS;
1552+
case METH_METHOD | METH_FASTCALL | METH_KEYWORDS:
1553+
return SPEC_FAIL_CALL_METH_DESCR_METHOD_FASTCALL_KEYWORDS;
1554+
/* These cases should be optimized, but return "other" just in case */
1555+
case METH_NOARGS:
1556+
case METH_O:
1557+
case METH_FASTCALL:
1558+
case METH_FASTCALL | METH_KEYWORDS:
15381559
return SPEC_FAIL_OTHER;
15391560
default:
15401561
return SPEC_FAIL_CALL_BAD_CALL_FLAGS;
@@ -1583,12 +1604,12 @@ specialize_method_descriptor(PyMethodDescrObject *descr, _Py_CODEUNIT *instr,
15831604
_py_set_opcode(instr, CALL_NO_KW_METHOD_DESCRIPTOR_FAST);
15841605
return 0;
15851606
}
1586-
case METH_FASTCALL|METH_KEYWORDS: {
1607+
case METH_FASTCALL | METH_KEYWORDS: {
15871608
_py_set_opcode(instr, CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS);
15881609
return 0;
15891610
}
15901611
}
1591-
SPECIALIZATION_FAIL(CALL, builtin_call_fail_kind(descr->d_method->ml_flags));
1612+
SPECIALIZATION_FAIL(CALL, meth_descr_call_fail_kind(descr->d_method->ml_flags));
15921613
return -1;
15931614
}
15941615

‎Tools/scripts/summarize_stats.py

Copy file name to clipboardExpand all lines: Tools/scripts/summarize_stats.py
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ def pretty(defname):
224224
return defname.replace("_", " ").lower()
225225

226226
def kind_to_text(kind, defines, opname):
227-
if kind <= 7:
227+
if kind <= 8:
228228
return pretty(defines[kind][0])
229229
if opname.endswith("ATTR"):
230230
opname = "ATTR"

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.