summaryrefslogtreecommitdiffstats
path: root/src/if_py_both.h
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-14 21:08:49 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-14 21:08:49 +0200
commit1f22cc5cdb2da867d6bbf54dd371f279c38a2f56 (patch)
tree32d3ebe3de935d0e295c8725b160b1a723f5cfd7 /src/if_py_both.h
parent21c16f868d725fffc8fa36620cba33dd5f2ed576 (diff)
patch 8.2.1210: using ht_used when looping through a hashtab is less reliablev8.2.1210
Problem: Using ht_used when looping through a hashtab is less reliable. Solution: Use ht_changed in a few more places.
Diffstat (limited to 'src/if_py_both.h')
-rw-r--r--src/if_py_both.h31
1 files changed, 14 insertions, 17 deletions
diff --git a/src/if_py_both.h b/src/if_py_both.h
index 5bd6a0e677..8eb77470a3 100644
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -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,