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 *
{
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;
}
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,
ufunc_T *fp;
long_u skipped = 0;
long_u todo = 1;
- long_u used;
+ int changed;
// Clean up the current_funccal chain and the funccal stack.
while (current_funccal != NULL)
++skipped;
else
{
- used = func_hashtab.ht_used;
+ changed = func_hashtab.ht_changed;
func_clear(fp, TRUE);
- if (used != func_hashtab.ht_used)
+ if (changed != func_hashtab.ht_changed)
{
skipped = 0;
break;
static void
list_functions(regmatch_T *regmatch)
{
- long_u used = func_hashtab.ht_used;
- long_u todo = used;
- hashitem_T *ht_array = func_hashtab.ht_array;
+ int changed = func_hashtab.ht_changed;
+ long_u todo = func_hashtab.ht_used;
hashitem_T *hi;
- for (hi = ht_array; todo > 0 && !got_int; ++hi)
+ for (hi = func_hashtab.ht_array; todo > 0 && !got_int; ++hi)
{
if (!HASHITEM_EMPTY(hi))
{
&& vim_regexec(regmatch, fp->uf_name, 0)))
{
list_func_head(fp, FALSE);
- if (used != func_hashtab.ht_used
- || ht_array != func_hashtab.ht_array)
+ if (changed != func_hashtab.ht_changed)
{
emsg(_("E454: function list was modified"));
return;
get_user_func_name(expand_T *xp, int idx)
{
static long_u done;
+ static int changed;
static hashitem_T *hi;
ufunc_T *fp;
{
done = 0;
hi = func_hashtab.ht_array;
+ changed = func_hashtab.ht_changed;
}
- if (done < func_hashtab.ht_used)
+ if (changed == func_hashtab.ht_changed && done < func_hashtab.ht_used)
{
if (done++ > 0)
++hi;