@@ -396,19 +396,21 @@ _PyCode_Quicken(PyCodeObject *code)
396
396
#define SPEC_FAIL_CALL_CMETHOD 12
397
397
#define SPEC_FAIL_CALL_CFUNC_VARARGS 13
398
398
#define SPEC_FAIL_CALL_CFUNC_VARARGS_KEYWORDS 14
399
- #define SPEC_FAIL_CALL_CFUNC_FASTCALL_KEYWORDS 15
400
- #define SPEC_FAIL_CALL_CFUNC_NOARGS 16
401
- #define SPEC_FAIL_CALL_BAD_CALL_FLAGS 17
402
- #define SPEC_FAIL_CALL_CFUNC_METHOD_FASTCALL_KEYWORDS 18
403
- #define SPEC_FAIL_CALL_PYTHON_CLASS 19
404
- #define SPEC_FAIL_CALL_PEP_523 20
405
- #define SPEC_FAIL_CALL_BOUND_METHOD 21
406
- #define SPEC_FAIL_CALL_STR 22
407
- #define SPEC_FAIL_CALL_CLASS_NO_VECTORCALL 23
408
- #define SPEC_FAIL_CALL_CLASS_MUTABLE 24
409
- #define SPEC_FAIL_CALL_KWNAMES 25
410
- #define SPEC_FAIL_CALL_METHOD_WRAPPER 26
411
- #define SPEC_FAIL_CALL_OPERATOR_WRAPPER 27
399
+ #define SPEC_FAIL_CALL_CFUNC_NOARGS 15
400
+ #define SPEC_FAIL_CALL_CFUNC_METHOD_FASTCALL_KEYWORDS 16
401
+ #define SPEC_FAIL_CALL_METH_DESCR_VARARGS 17
402
+ #define SPEC_FAIL_CALL_METH_DESCR_VARARGS_KEYWORDS 18
403
+ #define SPEC_FAIL_CALL_METH_DESCR_METHOD_FASTCALL_KEYWORDS 19
404
+ #define SPEC_FAIL_CALL_BAD_CALL_FLAGS 20
405
+ #define SPEC_FAIL_CALL_PYTHON_CLASS 21
406
+ #define SPEC_FAIL_CALL_PEP_523 22
407
+ #define SPEC_FAIL_CALL_BOUND_METHOD 23
408
+ #define SPEC_FAIL_CALL_STR 24
409
+ #define SPEC_FAIL_CALL_CLASS_NO_VECTORCALL 25
410
+ #define SPEC_FAIL_CALL_CLASS_MUTABLE 26
411
+ #define SPEC_FAIL_CALL_KWNAMES 27
412
+ #define SPEC_FAIL_CALL_METHOD_WRAPPER 28
413
+ #define SPEC_FAIL_CALL_OPERATOR_WRAPPER 29
412
414
413
415
/* COMPARE_OP */
414
416
#define SPEC_FAIL_COMPARE_OP_DIFFERENT_TYPES 12
@@ -1518,15 +1520,36 @@ builtin_call_fail_kind(int ml_flags)
1518
1520
return SPEC_FAIL_CALL_CFUNC_VARARGS ;
1519
1521
case METH_VARARGS | METH_KEYWORDS :
1520
1522
return SPEC_FAIL_CALL_CFUNC_VARARGS_KEYWORDS ;
1521
- case METH_FASTCALL | METH_KEYWORDS :
1522
- return SPEC_FAIL_CALL_CFUNC_FASTCALL_KEYWORDS ;
1523
1523
case METH_NOARGS :
1524
1524
return SPEC_FAIL_CALL_CFUNC_NOARGS ;
1525
1525
case METH_METHOD | METH_FASTCALL | METH_KEYWORDS :
1526
1526
return SPEC_FAIL_CALL_CFUNC_METHOD_FASTCALL_KEYWORDS ;
1527
1527
/* These cases should be optimized, but return "other" just in case */
1528
1528
case METH_O :
1529
1529
case METH_FASTCALL :
1530
+ case METH_FASTCALL | METH_KEYWORDS :
1531
+ return SPEC_FAIL_OTHER ;
1532
+ default :
1533
+ return SPEC_FAIL_CALL_BAD_CALL_FLAGS ;
1534
+ }
1535
+ }
1536
+
1537
+ static int
1538
+ meth_descr_call_fail_kind (int ml_flags )
1539
+ {
1540
+ switch (ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O |
1541
+ METH_KEYWORDS | METH_METHOD )) {
1542
+ case METH_VARARGS :
1543
+ return SPEC_FAIL_CALL_METH_DESCR_VARARGS ;
1544
+ case METH_VARARGS | METH_KEYWORDS :
1545
+ return SPEC_FAIL_CALL_METH_DESCR_VARARGS_KEYWORDS ;
1546
+ case METH_METHOD | METH_FASTCALL | METH_KEYWORDS :
1547
+ return SPEC_FAIL_CALL_METH_DESCR_METHOD_FASTCALL_KEYWORDS ;
1548
+ /* These cases should be optimized, but return "other" just in case */
1549
+ case METH_NOARGS :
1550
+ case METH_O :
1551
+ case METH_FASTCALL :
1552
+ case METH_FASTCALL | METH_KEYWORDS :
1530
1553
return SPEC_FAIL_OTHER ;
1531
1554
default :
1532
1555
return SPEC_FAIL_CALL_BAD_CALL_FLAGS ;
@@ -1575,12 +1598,12 @@ specialize_method_descriptor(PyMethodDescrObject *descr, _Py_CODEUNIT *instr,
1575
1598
_py_set_opcode (instr , CALL_NO_KW_METHOD_DESCRIPTOR_FAST );
1576
1599
return 0 ;
1577
1600
}
1578
- case METH_FASTCALL | METH_KEYWORDS : {
1601
+ case METH_FASTCALL | METH_KEYWORDS : {
1579
1602
_py_set_opcode (instr , CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS );
1580
1603
return 0 ;
1581
1604
}
1582
1605
}
1583
- SPECIALIZATION_FAIL (CALL , builtin_call_fail_kind (descr -> d_method -> ml_flags ));
1606
+ SPECIALIZATION_FAIL (CALL , meth_descr_call_fail_kind (descr -> d_method -> ml_flags ));
1584
1607
return -1 ;
1585
1608
}
1586
1609
0 commit comments