@@ -2216,6 +2216,29 @@ _PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash)
22162216 return value ; // borrowed reference
22172217}
22182218
2219+ /* Gets an item and provides a new reference if the value is present.
2220+ * Returns 1 if the key is present, 0 if the key is missing, and -1 if an
2221+ * exception occurred.
2222+ */
2223+ int
2224+ _PyDict_GetItemRef_KnownHash_LockHeld (PyDictObject * op , PyObject * key ,
2225+ Py_hash_t hash , PyObject * * result )
2226+ {
2227+ PyObject * value ;
2228+ Py_ssize_t ix = _Py_dict_lookup (op , key , hash , & value );
2229+ assert (ix >= 0 || value == NULL );
2230+ if (ix == DKIX_ERROR ) {
2231+ * result = NULL ;
2232+ return -1 ;
2233+ }
2234+ if (value == NULL ) {
2235+ * result = NULL ;
2236+ return 0 ; // missing key
2237+ }
2238+ * result = Py_NewRef (value );
2239+ return 1 ; // key is present
2240+ }
2241+
22192242/* Gets an item and provides a new reference if the value is present.
22202243 * Returns 1 if the key is present, 0 if the key is missing, and -1 if an
22212244 * exception occurred.
@@ -2460,33 +2483,32 @@ setitem_lock_held(PyDictObject *mp, PyObject *key, PyObject *value)
24602483
24612484
24622485int
2463- _PyDict_SetItem_KnownHash ( PyObject * op , PyObject * key , PyObject * value ,
2464- Py_hash_t hash )
2486+ _PyDict_SetItem_KnownHash_LockHeld ( PyDictObject * mp , PyObject * key , PyObject * value ,
2487+ Py_hash_t hash )
24652488{
2466- PyDictObject * mp ;
2489+ PyInterpreterState * interp = _PyInterpreterState_GET ();
2490+ if (mp -> ma_keys == Py_EMPTY_KEYS ) {
2491+ return insert_to_emptydict (interp , mp , Py_NewRef (key ), hash , Py_NewRef (value ));
2492+ }
2493+ /* insertdict() handles any resizing that might be necessary */
2494+ return insertdict (interp , mp , Py_NewRef (key ), hash , Py_NewRef (value ));
2495+ }
24672496
2497+ int
2498+ _PyDict_SetItem_KnownHash (PyObject * op , PyObject * key , PyObject * value ,
2499+ Py_hash_t hash )
2500+ {
24682501 if (!PyDict_Check (op )) {
24692502 PyErr_BadInternalCall ();
24702503 return -1 ;
24712504 }
24722505 assert (key );
24732506 assert (value );
24742507 assert (hash != -1 );
2475- mp = (PyDictObject * )op ;
24762508
24772509 int res ;
2478- PyInterpreterState * interp = _PyInterpreterState_GET ();
2479-
2480- Py_BEGIN_CRITICAL_SECTION (mp );
2481-
2482- if (mp -> ma_keys == Py_EMPTY_KEYS ) {
2483- res = insert_to_emptydict (interp , mp , Py_NewRef (key ), hash , Py_NewRef (value ));
2484- }
2485- else {
2486- /* insertdict() handles any resizing that might be necessary */
2487- res = insertdict (interp , mp , Py_NewRef (key ), hash , Py_NewRef (value ));
2488- }
2489-
2510+ Py_BEGIN_CRITICAL_SECTION (op );
2511+ res = _PyDict_SetItem_KnownHash_LockHeld ((PyDictObject * )op , key , value , hash );
24902512 Py_END_CRITICAL_SECTION ();
24912513 return res ;
24922514}
0 commit comments