summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/eval.c34
-rw-r--r--src/if_lua.c18
-rw-r--r--src/if_py_both.h30
-rw-r--r--src/popupwin.c6
-rw-r--r--src/proto/eval.pro4
-rw-r--r--src/userfunc.c4
-rw-r--r--src/version.c2
7 files changed, 50 insertions, 48 deletions
diff --git a/src/eval.c b/src/eval.c
index 085e7d7e9..3cfa4b7a5 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -5841,13 +5841,43 @@ set_ref_in_ht(hashtab_T *ht, int copyID, list_stack_T **list_stack)
}
/*
+ * Mark a dict and its items with "copyID".
+ * Returns TRUE if setting references failed somehow.
+ */
+ int
+set_ref_in_dict(dict_T *d, int copyID)
+{
+ if (d != NULL && d->dv_copyID != copyID)
+ {
+ d->dv_copyID = copyID;
+ return set_ref_in_ht(&d->dv_hashtab, copyID, NULL);
+ }
+ return FALSE;
+}
+
+/*
+ * Mark a list and its items with "copyID".
+ * Returns TRUE if setting references failed somehow.
+ */
+ int
+set_ref_in_list(list_T *ll, int copyID)
+{
+ if (ll != NULL && ll->lv_copyID != copyID)
+ {
+ ll->lv_copyID = copyID;
+ return set_ref_in_list_items(ll, copyID, NULL);
+ }
+ return FALSE;
+}
+
+/*
* Mark all lists and dicts referenced through list "l" with "copyID".
* "ht_stack" is used to add hashtabs to be marked. Can be NULL.
*
* Returns TRUE if setting references failed somehow.
*/
int
-set_ref_in_list(list_T *l, int copyID, ht_stack_T **ht_stack)
+set_ref_in_list_items(list_T *l, int copyID, ht_stack_T **ht_stack)
{
listitem_T *li;
int abort = FALSE;
@@ -5930,7 +5960,7 @@ set_ref_in_item(
ll->lv_copyID = copyID;
if (list_stack == NULL)
{
- abort = set_ref_in_list(ll, copyID, ht_stack);
+ abort = set_ref_in_list_items(ll, copyID, ht_stack);
}
else
{
diff --git a/src/if_lua.c b/src/if_lua.c
index cfb288522..4c0eb42a4 100644
--- a/src/if_lua.c
+++ b/src/if_lua.c
@@ -1980,31 +1980,19 @@ luaV_setref(lua_State *L)
{
list_T *l = (list_T *)lua_touserdata(L, 5); // key
- if (l->lv_copyID != copyID)
- {
- l->lv_copyID = copyID;
- abort = set_ref_in_list(l, copyID, NULL);
- }
+ abort = set_ref_in_list(l, copyID);
}
else if (lua_rawequal(L, -1, 3)) // dict?
{
dict_T *d = (dict_T *)lua_touserdata(L, 5); // key
- if (d->dv_copyID != copyID)
- {
- d->dv_copyID = copyID;
- abort = set_ref_in_ht(&d->dv_hashtab, copyID, NULL);
- }
+ abort = set_ref_in_dict(d, copyID);
}
else if (lua_rawequal(L, -1, 4)) // funcref?
{
luaV_Funcref *f = (luaV_Funcref *)lua_touserdata(L, 5); // key
- if (f->self != NULL && f->self->dv_copyID != copyID)
- {
- f->self->dv_copyID = copyID;
- abort = set_ref_in_ht(&f->self->dv_hashtab, copyID, NULL);
- }
+ abort = set_ref_in_dict(f->self, copyID);
}
lua_pop(L, 2); // metatable and value
}
diff --git a/src/if_py_both.h b/src/if_py_both.h
index 5362d4563..d836c7c91 100644
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -5832,23 +5832,16 @@ run_eval(const char *cmd, typval_T *rettv
set_ref_in_py(const int copyID)
{
pylinkedlist_T *cur;
- dict_T *dd;
- list_T *ll;
- int i;
- int abort = FALSE;
+ list_T *ll;
+ int i;
+ int abort = FALSE;
FunctionObject *func;
if (lastdict != NULL)
{
for (cur = lastdict ; !abort && cur != NULL ; cur = cur->pll_prev)
- {
- dd = ((DictionaryObject *) (cur->pll_obj))->dict;
- if (dd->dv_copyID != copyID)
- {
- dd->dv_copyID = copyID;
- abort = abort || set_ref_in_ht(&dd->dv_hashtab, copyID, NULL);
- }
- }
+ abort = set_ref_in_dict(((DictionaryObject *)(cur->pll_obj))->dict,
+ copyID);
}
if (lastlist != NULL)
@@ -5856,11 +5849,7 @@ set_ref_in_py(const int copyID)
for (cur = lastlist ; !abort && cur != NULL ; cur = cur->pll_prev)
{
ll = ((ListObject *) (cur->pll_obj))->list;
- if (ll->lv_copyID != copyID)
- {
- ll->lv_copyID = copyID;
- abort = abort || set_ref_in_list(ll, copyID, NULL);
- }
+ abort = set_ref_in_list(ll, copyID);
}
}
@@ -5869,12 +5858,7 @@ set_ref_in_py(const int copyID)
for (cur = lastfunc ; !abort && cur != NULL ; cur = cur->pll_prev)
{
func = (FunctionObject *) cur->pll_obj;
- if (func->self != NULL && func->self->dv_copyID != copyID)
- {
- func->self->dv_copyID = copyID;
- abort = abort || set_ref_in_ht(
- &func->self->dv_hashtab, copyID, NULL);
- }
+ abort = set_ref_in_dict(func->self, copyID);
if (func->argc)
for (i = 0; !abort && i < func->argc; ++i)
abort = abort
diff --git a/src/popupwin.c b/src/popupwin.c
index d675a4484..f6da71da8 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -2297,11 +2297,7 @@ set_ref_in_one_popup(win_T *wp, int copyID)
tv.vval.v_partial = wp->w_filter_cb.cb_partial;
abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL);
}
- if (wp->w_popup_mask != NULL && wp->w_popup_mask->lv_copyID != copyID)
- {
- wp->w_popup_mask->lv_copyID = copyID;
- abort = abort || set_ref_in_list(wp->w_popup_mask, copyID, NULL);
- }
+ abort = abort || set_ref_in_list(wp->w_popup_mask, copyID);
return abort;
}
diff --git a/src/proto/eval.pro b/src/proto/eval.pro
index 5e800adc8..7831eb596 100644
--- a/src/proto/eval.pro
+++ b/src/proto/eval.pro
@@ -50,7 +50,9 @@ int tv_equal(typval_T *tv1, typval_T *tv2, int ic, int recursive);
int get_copyID(void);
int garbage_collect(int testing);
int set_ref_in_ht(hashtab_T *ht, int copyID, list_stack_T **list_stack);
-int set_ref_in_list(list_T *l, int copyID, ht_stack_T **ht_stack);
+int set_ref_in_dict(dict_T *d, int copyID);
+int set_ref_in_list(list_T *ll, int copyID);
+int set_ref_in_list_items(list_T *l, int copyID, ht_stack_T **ht_stack);
int set_ref_in_item(typval_T *tv, int copyID, ht_stack_T **ht_stack, list_stack_T **list_stack);
char_u *echo_string_core(typval_T *tv, char_u **tofree, char_u *numbuf, int copyID, int echo_style, int restore_copyID, int composite_val);
char_u *echo_string(typval_T *tv, char_u **tofree, char_u *numbuf, int copyID);
diff --git a/src/userfunc.c b/src/userfunc.c
index 8d1df0ca8..be993130d 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -4000,7 +4000,7 @@ set_ref_in_previous_funccal(int copyID)
abort = abort
|| set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID + 1, NULL)
|| set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID + 1, NULL)
- || set_ref_in_list(&fc->l_varlist, copyID + 1, NULL);
+ || set_ref_in_list_items(&fc->l_varlist, copyID + 1, NULL);
}
return abort;
}
@@ -4016,7 +4016,7 @@ set_ref_in_funccal(funccall_T *fc, int copyID)
abort = abort
|| set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID, NULL)
|| set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID, NULL)
- || set_ref_in_list(&fc->l_varlist, copyID, NULL)
+ || set_ref_in_list_items(&fc->l_varlist, copyID, NULL)
|| set_ref_in_func(NULL, fc->func, copyID);
}
return abort;
diff --git a/src/version.c b/src/version.c
index 2af29122c..9fec3b883 100644
--- a/src/version.c
+++ b/src/version.c
@@ -778,6 +778,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1583,
+/**/
1582,
/**/
1581,