@@ -309,26 +309,27 @@ _PyCode_Quicken(PyCodeObject *code)
309
309
#define SPEC_FAIL_OUT_OF_RANGE 4
310
310
#define SPEC_FAIL_EXPECTED_ERROR 5
311
311
#define SPEC_FAIL_WRONG_NUMBER_ARGUMENTS 6
312
- #define SPEC_FAIL_NOT_PY_FUNCTION 7
312
+ #define SPEC_FAIL_CODE_COMPLEX_PARAMETERS 7
313
+ #define SPEC_FAIL_CODE_NOT_OPTIMIZED 8
313
314
314
315
315
316
#define SPEC_FAIL_LOAD_GLOBAL_NON_DICT 17
316
317
#define SPEC_FAIL_LOAD_GLOBAL_NON_STRING_OR_SPLIT 18
317
318
318
319
/* Attributes */
319
320
320
- #define SPEC_FAIL_ATTR_OVERRIDING_DESCRIPTOR 8
321
- #define SPEC_FAIL_ATTR_NON_OVERRIDING_DESCRIPTOR 9
322
- #define SPEC_FAIL_ATTR_NOT_DESCRIPTOR 10
323
- #define SPEC_FAIL_ATTR_METHOD 11
324
- #define SPEC_FAIL_ATTR_MUTABLE_CLASS 12
325
- #define SPEC_FAIL_ATTR_PROPERTY 13
326
- #define SPEC_FAIL_ATTR_NON_OBJECT_SLOT 14
327
- #define SPEC_FAIL_ATTR_READ_ONLY 15
328
- #define SPEC_FAIL_ATTR_AUDITED_SLOT 16
329
- #define SPEC_FAIL_ATTR_NOT_MANAGED_DICT 17
330
- #define SPEC_FAIL_ATTR_NON_STRING_OR_SPLIT 18
331
- #define SPEC_FAIL_ATTR_MODULE_ATTR_NOT_FOUND 19
321
+ #define SPEC_FAIL_ATTR_OVERRIDING_DESCRIPTOR 9
322
+ #define SPEC_FAIL_ATTR_NON_OVERRIDING_DESCRIPTOR 10
323
+ #define SPEC_FAIL_ATTR_NOT_DESCRIPTOR 11
324
+ #define SPEC_FAIL_ATTR_METHOD 12
325
+ #define SPEC_FAIL_ATTR_MUTABLE_CLASS 13
326
+ #define SPEC_FAIL_ATTR_PROPERTY 14
327
+ #define SPEC_FAIL_ATTR_NON_OBJECT_SLOT 15
328
+ #define SPEC_FAIL_ATTR_READ_ONLY 16
329
+ #define SPEC_FAIL_ATTR_AUDITED_SLOT 17
330
+ #define SPEC_FAIL_ATTR_NOT_MANAGED_DICT 18
331
+ #define SPEC_FAIL_ATTR_NON_STRING_OR_SPLIT 19
332
+ #define SPEC_FAIL_ATTR_MODULE_ATTR_NOT_FOUND 20
332
333
333
334
#define SPEC_FAIL_ATTR_SHADOWED 21
334
335
#define SPEC_FAIL_ATTR_BUILTIN_CLASS_METHOD 22
@@ -346,12 +347,12 @@ _PyCode_Quicken(PyCodeObject *code)
346
347
347
348
/* Binary subscr and store subscr */
348
349
349
- #define SPEC_FAIL_SUBSCR_ARRAY_INT 8
350
- #define SPEC_FAIL_SUBSCR_ARRAY_SLICE 9
351
- #define SPEC_FAIL_SUBSCR_LIST_SLICE 10
352
- #define SPEC_FAIL_SUBSCR_TUPLE_SLICE 11
353
- #define SPEC_FAIL_SUBSCR_STRING_INT 12
354
- #define SPEC_FAIL_SUBSCR_STRING_SLICE 13
350
+ #define SPEC_FAIL_SUBSCR_ARRAY_INT 9
351
+ #define SPEC_FAIL_SUBSCR_ARRAY_SLICE 10
352
+ #define SPEC_FAIL_SUBSCR_LIST_SLICE 11
353
+ #define SPEC_FAIL_SUBSCR_TUPLE_SLICE 12
354
+ #define SPEC_FAIL_SUBSCR_STRING_INT 13
355
+ #define SPEC_FAIL_SUBSCR_STRING_SLICE 14
355
356
#define SPEC_FAIL_SUBSCR_BUFFER_INT 15
356
357
#define SPEC_FAIL_SUBSCR_BUFFER_SLICE 16
357
358
#define SPEC_FAIL_SUBSCR_SEQUENCE_INT 17
@@ -366,49 +367,48 @@ _PyCode_Quicken(PyCodeObject *code)
366
367
367
368
/* Binary op */
368
369
369
- #define SPEC_FAIL_BINARY_OP_ADD_DIFFERENT_TYPES 8
370
- #define SPEC_FAIL_BINARY_OP_ADD_OTHER 9
371
- #define SPEC_FAIL_BINARY_OP_AND_DIFFERENT_TYPES 10
372
- #define SPEC_FAIL_BINARY_OP_AND_INT 11
373
- #define SPEC_FAIL_BINARY_OP_AND_OTHER 12
374
- #define SPEC_FAIL_BINARY_OP_FLOOR_DIVIDE 13
375
- #define SPEC_FAIL_BINARY_OP_LSHIFT 14
376
- #define SPEC_FAIL_BINARY_OP_MATRIX_MULTIPLY 15
377
- #define SPEC_FAIL_BINARY_OP_MULTIPLY_DIFFERENT_TYPES 16
378
- #define SPEC_FAIL_BINARY_OP_MULTIPLY_OTHER 17
379
- #define SPEC_FAIL_BINARY_OP_OR 18
380
- #define SPEC_FAIL_BINARY_OP_POWER 19
381
- #define SPEC_FAIL_BINARY_OP_REMAINDER 20
382
- #define SPEC_FAIL_BINARY_OP_RSHIFT 21
383
- #define SPEC_FAIL_BINARY_OP_SUBTRACT_DIFFERENT_TYPES 22
384
- #define SPEC_FAIL_BINARY_OP_SUBTRACT_OTHER 23
385
- #define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_DIFFERENT_TYPES 24
386
- #define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_FLOAT 25
387
- #define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_OTHER 26
388
- #define SPEC_FAIL_BINARY_OP_XOR 27
370
+ #define SPEC_FAIL_BINARY_OP_ADD_DIFFERENT_TYPES 9
371
+ #define SPEC_FAIL_BINARY_OP_ADD_OTHER 10
372
+ #define SPEC_FAIL_BINARY_OP_AND_DIFFERENT_TYPES 11
373
+ #define SPEC_FAIL_BINARY_OP_AND_INT 12
374
+ #define SPEC_FAIL_BINARY_OP_AND_OTHER 13
375
+ #define SPEC_FAIL_BINARY_OP_FLOOR_DIVIDE 14
376
+ #define SPEC_FAIL_BINARY_OP_LSHIFT 15
377
+ #define SPEC_FAIL_BINARY_OP_MATRIX_MULTIPLY 16
378
+ #define SPEC_FAIL_BINARY_OP_MULTIPLY_DIFFERENT_TYPES 17
379
+ #define SPEC_FAIL_BINARY_OP_MULTIPLY_OTHER 18
380
+ #define SPEC_FAIL_BINARY_OP_OR 19
381
+ #define SPEC_FAIL_BINARY_OP_POWER 20
382
+ #define SPEC_FAIL_BINARY_OP_REMAINDER 21
383
+ #define SPEC_FAIL_BINARY_OP_RSHIFT 22
384
+ #define SPEC_FAIL_BINARY_OP_SUBTRACT_DIFFERENT_TYPES 23
385
+ #define SPEC_FAIL_BINARY_OP_SUBTRACT_OTHER 24
386
+ #define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_DIFFERENT_TYPES 25
387
+ #define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_FLOAT 26
388
+ #define SPEC_FAIL_BINARY_OP_TRUE_DIVIDE_OTHER 27
389
+ #define SPEC_FAIL_BINARY_OP_XOR 28
389
390
390
391
/* Calls */
391
- #define SPEC_FAIL_CALL_COMPLEX_PARAMETERS 9
392
- #define SPEC_FAIL_CALL_CO_NOT_OPTIMIZED 10
393
- /* SPEC_FAIL_METHOD defined as 11 above */
394
392
395
393
#define SPEC_FAIL_CALL_INSTANCE_METHOD 11
396
394
#define SPEC_FAIL_CALL_CMETHOD 12
397
395
#define SPEC_FAIL_CALL_CFUNC_VARARGS 13
398
396
#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
397
+ #define SPEC_FAIL_CALL_CFUNC_NOARGS 15
398
+ #define SPEC_FAIL_CALL_CFUNC_METHOD_FASTCALL_KEYWORDS 16
399
+ #define SPEC_FAIL_CALL_METH_DESCR_VARARGS 17
400
+ #define SPEC_FAIL_CALL_METH_DESCR_VARARGS_KEYWORDS 18
401
+ #define SPEC_FAIL_CALL_METH_DESCR_METHOD_FASTCALL_KEYWORDS 19
402
+ #define SPEC_FAIL_CALL_BAD_CALL_FLAGS 20
403
+ #define SPEC_FAIL_CALL_PYTHON_CLASS 21
404
+ #define SPEC_FAIL_CALL_PEP_523 22
405
+ #define SPEC_FAIL_CALL_BOUND_METHOD 23
406
+ #define SPEC_FAIL_CALL_STR 24
407
+ #define SPEC_FAIL_CALL_CLASS_NO_VECTORCALL 25
408
+ #define SPEC_FAIL_CALL_CLASS_MUTABLE 26
409
+ #define SPEC_FAIL_CALL_KWNAMES 27
410
+ #define SPEC_FAIL_CALL_METHOD_WRAPPER 28
411
+ #define SPEC_FAIL_CALL_OPERATOR_WRAPPER 29
412
412
413
413
/* COMPARE_OP */
414
414
#define SPEC_FAIL_COMPARE_OP_DIFFERENT_TYPES 12
@@ -449,8 +449,8 @@ _PyCode_Quicken(PyCodeObject *code)
449
449
450
450
// UNPACK_SEQUENCE
451
451
452
- #define SPEC_FAIL_UNPACK_SEQUENCE_ITERATOR 8
453
- #define SPEC_FAIL_UNPACK_SEQUENCE_SEQUENCE 9
452
+ #define SPEC_FAIL_UNPACK_SEQUENCE_ITERATOR 9
453
+ #define SPEC_FAIL_UNPACK_SEQUENCE_SEQUENCE 10
454
454
455
455
static int function_kind (PyCodeObject * code );
456
456
static bool function_check_args (PyObject * o , int expected_argcount , int opcode );
@@ -1251,10 +1251,10 @@ static int
1251
1251
function_kind (PyCodeObject * code ) {
1252
1252
int flags = code -> co_flags ;
1253
1253
if ((flags & (CO_VARKEYWORDS | CO_VARARGS )) || code -> co_kwonlyargcount ) {
1254
- return SPEC_FAIL_CALL_COMPLEX_PARAMETERS ;
1254
+ return SPEC_FAIL_CODE_COMPLEX_PARAMETERS ;
1255
1255
}
1256
1256
if ((flags & CO_OPTIMIZED ) == 0 ) {
1257
- return SPEC_FAIL_CALL_CO_NOT_OPTIMIZED ;
1257
+ return SPEC_FAIL_CODE_NOT_OPTIMIZED ;
1258
1258
}
1259
1259
return SIMPLE_FUNCTION ;
1260
1260
}
@@ -1526,15 +1526,36 @@ builtin_call_fail_kind(int ml_flags)
1526
1526
return SPEC_FAIL_CALL_CFUNC_VARARGS ;
1527
1527
case METH_VARARGS | METH_KEYWORDS :
1528
1528
return SPEC_FAIL_CALL_CFUNC_VARARGS_KEYWORDS ;
1529
- case METH_FASTCALL | METH_KEYWORDS :
1530
- return SPEC_FAIL_CALL_CFUNC_FASTCALL_KEYWORDS ;
1531
1529
case METH_NOARGS :
1532
1530
return SPEC_FAIL_CALL_CFUNC_NOARGS ;
1533
1531
case METH_METHOD | METH_FASTCALL | METH_KEYWORDS :
1534
1532
return SPEC_FAIL_CALL_CFUNC_METHOD_FASTCALL_KEYWORDS ;
1535
1533
/* These cases should be optimized, but return "other" just in case */
1536
1534
case METH_O :
1537
1535
case METH_FASTCALL :
1536
+ case METH_FASTCALL | METH_KEYWORDS :
1537
+ return SPEC_FAIL_OTHER ;
1538
+ default :
1539
+ return SPEC_FAIL_CALL_BAD_CALL_FLAGS ;
1540
+ }
1541
+ }
1542
+
1543
+ static int
1544
+ meth_descr_call_fail_kind (int ml_flags )
1545
+ {
1546
+ switch (ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O |
1547
+ METH_KEYWORDS | METH_METHOD )) {
1548
+ case METH_VARARGS :
1549
+ return SPEC_FAIL_CALL_METH_DESCR_VARARGS ;
1550
+ case METH_VARARGS | METH_KEYWORDS :
1551
+ return SPEC_FAIL_CALL_METH_DESCR_VARARGS_KEYWORDS ;
1552
+ case METH_METHOD | METH_FASTCALL | METH_KEYWORDS :
1553
+ return SPEC_FAIL_CALL_METH_DESCR_METHOD_FASTCALL_KEYWORDS ;
1554
+ /* These cases should be optimized, but return "other" just in case */
1555
+ case METH_NOARGS :
1556
+ case METH_O :
1557
+ case METH_FASTCALL :
1558
+ case METH_FASTCALL | METH_KEYWORDS :
1538
1559
return SPEC_FAIL_OTHER ;
1539
1560
default :
1540
1561
return SPEC_FAIL_CALL_BAD_CALL_FLAGS ;
@@ -1583,12 +1604,12 @@ specialize_method_descriptor(PyMethodDescrObject *descr, _Py_CODEUNIT *instr,
1583
1604
_py_set_opcode (instr , CALL_NO_KW_METHOD_DESCRIPTOR_FAST );
1584
1605
return 0 ;
1585
1606
}
1586
- case METH_FASTCALL | METH_KEYWORDS : {
1607
+ case METH_FASTCALL | METH_KEYWORDS : {
1587
1608
_py_set_opcode (instr , CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS );
1588
1609
return 0 ;
1589
1610
}
1590
1611
}
1591
- SPECIALIZATION_FAIL (CALL , builtin_call_fail_kind (descr -> d_method -> ml_flags ));
1612
+ SPECIALIZATION_FAIL (CALL , meth_descr_call_fail_kind (descr -> d_method -> ml_flags ));
1592
1613
return -1 ;
1593
1614
}
1594
1615
0 commit comments