@@ -2878,6 +2878,21 @@ _PyDict_DelItemIf(PyObject *op, PyObject *key,
28782878 return res ;
28792879}
28802880
2881+ static void
2882+ clear_embedded_values (PyDictValues * values , Py_ssize_t nentries )
2883+ {
2884+ PyObject * refs [SHARED_KEYS_MAX_SIZE ];
2885+ assert (nentries <= SHARED_KEYS_MAX_SIZE );
2886+ for (Py_ssize_t i = 0 ; i < nentries ; i ++ ) {
2887+ refs [i ] = values -> values [i ];
2888+ values -> values [i ] = NULL ;
2889+ }
2890+ values -> size = 0 ;
2891+ for (Py_ssize_t i = 0 ; i < nentries ; i ++ ) {
2892+ Py_XDECREF (refs [i ]);
2893+ }
2894+ }
2895+
28812896static void
28822897clear_lock_held (PyObject * op )
28832898{
@@ -2907,20 +2922,18 @@ clear_lock_held(PyObject *op)
29072922 assert (oldkeys -> dk_refcnt == 1 );
29082923 dictkeys_decref (interp , oldkeys , IS_DICT_SHARED (mp ));
29092924 }
2925+ else if (oldvalues -> embedded ) {
2926+ clear_embedded_values (oldvalues , oldkeys -> dk_nentries );
2927+ }
29102928 else {
2929+ set_values (mp , NULL );
2930+ set_keys (mp , Py_EMPTY_KEYS );
29112931 n = oldkeys -> dk_nentries ;
29122932 for (i = 0 ; i < n ; i ++ ) {
29132933 Py_CLEAR (oldvalues -> values [i ]);
29142934 }
2915- if (oldvalues -> embedded ) {
2916- oldvalues -> size = 0 ;
2917- }
2918- else {
2919- set_values (mp , NULL );
2920- set_keys (mp , Py_EMPTY_KEYS );
2921- free_values (oldvalues , IS_DICT_SHARED (mp ));
2922- dictkeys_decref (interp , oldkeys , false);
2923- }
2935+ free_values (oldvalues , IS_DICT_SHARED (mp ));
2936+ dictkeys_decref (interp , oldkeys , false);
29242937 }
29252938 ASSERT_CONSISTENT (mp );
29262939}
0 commit comments