mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.1210: using ht_used when looping through a hashtab is less reliable
Problem: Using ht_used when looping through a hashtab is less reliable. Solution: Use ht_changed in a few more places.
This commit is contained in:
@@ -1792,11 +1792,10 @@ DictionaryContains(DictionaryObject *self, PyObject *keyObject)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
hashitem_T *ht_array;
|
||||
long_u ht_used;
|
||||
hashtab_T *ht;
|
||||
hashitem_T *hi;
|
||||
long_u todo;
|
||||
int dii_changed;
|
||||
hashtab_T *dii_ht;
|
||||
hashitem_T *dii_hi;
|
||||
long_u dii_todo;
|
||||
} dictiterinfo_T;
|
||||
|
||||
static PyObject *
|
||||
@@ -1804,23 +1803,22 @@ DictionaryIterNext(dictiterinfo_T **dii)
|
||||
{
|
||||
PyObject *ret;
|
||||
|
||||
if (!(*dii)->todo)
|
||||
if (!(*dii)->dii_todo)
|
||||
return NULL;
|
||||
|
||||
if ((*dii)->ht->ht_array != (*dii)->ht_array ||
|
||||
(*dii)->ht->ht_used != (*dii)->ht_used)
|
||||
if ((*dii)->dii_ht->ht_changed != (*dii)->dii_changed)
|
||||
{
|
||||
PyErr_SET_STRING(PyExc_RuntimeError,
|
||||
N_("hashtab changed during iteration"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while (((*dii)->todo) && HASHITEM_EMPTY((*dii)->hi))
|
||||
++((*dii)->hi);
|
||||
while (((*dii)->dii_todo) && HASHITEM_EMPTY((*dii)->dii_hi))
|
||||
++((*dii)->dii_hi);
|
||||
|
||||
--((*dii)->todo);
|
||||
--((*dii)->dii_todo);
|
||||
|
||||
if (!(ret = PyBytes_FromString((char *)(*dii)->hi->hi_key)))
|
||||
if (!(ret = PyBytes_FromString((char *)(*dii)->dii_hi->hi_key)))
|
||||
return NULL;
|
||||
|
||||
return ret;
|
||||
@@ -1839,11 +1837,10 @@ DictionaryIter(DictionaryObject *self)
|
||||
}
|
||||
|
||||
ht = &self->dict->dv_hashtab;
|
||||
dii->ht_array = ht->ht_array;
|
||||
dii->ht_used = ht->ht_used;
|
||||
dii->ht = ht;
|
||||
dii->hi = dii->ht_array;
|
||||
dii->todo = dii->ht_used;
|
||||
dii->dii_changed = ht->ht_changed;
|
||||
dii->dii_ht = ht;
|
||||
dii->dii_hi = ht->ht_array;
|
||||
dii->dii_todo = ht->ht_used;
|
||||
|
||||
return IterNew(dii,
|
||||
(destructorfun) PyMem_Free, (nextfun) DictionaryIterNext,
|
||||
|
Reference in New Issue
Block a user