Skip to content

Commit a021612

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

File tree

2 files changed

+85
-64
lines changed

2 files changed

+85
-64
lines changed

Python/specialize.c

+84-63
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

+1-1
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)