@@ -548,6 +548,23 @@ initial_counter_value(void) {
548
548
#define SPEC_FAIL_NOT_FOLLOWED_BY_COND_JUMP 14
549
549
#define SPEC_FAIL_BIG_INT 15
550
550
551
+ /* FOR_ITER */
552
+ #define SPEC_FAIL_ITER_GENERATOR 10
553
+ #define SPEC_FAIL_ITER_COROUTINE 11
554
+ #define SPEC_FAIL_ITER_ASYNC_GENERATOR 12
555
+ #define SPEC_FAIL_ITER_LIST 13
556
+ #define SPEC_FAIL_ITER_TUPLE 14
557
+ #define SPEC_FAIL_ITER_SET 15
558
+ #define SPEC_FAIL_ITER_STRING 16
559
+ #define SPEC_FAIL_ITER_BYTES 17
560
+ #define SPEC_FAIL_ITER_RANGE 18
561
+ #define SPEC_FAIL_ITER_ITERTOOLS 19
562
+ #define SPEC_FAIL_ITER_DICT_KEYS 20
563
+ #define SPEC_FAIL_ITER_DICT_ITEMS 21
564
+ #define SPEC_FAIL_ITER_DICT_VALUES 22
565
+ #define SPEC_FAIL_ITER_ENUMERATE 23
566
+
567
+
551
568
static int
552
569
specialize_module_load_attr (
553
570
PyObject * owner , _Py_CODEUNIT * instr , PyObject * name ,
@@ -1817,3 +1834,54 @@ _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs,
1817
1834
STAT_INC (COMPARE_OP , success );
1818
1835
adaptive -> counter = initial_counter_value ();
1819
1836
}
1837
+
1838
+
1839
+ int
1840
+ _PySpecialization_ClassifyIterator (PyObject * iter )
1841
+ {
1842
+ if (PyGen_CheckExact (iter )) {
1843
+ return SPEC_FAIL_ITER_GENERATOR ;
1844
+ }
1845
+ if (PyCoro_CheckExact (iter )) {
1846
+ return SPEC_FAIL_ITER_COROUTINE ;
1847
+ }
1848
+ if (PyAsyncGen_CheckExact (iter )) {
1849
+ return SPEC_FAIL_ITER_ASYNC_GENERATOR ;
1850
+ }
1851
+ PyTypeObject * t = _Py_TYPE (iter );
1852
+ if (t == & PyListIter_Type ) {
1853
+ return SPEC_FAIL_ITER_LIST ;
1854
+ }
1855
+ if (t == & PyTupleIter_Type ) {
1856
+ return SPEC_FAIL_ITER_TUPLE ;
1857
+ }
1858
+ if (t == & PyDictIterKey_Type ) {
1859
+ return SPEC_FAIL_ITER_DICT_KEYS ;
1860
+ }
1861
+ if (t == & PyDictIterValue_Type ) {
1862
+ return SPEC_FAIL_ITER_DICT_VALUES ;
1863
+ }
1864
+ if (t == & PyDictIterItem_Type ) {
1865
+ return SPEC_FAIL_ITER_DICT_ITEMS ;
1866
+ }
1867
+ if (t == & PySetIter_Type ) {
1868
+ return SPEC_FAIL_ITER_SET ;
1869
+ }
1870
+ if (t == & PyUnicodeIter_Type ) {
1871
+ return SPEC_FAIL_ITER_STRING ;
1872
+ }
1873
+ if (t == & PyBytesIter_Type ) {
1874
+ return SPEC_FAIL_ITER_BYTES ;
1875
+ }
1876
+ if (t == & PyRangeIter_Type ) {
1877
+ return SPEC_FAIL_ITER_RANGE ;
1878
+ }
1879
+ if (t == & PyEnum_Type ) {
1880
+ return SPEC_FAIL_ITER_ENUMERATE ;
1881
+ }
1882
+
1883
+ if (strncmp (t -> tp_name , "itertools" , 8 ) == 0 ) {
1884
+ return SPEC_FAIL_ITER_ITERTOOLS ;
1885
+ }
1886
+ return SPEC_FAIL_OTHER ;
1887
+ }
0 commit comments