diff src/evalbuffer.c @ 31012:4ba2890de10d v9.0.0841

patch 9.0.0841: deletebufline() does not always return 1 on failure Commit: https://github.com/vim/vim/commit/7af3ee2b83545169d78a28ab1cd89aff1127f8b3 Author: zeertzjq <zeertzjq@outlook.com> Date: Sun Nov 6 22:26:05 2022 +0000 patch 9.0.0841: deletebufline() does not always return 1 on failure Problem: deletebufline() does not always return 1 on failure. Solution: Refactor the code to make it work more predictable. (closes https://github.com/vim/vim/issues/11511)
author Bram Moolenaar <Bram@vim.org>
date Sun, 06 Nov 2022 23:30:03 +0100
parents eb145a4d6bf8
children ac6f5741b155
line wrap: on
line diff
--- a/src/evalbuffer.c
+++ b/src/evalbuffer.c
@@ -535,6 +535,7 @@ f_deletebufline(typval_T *argvars, typva
 			   || first > buf->b_ml.ml_line_count || last < first)
 	return;
 
+    // After this don't use "return", goto "cleanup"!
     if (!is_curbuf)
     {
 	VIsual_active = FALSE;
@@ -556,38 +557,35 @@ f_deletebufline(typval_T *argvars, typva
     }
 
     if (u_save(first - 1, last + 1) == FAIL)
-    {
-	rettv->vval.v_number = 1;	// FAIL
-    }
-    else
-    {
-	for (lnum = first; lnum <= last; ++lnum)
-	    ml_delete_flags(first, ML_DEL_MESSAGE);
+	goto cleanup;
+
+    for (lnum = first; lnum <= last; ++lnum)
+	ml_delete_flags(first, ML_DEL_MESSAGE);
 
-	FOR_ALL_TAB_WINDOWS(tp, wp)
-	    if (wp->w_buffer == buf)
-	    {
-		if (wp->w_cursor.lnum > last)
-		    wp->w_cursor.lnum -= count;
-		else if (wp->w_cursor.lnum > first)
-		    wp->w_cursor.lnum = first;
-		if (wp->w_cursor.lnum > wp->w_buffer->b_ml.ml_line_count)
-		    wp->w_cursor.lnum = wp->w_buffer->b_ml.ml_line_count;
-		wp->w_valid = 0;
-		if (wp->w_cursor.lnum <= wp->w_topline)
-		    wp->w_topline = 1;
-	    }
-	check_cursor_col();
-	deleted_lines_mark(first, count);
-    }
+    FOR_ALL_TAB_WINDOWS(tp, wp)
+	if (wp->w_buffer == buf)
+	{
+	    if (wp->w_cursor.lnum > last)
+		wp->w_cursor.lnum -= count;
+	    else if (wp->w_cursor.lnum > first)
+		wp->w_cursor.lnum = first;
+	    if (wp->w_cursor.lnum > wp->w_buffer->b_ml.ml_line_count)
+		wp->w_cursor.lnum = wp->w_buffer->b_ml.ml_line_count;
+	    wp->w_valid = 0;
+	    if (wp->w_cursor.lnum <= wp->w_topline)
+		wp->w_topline = 1;
+	}
+    check_cursor_col();
+    deleted_lines_mark(first, count);
+    rettv->vval.v_number = 0; // OK
 
+cleanup:
     if (!is_curbuf)
     {
 	curbuf = curbuf_save;
 	curwin = curwin_save;
 	VIsual_active = save_VIsual_active;
     }
-    rettv->vval.v_number = 0; // OK
 }
 
 /*