diff src/eval.c @ 1008:58059676e24a v7.0.134

updated for version 7.0-134
author vimboss
date Sun, 15 Oct 2006 13:09:12 +0000
parents f49d72bf9c5c
children 721ebb602db0
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