@@ -2508,7 +2508,7 @@ delete_index_from_values(PyDictValues *values, Py_ssize_t ix)
25082508 values -> size = size ;
25092509}
25102510
2511- static int
2511+ static void
25122512delitem_common (PyDictObject * mp , Py_hash_t hash , Py_ssize_t ix ,
25132513 PyObject * old_value , uint64_t new_version )
25142514{
@@ -2550,7 +2550,6 @@ delitem_common(PyDictObject *mp, Py_hash_t hash, Py_ssize_t ix,
25502550 Py_DECREF (old_value );
25512551
25522552 ASSERT_CONSISTENT (mp );
2553- return 0 ;
25542553}
25552554
25562555int
@@ -2593,7 +2592,8 @@ delitem_knownhash_lock_held(PyObject *op, PyObject *key, Py_hash_t hash)
25932592 PyInterpreterState * interp = _PyInterpreterState_GET ();
25942593 uint64_t new_version = _PyDict_NotifyEvent (
25952594 interp , PyDict_EVENT_DELETED , mp , key , NULL );
2596- return delitem_common (mp , hash , ix , old_value , new_version );
2595+ delitem_common (mp , hash , ix , old_value , new_version );
2596+ return 0 ;
25972597}
25982598
25992599int
@@ -2608,7 +2608,8 @@ _PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
26082608
26092609static int
26102610delitemif_lock_held (PyObject * op , PyObject * key ,
2611- int (* predicate )(PyObject * value ))
2611+ int (* predicate )(PyObject * value , void * arg ),
2612+ void * arg )
26122613{
26132614 Py_ssize_t ix ;
26142615 PyDictObject * mp ;
@@ -2618,32 +2619,29 @@ delitemif_lock_held(PyObject *op, PyObject *key,
26182619
26192620 ASSERT_DICT_LOCKED (op );
26202621
2621- if (!PyDict_Check (op )) {
2622- PyErr_BadInternalCall ();
2623- return -1 ;
2624- }
26252622 assert (key );
26262623 hash = PyObject_Hash (key );
26272624 if (hash == -1 )
26282625 return -1 ;
26292626 mp = (PyDictObject * )op ;
26302627 ix = _Py_dict_lookup (mp , key , hash , & old_value );
2631- if (ix == DKIX_ERROR )
2628+ if (ix == DKIX_ERROR ) {
26322629 return -1 ;
2630+ }
26332631 if (ix == DKIX_EMPTY || old_value == NULL ) {
2634- _PyErr_SetKeyError (key );
2635- return -1 ;
2632+ return 0 ;
26362633 }
26372634
2638- res = predicate (old_value );
2635+ res = predicate (old_value , arg );
26392636 if (res == -1 )
26402637 return -1 ;
26412638
26422639 if (res > 0 ) {
26432640 PyInterpreterState * interp = _PyInterpreterState_GET ();
26442641 uint64_t new_version = _PyDict_NotifyEvent (
26452642 interp , PyDict_EVENT_DELETED , mp , key , NULL );
2646- return delitem_common (mp , hash , ix , old_value , new_version );
2643+ delitem_common (mp , hash , ix , old_value , new_version );
2644+ return 1 ;
26472645 } else {
26482646 return 0 ;
26492647 }
@@ -2655,11 +2653,13 @@ delitemif_lock_held(PyObject *op, PyObject *key,
26552653 */
26562654int
26572655_PyDict_DelItemIf (PyObject * op , PyObject * key ,
2658- int (* predicate )(PyObject * value ))
2656+ int (* predicate )(PyObject * value , void * arg ),
2657+ void * arg )
26592658{
2659+ assert (PyDict_Check (op ));
26602660 int res ;
26612661 Py_BEGIN_CRITICAL_SECTION (op );
2662- res = delitemif_lock_held (op , key , predicate );
2662+ res = delitemif_lock_held (op , key , predicate , arg );
26632663 Py_END_CRITICAL_SECTION ();
26642664 return res ;
26652665}
0 commit comments