changeset 77:31e555c6c691

updated for version 7.0032
author vimboss
date Thu, 06 Jan 2005 23:19:09 +0000
parents 0ef9cebc4f5d
children b00be47310ed
files src/ex_docmd.c
diffstat 1 files changed, 12 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -1114,9 +1114,9 @@ do_cmdline(cmdline, getline, cookie, fla
 		else
 		{
 		    /* can only get here with ":endwhile" or ":endfor" */
-		    --cstack.cs_looplevel;
 		    if (cstack.cs_idx >= 0)
-			--cstack.cs_idx;
+			rewind_conditionals(&cstack, cstack.cs_idx - 1,
+				   CSF_WHILE | CSF_FOR, &cstack.cs_looplevel);
 		}
 	    }
 
@@ -1239,11 +1239,18 @@ do_cmdline(cmdline, getline, cookie, fla
 	 * ":endtry" in a sourced file or executed function.  If the try
 	 * conditional is in its finally clause, ignore anything pending.
 	 * If it is in a catch clause, finish the caught exception.
+	 * Also cleanup any "cs_forinfo" structures.
 	 */
 	do
-	    cstack.cs_idx = cleanup_conditionals(&cstack, 0, TRUE);
-	while (--cstack.cs_idx >= 0)
-	    ;
+	{
+	    int idx = cleanup_conditionals(&cstack, 0, TRUE);
+
+	    if (idx == cstack.cs_idx)
+		--idx;	    /* remove at least one */
+	    rewind_conditionals(&cstack, idx, CSF_WHILE | CSF_FOR,
+							&cstack.cs_looplevel);
+	}
+	while (cstack.cs_idx >= 0);
 	trylevel = initial_trylevel;
     }