@@ -2969,6 +2969,21 @@ _PyDict_DelItemIf(PyObject *op, PyObject *key,
29692969 return res ;
29702970}
29712971
2972+ static void
2973+ clear_embedded_values (PyDictValues * values , Py_ssize_t nentries )
2974+ {
2975+ PyObject * refs [SHARED_KEYS_MAX_SIZE ];
2976+ assert (nentries <= SHARED_KEYS_MAX_SIZE );
2977+ for (Py_ssize_t i = 0 ; i < nentries ; i ++ ) {
2978+ refs [i ] = values -> values [i ];
2979+ values -> values [i ] = NULL ;
2980+ }
2981+ values -> size = 0 ;
2982+ for (Py_ssize_t i = 0 ; i < nentries ; i ++ ) {
2983+ Py_XDECREF (refs [i ]);
2984+ }
2985+ }
2986+
29722987static void
29732988clear_lock_held (PyObject * op )
29742989{
@@ -2997,20 +3012,18 @@ clear_lock_held(PyObject *op)
29973012 assert (oldkeys -> dk_refcnt == 1 );
29983013 dictkeys_decref (oldkeys , IS_DICT_SHARED (mp ));
29993014 }
3015+ else if (oldvalues -> embedded ) {
3016+ clear_embedded_values (oldvalues , oldkeys -> dk_nentries );
3017+ }
30003018 else {
3019+ set_values (mp , NULL );
3020+ set_keys (mp , Py_EMPTY_KEYS );
30013021 n = oldkeys -> dk_nentries ;
30023022 for (i = 0 ; i < n ; i ++ ) {
30033023 Py_CLEAR (oldvalues -> values [i ]);
30043024 }
3005- if (oldvalues -> embedded ) {
3006- oldvalues -> size = 0 ;
3007- }
3008- else {
3009- set_values (mp , NULL );
3010- set_keys (mp , Py_EMPTY_KEYS );
3011- free_values (oldvalues , IS_DICT_SHARED (mp ));
3012- dictkeys_decref (oldkeys , false);
3013- }
3025+ free_values (oldvalues , IS_DICT_SHARED (mp ));
3026+ dictkeys_decref (oldkeys , false);
30143027 }
30153028 ASSERT_CONSISTENT (mp );
30163029}
0 commit comments