@@ -2802,6 +2802,21 @@ _PyDict_DelItemIf(PyObject *op, PyObject *key,
28022802 return res ;
28032803}
28042804
2805+ static void
2806+ clear_embedded_values (PyDictValues * values , Py_ssize_t nentries )
2807+ {
2808+ PyObject * refs [SHARED_KEYS_MAX_SIZE ];
2809+ assert (nentries <= SHARED_KEYS_MAX_SIZE );
2810+ for (Py_ssize_t i = 0 ; i < nentries ; i ++ ) {
2811+ refs [i ] = values -> values [i ];
2812+ values -> values [i ] = NULL ;
2813+ }
2814+ values -> size = 0 ;
2815+ for (Py_ssize_t i = 0 ; i < nentries ; i ++ ) {
2816+ Py_XDECREF (refs [i ]);
2817+ }
2818+ }
2819+
28052820static void
28062821clear_lock_held (PyObject * op )
28072822{
@@ -2833,20 +2848,18 @@ clear_lock_held(PyObject *op)
28332848 assert (oldkeys -> dk_refcnt == 1 );
28342849 dictkeys_decref (interp , oldkeys , IS_DICT_SHARED (mp ));
28352850 }
2851+ else if (oldvalues -> embedded ) {
2852+ clear_embedded_values (oldvalues , oldkeys -> dk_nentries );
2853+ }
28362854 else {
2855+ set_values (mp , NULL );
2856+ set_keys (mp , Py_EMPTY_KEYS );
28372857 n = oldkeys -> dk_nentries ;
28382858 for (i = 0 ; i < n ; i ++ ) {
28392859 Py_CLEAR (oldvalues -> values [i ]);
28402860 }
2841- if (oldvalues -> embedded ) {
2842- oldvalues -> size = 0 ;
2843- }
2844- else {
2845- set_values (mp , NULL );
2846- set_keys (mp , Py_EMPTY_KEYS );
2847- free_values (oldvalues , IS_DICT_SHARED (mp ));
2848- dictkeys_decref (interp , oldkeys , false);
2849- }
2861+ free_values (oldvalues , IS_DICT_SHARED (mp ));
2862+ dictkeys_decref (interp , oldkeys , false);
28502863 }
28512864 ASSERT_CONSISTENT (mp );
28522865}
0 commit comments