diff options
-rw-r--r-- | src/eval.c | 34 | ||||
-rw-r--r-- | src/if_lua.c | 18 | ||||
-rw-r--r-- | src/if_py_both.h | 30 | ||||
-rw-r--r-- | src/popupwin.c | 6 | ||||
-rw-r--r-- | src/proto/eval.pro | 4 | ||||
-rw-r--r-- | src/userfunc.c | 4 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |