Skip to content

Commit b4a06fd

Browse files
committed
fix for free-threading
1 parent d22f149 commit b4a06fd

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

Include/internal/pycore_dict.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ extern void _PyDictKeys_DecRef(PyDictKeysObject *keys);
111111
* -1 when no entry found, -3 when compare raises error.
112112
*/
113113
extern Py_ssize_t _Py_dict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr);
114+
extern Py_ssize_t _Py_frozendict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr);
114115
extern Py_ssize_t _Py_dict_lookup_threadsafe(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr);
115116
extern Py_ssize_t _Py_dict_lookup_threadsafe_stackref(PyDictObject *mp, PyObject *key, Py_hash_t hash, _PyStackRef *value_addr);
116117

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

151-
PyAPI_FUNC(int) _PyFrozenDict_GetItemRef(PyObject *op, PyObject *key, PyObject **result);
152+
extern int _PyFrozenDict_GetItemRef(PyObject *op, PyObject *key, PyObject **result);
152153

153154
extern int _PyDict_Pop_KnownHash(
154155
PyDictObject *dict,

Objects/dictobject.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,14 +1249,13 @@ _Py_dict_lookup() is general-purpose, and may return DKIX_ERROR if (and only if)
12491249
comparison raises an exception.
12501250
When the key isn't found a DKIX_EMPTY is returned.
12511251
*/
1252-
Py_ssize_t
1253-
_Py_dict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr)
1252+
static inline Py_ssize_t
1253+
dict_lookup_impl(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr)
12541254
{
12551255
PyDictKeysObject *dk;
12561256
DictKeysKind kind;
12571257
Py_ssize_t ix;
12581258

1259-
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(mp);
12601259
start:
12611260
dk = mp->ma_keys;
12621261
kind = dk->dk_kind;
@@ -1315,6 +1314,19 @@ _Py_dict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **valu
13151314
return ix;
13161315
}
13171316

1317+
Py_ssize_t
1318+
_Py_dict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr)
1319+
{
1320+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(mp);
1321+
return dict_lookup_impl(mp, key, hash, value_addr);
1322+
}
1323+
1324+
Py_ssize_t
1325+
_Py_frozendict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr)
1326+
{
1327+
return dict_lookup_impl(mp, key, hash, value_addr);
1328+
}
1329+
13181330
#ifdef Py_GIL_DISABLED
13191331
static inline void
13201332
ensure_shared_on_read(PyDictObject *mp)
@@ -2492,11 +2504,11 @@ PyDict_GetItemRef(PyObject *op, PyObject *key, PyObject **result)
24922504
* Returns 1 if the key is present, 0 if the key is missing, and -1 if an
24932505
* exception occurred.
24942506
*/
2495-
int
2507+
static inline int
24962508
_PyFrozenDict_GetItemRef_KnownHash(PyDictObject *op, PyObject *key, Py_hash_t hash, PyObject **result)
24972509
{
24982510
PyObject *value;
2499-
Py_ssize_t ix = _Py_dict_lookup(op, key, hash, &value);
2511+
Py_ssize_t ix = _Py_frozendict_lookup(op, key, hash, &value);
25002512
assert(ix >= 0 || value == NULL);
25012513
if (ix == DKIX_ERROR) {
25022514
*result = NULL;

0 commit comments

Comments
 (0)