@@ -819,6 +819,7 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
819
819
_PyObjectCache * cache2 = & cache [-2 ].obj ;
820
820
821
821
PyTypeObject * owner_cls = Py_TYPE (owner );
822
+ PyDictObject * owner_dict = NULL ;
822
823
if (PyModule_CheckExact (owner )) {
823
824
int err = specialize_module_load_attr (owner , instr , name , cache0 , cache1 ,
824
825
LOAD_METHOD , LOAD_METHOD_MODULE );
@@ -846,11 +847,18 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
846
847
}
847
848
PyObject * * owner_dictptr = _PyObject_GetDictPtr (owner );
848
849
int owner_has_dict = (owner_dictptr != NULL && * owner_dictptr != NULL );
849
- PyDictObject * owner_dict = owner_has_dict ? (PyDictObject * )* owner_dictptr : NULL ;
850
+ owner_dict = owner_has_dict ? (PyDictObject * )* owner_dictptr : NULL ;
851
+ Py_XINCREF (owner_dict ); // make sure dict doesn't disappear halfway
850
852
// Check for classmethods.
851
853
int owner_is_class = PyType_Check (owner );
852
854
owner_cls = owner_is_class ? (PyTypeObject * )owner : owner_cls ;
853
855
856
+ if ((owner_cls -> tp_flags & Py_TPFLAGS_VALID_VERSION_TAG ) == 0 ||
857
+ owner_cls -> tp_version_tag == 0 ) {
858
+ SPECIALIZATION_FAIL (LOAD_METHOD , SPEC_FAIL_OUT_OF_VERSIONS );
859
+ goto fail ;
860
+ }
861
+
854
862
PyObject * descr = NULL ;
855
863
DesciptorClassification kind = 0 ;
856
864
kind = analyze_descriptor (owner_cls , name , & descr , 0 );
@@ -928,11 +936,13 @@ _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name,
928
936
LOAD_METHOD_CACHED , _Py_OPARG (* instr ));
929
937
// Fall through.
930
938
success :
939
+ Py_XDECREF (owner_dict );
931
940
STAT_INC (LOAD_METHOD , specialization_success );
932
941
assert (!PyErr_Occurred ());
933
942
cache0 -> counter = saturating_start ();
934
943
return 0 ;
935
944
fail :
945
+ Py_XDECREF (owner_dict );
936
946
STAT_INC (LOAD_METHOD , specialization_failure );
937
947
assert (!PyErr_Occurred ());
938
948
cache_backoff (cache0 );
0 commit comments