#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
#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
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;
}
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;
}
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,