@@ -340,6 +340,9 @@ _PyCode_Quicken(PyCodeObject *code)
340
340
#define SPEC_FAIL_ATTR_PROPERTY_NOT_PY_FUNCTION 28
341
341
#define SPEC_FAIL_ATTR_NOT_IN_KEYS 29
342
342
#define SPEC_FAIL_ATTR_NOT_IN_DICT 30
343
+ #define SPEC_FAIL_ATTR_CLASS_ATTR_SIMPLE 31
344
+ #define SPEC_FAIL_ATTR_CLASS_ATTR_DESCRIPTOR 32
345
+ #define SPEC_FAIL_ATTR_BUILTIN_CLASS_METHOD_OBJ 33
343
346
344
347
/* Binary subscr and store subscr */
345
348
@@ -813,16 +816,29 @@ _Py_Specialize_LoadAttr(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name)
813
816
goto success ;
814
817
}
815
818
case BUILTIN_CLASSMETHOD :
819
+ SPECIALIZATION_FAIL (LOAD_ATTR , SPEC_FAIL_ATTR_BUILTIN_CLASS_METHOD_OBJ );
820
+ goto fail ;
816
821
case PYTHON_CLASSMETHOD :
822
+ SPECIALIZATION_FAIL (LOAD_ATTR , SPEC_FAIL_ATTR_CLASS_METHOD_OBJ );
823
+ goto fail ;
817
824
case NON_OVERRIDING :
825
+ SPECIALIZATION_FAIL (LOAD_ATTR ,
826
+ (type -> tp_flags & Py_TPFLAGS_MANAGED_DICT ) ?
827
+ SPEC_FAIL_ATTR_CLASS_ATTR_DESCRIPTOR :
828
+ SPEC_FAIL_ATTR_NOT_MANAGED_DICT );
829
+ goto fail ;
818
830
case NON_DESCRIPTOR :
831
+ SPECIALIZATION_FAIL (LOAD_ATTR ,
832
+ (type -> tp_flags & Py_TPFLAGS_MANAGED_DICT ) ?
833
+ SPEC_FAIL_ATTR_CLASS_ATTR_SIMPLE :
834
+ SPEC_FAIL_ATTR_NOT_MANAGED_DICT );
835
+ goto fail ;
819
836
case ABSENT :
820
- break ;
821
- }
822
- if (specialize_dict_access (owner , instr , type , kind , name , LOAD_ATTR ,
823
- LOAD_ATTR_INSTANCE_VALUE , LOAD_ATTR_WITH_HINT ))
824
- {
825
- goto success ;
837
+ if (specialize_dict_access (owner , instr , type , kind , name , LOAD_ATTR ,
838
+ LOAD_ATTR_INSTANCE_VALUE , LOAD_ATTR_WITH_HINT ))
839
+ {
840
+ goto success ;
841
+ }
826
842
}
827
843
fail :
828
844
STAT_INC (LOAD_ATTR , failure );
@@ -901,16 +917,23 @@ _Py_Specialize_StoreAttr(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name)
901
917
SPECIALIZATION_FAIL (STORE_ATTR , SPEC_FAIL_OVERRIDDEN );
902
918
goto fail ;
903
919
case BUILTIN_CLASSMETHOD :
920
+ SPECIALIZATION_FAIL (LOAD_ATTR , SPEC_FAIL_ATTR_BUILTIN_CLASS_METHOD_OBJ );
921
+ goto fail ;
904
922
case PYTHON_CLASSMETHOD :
923
+ SPECIALIZATION_FAIL (LOAD_ATTR , SPEC_FAIL_ATTR_CLASS_METHOD_OBJ );
924
+ goto fail ;
905
925
case NON_OVERRIDING :
926
+ SPECIALIZATION_FAIL (LOAD_ATTR , SPEC_FAIL_ATTR_CLASS_ATTR_DESCRIPTOR );
927
+ goto fail ;
906
928
case NON_DESCRIPTOR :
929
+ SPECIALIZATION_FAIL (LOAD_ATTR , SPEC_FAIL_ATTR_CLASS_ATTR_SIMPLE );
930
+ goto fail ;
907
931
case ABSENT :
908
- break ;
909
- }
910
- if (specialize_dict_access (owner , instr , type , kind , name , STORE_ATTR ,
911
- STORE_ATTR_INSTANCE_VALUE , STORE_ATTR_WITH_HINT ))
912
- {
913
- goto success ;
932
+ if (specialize_dict_access (owner , instr , type , kind , name , STORE_ATTR ,
933
+ STORE_ATTR_INSTANCE_VALUE , STORE_ATTR_WITH_HINT ))
934
+ {
935
+ goto success ;
936
+ }
914
937
}
915
938
fail :
916
939
STAT_INC (STORE_ATTR , failure );
0 commit comments