/* Mark some opcodes as specializable for stats,
* even though we don't specialize them yet. */
fprintf(out, " opcode[%d].specializable : 1\n", FOR_ITER);
+ fprintf(out, " opcode[%d].specializable : 1\n", PRECALL_FUNCTION);
fprintf(out, " opcode[%d].specializable : 1\n", UNPACK_SEQUENCE);
for (int i = 0; i < 256; i++) {
if (adaptive_opcodes[i]) {
#define SPEC_FAIL_CALL_BAD_CALL_FLAGS 17
#define SPEC_FAIL_CALL_CLASS 18
#define SPEC_FAIL_CALL_PYTHON_CLASS 19
-#define SPEC_FAIL_CALL_C_METHOD_CALL 20
+#define SPEC_FAIL_CALL_METHOD_DESCRIPTOR 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
/* COMPARE_OP */
#define SPEC_FAIL_COMPARE_OP_DIFFERENT_TYPES 12
static int
call_fail_kind(PyObject *callable)
{
- if (PyInstanceMethod_Check(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)) {
return SPEC_FAIL_CALL_INSTANCE_METHOD;
}
else if (PyMethod_Check(callable)) {
return SPEC_FAIL_CALL_CMETHOD;
}
else if (PyType_Check(callable)) {
- return SPEC_FAIL_CALL_CLASS;
+ 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;
adaptive->counter = initial_counter_value();
}
+#ifdef Py_STATS
+
int
_PySpecialization_ClassifyIterator(PyObject *iter)
{
}
return SPEC_FAIL_OTHER;
}
+
+int
+_PySpecialization_ClassifyCallable(PyObject *callable)
+{
+ return call_fail_kind(callable);
+}
+
+#endif