@@ -7056,11 +7056,12 @@ set_dict_inline_values(PyObject *obj, PyDictObject *new_dict)
7056
7056
}
7057
7057
}
7058
7058
7059
- void
7059
+ int
7060
7060
_PyObject_SetManagedDict (PyObject *
10000
obj , PyObject * new_dict )
7061
7061
{
7062
7062
assert (Py_TYPE (obj )-> tp_flags & Py_TPFLAGS_MANAGED_DICT );
7063
7063
assert (_PyObject_InlineValuesConsistencyCheck (obj ));
7064
+ int err = 0 ;
7064
7065
PyTypeObject * tp = Py_TYPE (obj );
7065
7066
if (tp -> tp_flags & Py_TPFLAGS_INLINE_VALUES ) {
7066
7067
PyDictObject * dict = _PyObject_GetManagedDict (obj );
@@ -7076,11 +7077,11 @@ _PyObject_SetManagedDict(PyObject *obj, PyObject *new_dict)
7076
7077
Py_END_CRITICAL_SECTION ();
7077
7078
7078
7079
if (dict == NULL ) {
7079
- return ;
7080
+ return 0 ;
7080
7081
}
7081
7082
#else
7082
7083
set_dict_inline_values (obj , (PyDictObject * )new_dict );
7083
- return ;
7084
+ return 0 ;
7084
7085
#endif
7085
7086
}
7086
7087
@@ -7089,15 +7090,16 @@ _PyObject_SetManagedDict(PyObject *obj, PyObject *new_dict)
7089
7090
// We've locked dict, but the actual dict could have changed
7090
7091
// since we locked it.
7091
7092
dict = _PyObject_ManagedDictPointer (obj )-> dict ;
7092
-
7093
- FT_ATOMIC_STORE_PTR (_PyObject_ManagedDictPointer (obj )-> dict ,
7094
- (PyDictObject * )Py_XNewRef (new_dict ));
7095
-
7096
- _PyDict_DetachFromObject (dict , obj );
7097
-
7093
+ err = _PyDict_DetachFromObject (dict , obj );
7094
+ if (err == 0 ) {
7095
+ FT_ATOMIC_STORE_PTR (_PyObject_ManagedDictPointer (obj )-> dict ,
7096
+ (PyDictObject * )Py_XNewRef (new_dict ));
7097
+ }
7098
7098
Py_END_CRITICAL_SECTION2 ();
7099
7099
7100
- Py_XDECREF (dict );
7100
+ if (err == 0 ) {
7101
+ Py_XDECREF (dict );
7102
+ }
7101
7103
}
7102
7104
else {
7103
7105
PyDictObject * dict ;
@@ -7114,18 +7116,23 @@ _PyObject_SetManagedDict(PyObject *obj, PyObject *new_dict)
7114
7116
Py_XDECREF (dict );
7115
7117
}
7116
7118
assert (_PyObject_InlineValuesConsistencyCheck (obj ));
7119
+ return err ;
7117
7120
}
7118
7121
7119
7122
void
7120
7123
PyObject_ClearManagedDict (PyObject * obj )
7121
7124
{
7122
- _PyObject_SetManagedDict (obj , NULL );
7125
+ if (_PyObject_SetManagedDict (obj , NULL ) < 0 ) {
7126
+ PyErr_WriteUnraisable (NULL );
7127
+ }
7123
7128
}
7124
7129
7125
7130
int
7126
7131
_PyDict_DetachFromObject (PyDictObject * mp , PyObject * obj )
7127
7132
{
7128
7133
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (obj );
7134
+ assert (_PyObject_ManagedDictPointer (obj )-> dict == mp );
7135
+ assert (_PyObject_InlineValuesConsistencyCheck (obj ));
7129
7136
7130
7137
if (FT_ATOMIC_LOAD_PTR_RELAXED (mp -> ma_values ) != _PyObject_InlineValues (obj )) {
7131
7138
return 0 ;
0 commit comments