summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2022-12-16 15:43:04 (GMT)
committerGitHub <noreply@github.com>2022-12-16 15:43:04 (GMT)
commitd4052d835bd6f1b648d533dab8c228b6e3944651 (patch)
treea4d02c8923aed50e66bc9fda8a43f054d61793e8
parent289c1126dd59e5daae59a7ee8a0aca547c1e351e (diff)
downloadcpython-d4052d835bd6f1b648d533dab8c228b6e3944651.zip
cpython-d4052d835bd6f1b648d533dab8c228b6e3944651.tar.gz
cpython-d4052d835bd6f1b648d533dab8c228b6e3944651.tar.bz2
Improve stats presentation for calls. (GH-100274)
-rw-r--r--Python/specialize.c59
1 files changed, 22 insertions, 37 deletions
diff --git a/Python/specialize.c b/Python/specialize.c
index 2e135be..020127e 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -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,