Skip to content
Closed
Prev Previous commit
Next Next commit
fix for free-threading
  • Loading branch information
corona10 committed Feb 17, 2026
commit b4a06fd34899027a24a853884ea008c0b73c3d7d
3 changes: 2 additions & 1 deletion Include/internal/pycore_dict.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ extern void _PyDictKeys_DecRef(PyDictKeysObject *keys);
* -1 when no entry found, -3 when compare raises error.
*/
extern Py_ssize_t _Py_dict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr);
extern Py_ssize_t _Py_frozendict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr);
extern Py_ssize_t _Py_dict_lookup_threadsafe(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr);
extern Py_ssize_t _Py_dict_lookup_threadsafe_stackref(PyDictObject *mp, PyObject *key, Py_hash_t hash, _PyStackRef *value_addr);

Expand Down Expand Up @@ -148,7 +149,7 @@ extern int _PyDict_GetItemRef_KnownHash(PyDictObject *op, PyObject *key, Py_hash
extern int _PyDict_GetItemRef_Unicode_LockHeld(PyDictObject *op, PyObject *key, PyObject **result);
PyAPI_FUNC(int) _PyObjectDict_SetItem(PyTypeObject *tp, PyObject *obj, PyObject **dictptr, PyObject *name, PyObject *value);

PyAPI_FUNC(int) _PyFrozenDict_GetItemRef(PyObject *op, PyObject *key, PyObject **result);
extern int _PyFrozenDict_GetItemRef(PyObject *op, PyObject *key, PyObject **result);

extern int _PyDict_Pop_KnownHash(
PyDictObject *dict,
Expand Down
22 changes: 17 additions & 5 deletions Objects/dictobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -1249,14 +1249,13 @@ _Py_dict_lookup() is general-purpose, and may return DKIX_ERROR if (and only if)
comparison raises an exception.
When the key isn't found a DKIX_EMPTY is returned.
*/
Py_ssize_t
_Py_dict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr)
static inline Py_ssize_t
dict_lookup_impl(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr)
{
PyDictKeysObject *dk;
DictKeysKind kind;
Py_ssize_t ix;

_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(mp);
start:
dk = mp->ma_keys;
kind = dk->dk_kind;
Expand Down Expand Up @@ -1315,6 +1314,19 @@ _Py_dict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **valu
return ix;
}

Py_ssize_t
_Py_dict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr)
{
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(mp);
return dict_lookup_impl(mp, key, hash, value_addr);
}

Py_ssize_t
_Py_frozendict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr)
{
return dict_lookup_impl(mp, key, hash, value_addr);
}

#ifdef Py_GIL_DISABLED
static inline void
ensure_shared_on_read(PyDictObject *mp)
Expand Down Expand Up @@ -2492,11 +2504,11 @@ PyDict_GetItemRef(PyObject *op, PyObject *key, PyObject **result)
* Returns 1 if the key is present, 0 if the key is missing, and -1 if an
* exception occurred.
*/
int
static inline int
_PyFrozenDict_GetItemRef_KnownHash(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result)
{
PyObject *value;
Py_ssize_t ix = _Py_dict_lookup(op, key, hash, &value);
Py_ssize_t ix = _Py_frozendict_lookup(op, key, hash, &value);
assert(ix >= 0 || value == NULL);
if (ix == DKIX_ERROR) {
*result = NULL;
Expand Down
Loading