Mercurial > vim
changeset 1008:58059676e24a v7.0.134
updated for version 7.0-134
author | vimboss |
---|---|
date | Sun, 15 Oct 2006 13:09:12 +0000 |
parents | 7d29124f77f5 |
children | 721ebb602db0 |
files | src/eval.c src/version.c |
diffstat | 2 files changed, 16 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -5520,19 +5520,27 @@ tv_equal(tv1, tv2, ic) { char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN]; char_u *s1, *s2; - - if (tv1->v_type != tv2->v_type) + static int recursive = 0; /* cach recursive loops */ + int r; + + /* Catch lists and dicts that have an endless loop by limiting + * recursiveness to 1000. */ + if (tv1->v_type != tv2->v_type || recursive >= 1000) return FALSE; switch (tv1->v_type) { case VAR_LIST: - /* recursive! */ - return list_equal(tv1->vval.v_list, tv2->vval.v_list, ic); + ++recursive; + r = list_equal(tv1->vval.v_list, tv2->vval.v_list, ic); + --recursive; + return r; case VAR_DICT: - /* recursive! */ - return dict_equal(tv1->vval.v_dict, tv2->vval.v_dict, ic); + ++recursive; + r = dict_equal(tv1->vval.v_dict, tv2->vval.v_dict, ic); + --recursive; + return r; case VAR_FUNC: return (tv1->vval.v_string != NULL