mirror of
https://github.com/python/cpython.git
synced 2025-09-02 15:07:53 +00:00
Improve stats presentation for calls. (GH-100274)
This commit is contained in:
parent
289c1126dd
commit
d4052d835b
1 changed files with 22 additions and 37 deletions
|
@ -394,14 +394,14 @@ _PyCode_Quicken(PyCodeObject *code)
|
|||
|
||||
#define SPEC_FAIL_CALL_INSTANCE_METHOD 11
|
||||
#define SPEC_FAIL_CALL_CMETHOD 12
|
||||
#define SPEC_FAIL_CALL_PYCFUNCTION 13
|
||||
#define SPEC_FAIL_CALL_PYCFUNCTION_WITH_KEYWORDS 14
|
||||
#define SPEC_FAIL_CALL_PYCFUNCTION_FAST_WITH_KEYWORDS 15
|
||||
#define SPEC_FAIL_CALL_PYCFUNCTION_NOARGS 16
|
||||
#define SPEC_FAIL_CALL_CFUNC_VARARGS 13
|
||||
#define SPEC_FAIL_CALL_CFUNC_VARARGS_KEYWORDS 14
|
||||
#define SPEC_FAIL_CALL_CFUNC_FASTCALL_KEYWORDS 15
|
||||
#define SPEC_FAIL_CALL_CFUNC_NOARGS 16
|
||||
#define SPEC_FAIL_CALL_BAD_CALL_FLAGS 17
|
||||
#define SPEC_FAIL_CALL_CLASS 18
|
||||
#define SPEC_FAIL_CALL_CFUNC_METHOD_FASTCALL_KEYWORDS 18
|
||||
#define SPEC_FAIL_CALL_PYTHON_CLASS 19
|
||||
#define SPEC_FAIL_CALL_METHOD_DESCRIPTOR 20
|
||||
#define SPEC_FAIL_CALL_PEP_523 20
|
||||
#define SPEC_FAIL_CALL_BOUND_METHOD 21
|
||||
#define SPEC_FAIL_CALL_STR 22
|
||||
#define SPEC_FAIL_CALL_CLASS_NO_VECTORCALL 23
|
||||
|
@ -409,8 +409,6 @@ _PyCode_Quicken(PyCodeObject *code)
|
|||
#define SPEC_FAIL_CALL_KWNAMES 25
|
||||
#define SPEC_FAIL_CALL_METHOD_WRAPPER 26
|
||||
#define SPEC_FAIL_CALL_OPERATOR_WRAPPER 27
|
||||
#define SPEC_FAIL_CALL_PYFUNCTION 28
|
||||
#define SPEC_FAIL_CALL_PEP_523 29
|
||||
|
||||
/* COMPARE_OP */
|
||||
#define SPEC_FAIL_COMPARE_OP_DIFFERENT_TYPES 12
|
||||
|
@ -1517,17 +1515,19 @@ builtin_call_fail_kind(int ml_flags)
|
|||
switch (ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O |
|
||||
METH_KEYWORDS | METH_METHOD)) {
|
||||
case METH_VARARGS:
|
||||
return SPEC_FAIL_CALL_PYCFUNCTION;
|
||||
return SPEC_FAIL_CALL_CFUNC_VARARGS;
|
||||
case METH_VARARGS | METH_KEYWORDS:
|
||||
return SPEC_FAIL_CALL_PYCFUNCTION_WITH_KEYWORDS;
|
||||
return SPEC_FAIL_CALL_CFUNC_VARARGS_KEYWORDS;
|
||||
case METH_FASTCALL | METH_KEYWORDS:
|
||||
return SPEC_FAIL_CALL_PYCFUNCTION_FAST_WITH_KEYWORDS;
|
||||
return SPEC_FAIL_CALL_CFUNC_FASTCALL_KEYWORDS;
|
||||
case METH_NOARGS:
|
||||
return SPEC_FAIL_CALL_PYCFUNCTION_NOARGS;
|
||||
/* This case should never happen with PyCFunctionObject -- only
|
||||
PyMethodObject. See zlib.compressobj()'s methods for an example.
|
||||
*/
|
||||
return SPEC_FAIL_CALL_CFUNC_NOARGS;
|
||||
case METH_METHOD | METH_FASTCALL | METH_KEYWORDS:
|
||||
return SPEC_FAIL_CALL_CFUNC_METHOD_FASTCALL_KEYWORDS;
|
||||
/* These cases should be optimized, but return "other" just in case */
|
||||
case METH_O:
|
||||
case METH_FASTCALL:
|
||||
return SPEC_FAIL_OTHER;
|
||||
default:
|
||||
return SPEC_FAIL_CALL_BAD_CALL_FLAGS;
|
||||
}
|
||||
|
@ -1698,33 +1698,18 @@ specialize_c_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs,
|
|||
static int
|
||||
call_fail_kind(PyObject *callable)
|
||||
{
|
||||
if (PyCFunction_CheckExact(callable)) {
|
||||
return SPEC_FAIL_CALL_PYCFUNCTION;
|
||||
}
|
||||
else if (PyFunction_Check(callable)) {
|
||||
return SPEC_FAIL_CALL_PYFUNCTION;
|
||||
}
|
||||
else if (PyInstanceMethod_Check(callable)) {
|
||||
assert(!PyCFunction_CheckExact(callable));
|
||||
assert(!PyFunction_Check(callable));
|
||||
assert(!PyType_Check(callable));
|
||||
assert(!Py_IS_TYPE(callable, &PyMethodDescr_Type));
|
||||
assert(!PyMethod_Check(callable));
|
||||
if (PyInstanceMethod_Check(callable)) {
|
||||
return SPEC_FAIL_CALL_INSTANCE_METHOD;
|
||||
}
|
||||
else if (PyMethod_Check(callable)) {
|
||||
return SPEC_FAIL_CALL_BOUND_METHOD;
|
||||
}
|
||||
// builtin method
|
||||
else if (PyCMethod_Check(callable)) {
|
||||
return SPEC_FAIL_CALL_CMETHOD;
|
||||
}
|
||||
else if (PyType_Check(callable)) {
|
||||
if (((PyTypeObject *)callable)->tp_new == PyBaseObject_Type.tp_new) {
|
||||
return SPEC_FAIL_CALL_PYTHON_CLASS;
|
||||
}
|
||||
else {
|
||||
return SPEC_FAIL_CALL_CLASS;
|
||||
}
|
||||
}
|
||||
else if (Py_IS_TYPE(callable, &PyMethodDescr_Type)) {
|
||||
return SPEC_FAIL_CALL_METHOD_DESCRIPTOR;
|
||||
}
|
||||
else if (Py_TYPE(callable) == &PyWrapperDescr_Type) {
|
||||
return SPEC_FAIL_CALL_OPERATOR_WRAPPER;
|
||||
}
|
||||
|
@ -1760,7 +1745,7 @@ _Py_Specialize_Call(PyObject *callable, _Py_CODEUNIT *instr, int nargs,
|
|||
fail = specialize_method_descriptor((PyMethodDescrObject *)callable,
|
||||
instr, nargs, kwnames);
|
||||
}
|
||||
else if (Py_TYPE(callable) == &PyMethod_Type) {
|
||||
else if (PyMethod_Check(callable)) {
|
||||
PyObject *func = ((PyMethodObject *)callable)->im_func;
|
||||
if (PyFunction_Check(func)) {
|
||||
fail = specialize_py_call((PyFunctionObject *)func,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue