@@ -1237,6 +1237,28 @@ _Py_Specialize_BinaryMultiply(PyObject *left, PyObject *right, _Py_CODEUNIT *ins
1237
1237
}
1238
1238
1239
1239
1240
+ static int
1241
+ builtin_call_fail_kind (int ml_flags )
1242
+ {
1243
+ switch (ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O |
1244
+ METH_KEYWORDS | METH_METHOD )) {
1245
+ case METH_VARARGS :
1246
+ return SPEC_FAIL_PYCFUNCTION ;
1247
+ case METH_VARARGS | METH_KEYWORDS :
1248
+ return SPEC_FAIL_PYCFUNCTION_WITH_KEYWORDS ;
1249
+ case METH_FASTCALL | METH_KEYWORDS :
1250
+ return SPEC_FAIL_PYCFUNCTION_FAST_WITH_KEYWORDS ;
1251
+ case METH_NOARGS :
1252
+ return SPEC_FAIL_PYCFUNCTION_NOARGS ;
1253
+ /* This case should never happen with PyCFunctionObject -- only
1254
+ PyMethodObject. See zlib.compressobj()'s methods for an example.
1255
+ */
1256
+ case METH_METHOD | METH_FASTCALL | METH_KEYWORDS :
1257
+ default :
1258
+ return SPEC_FAIL_BAD_CALL_FLAGS ;
1259
+ }
1260
+ }
1261
+
1240
1262
static int
1241
1263
specialize_c_call (PyObject * callable , _Py_CODEUNIT * instr , int nargs ,
1242
1264
SpecializedCacheEntry * cache , PyObject * builtins )
@@ -1281,35 +1303,17 @@ specialize_c_call(PyObject *callable, _Py_CODEUNIT *instr, int nargs,
1281
1303
_Py_OPARG (* instr ));
1282
1304
return 0 ;
1283
1305
}
1284
- case METH_VARARGS :
1285
- SPECIALIZATION_FAIL (CALL_FUNCTION , SPEC_FAIL_PYCFUNCTION );
1286
- return 1 ;
1287
- case METH_VARARGS | METH_KEYWORDS :
1288
- SPECIALIZATION_FAIL (CALL_FUNCTION ,
1289
- SPEC_FAIL_PYCFUNCTION_WITH_KEYWORDS );
1290
- return 1 ;
1291
- case METH_FASTCALL | METH_KEYWORDS :
1292
- SPECIALIZATION_FAIL (CALL_FUNCTION ,
1293
- SPEC_FAIL_PYCFUNCTION_FAST_WITH_KEYWORDS );
1294
- return 1 ;
1295
- case METH_NOARGS :
1296
- SPECIALIZATION_FAIL (CALL_FUNCTION , SPEC_FAIL_PYCFUNCTION_NOARGS );
1297
- return 1 ;
1298
- /* This case should never happen with PyCFunctionObject -- only
1299
- PyMethodObject. See zlib.compressobj()'s methods for an example.
1300
- */
1301
- case METH_METHOD | METH_FASTCALL | METH_KEYWORDS :
1302
1306
default :
1303
- SPECIALIZATION_FAIL (CALL_FUNCTION , SPEC_FAIL_BAD_CALL_FLAGS );
1307
+ SPECIALIZATION_FAIL (CALL_FUNCTION ,
1308
+ builtin_call_fail_kind (PyCFunction_GET_FLAGS (callable )));
1304
1309
return 1 ;
1305
1310
}
1306
1311
}
1307
1312
1308
1313
#if COLLECT_SPECIALIZATION_STATS_DETAILED
1309
1314
static int
1310
- c_call_fail_kind (PyObject * callable )
1315
+ call_fail_kind (PyObject * callable )
1311
1316
{
1312
- /* These might be implemented in the future. Collecting stats for now. */
1313
1317
if (PyFunction_Check (callable )) {
1314
1318
return SPEC_FAIL_PYTHON_FUNCTION ;
1315
1319
}
@@ -1348,7 +1352,7 @@ _Py_Specialize_CallFunction(
1348
1352
fail = specialize_c_call (callable , instr , nargs , cache , builtins );
1349
1353
}
1350
1354
else {
1351
- SPECIALIZATION_FAIL (CALL_FUNCTION , c_call_fail_kind (callable ));
1355
+ SPECIALIZATION_FAIL (CALL_FUNCTION , call_fail_kind (callable ));
1352
1356
fail = 1 ;
1353
1357
}
1354
1358
_PyAdaptiveEntry * cache0 = & cache -> adaptive ;
0 commit comments