Skip to content

Commit d6e97e9

Browse files
committed
Assert we don't get -1 from hashing exact unicode, lock in _PyObject_StoreInstanceAttribute
1 parent 22d7bfb commit d6e97e9

File tree

1 file changed

+5
-15
lines changed

1 file changed

+5
-15
lines changed

Objects/dictobject.c

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1597,7 +1597,7 @@ insertion_resize(PyInterpreterState *interp, PyDictObject *mp, int unicode)
15971597
}
15981598

15991599
static Py_ssize_t
1600-
insert_into_splitdictkeys_locked(PyDictKeysObject *keys, PyObject *name)
1600+
insert_into_splitdictkeys(PyDictKeysObject *keys, PyObject *name)
16011601
{
16021602
assert(PyUnicode_CheckExact(name));
16031603
ASSERT_KEYS_LOCKED(keys);
@@ -1629,15 +1629,6 @@ insert_into_splitdictkeys_locked(PyDictKeysObject *keys, PyObject *name)
16291629
return ix;
16301630
}
16311631

1632-
static Py_ssize_t
1633-
insert_into_splitdictkeys(PyDictKeysObject *keys, PyObject *name)
1634-
{
1635-
LOCK_KEYS(keys);
1636-
Py_ssize_t ix = insert_into_splitdictkeys_locked(keys, name);
1637-
UNLOCK_KEYS(keys);
1638-
return ix;
1639-
}
1640-
16411632
static inline int
16421633
insert_combined_dict(PyInterpreterState *interp, PyDictObject *mp,
16431634
Py_hash_t hash, PyObject *key, PyObject *value)
@@ -6705,17 +6696,16 @@ _PyObject_StoreInstanceAttribute(PyObject *obj, PyDictValues *values,
67056696
Py_hash_t hash = unicode_get_hash(name);
67066697
if (hash == -1) {
67076698
hash = PyUnicode_Type.tp_hash(name);
6708-
if (hash == -1) {
6709-
PyErr_Clear();
6710-
return DKIX_EMPTY;
6711-
}
6699+
assert(hash != -1);
67126700
}
67136701

67146702
// Try a thread-safe lookup to see if the index is already allocated
67156703
ix = unicodekeys_lookup_unicode_threadsafe(keys, name, hash);
67166704
if (ix == DKIX_EMPTY) {
6717-
// Fall back to a version that will lock and maybe insert
6705+
// Lock keys and do insert
6706+
LOCK_KEYS(keys);
67186707
ix = insert_into_splitdictkeys(keys, name);
6708+
UNLOCK_KEYS(keys);
67196709
}
67206710
#else
67216711
ix = insert_into_splitdictkeys(keys, name);

0 commit comments

Comments
 (0)