# HG changeset patch # User Bram Moolenaar # Date 1667773803 -3600 # Node ID 4ba2890de10d6179839054646f8fd892b8ead1b8 # Parent 768705736aab9ab876224d5f756e3a430bed14dd patch 9.0.0841: deletebufline() does not always return 1 on failure Commit: https://github.com/vim/vim/commit/7af3ee2b83545169d78a28ab1cd89aff1127f8b3 Author: zeertzjq 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) diff --git a/src/evalbuffer.c b/src/evalbuffer.c --- 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 } /* diff --git a/src/testdir/test_bufline.vim b/src/testdir/test_bufline.vim --- a/src/testdir/test_bufline.vim +++ b/src/testdir/test_bufline.vim @@ -279,4 +279,20 @@ func Test_setbufline_startup_nofile() call delete('Xresult') endfunc +" Test that setbufline(), appendbufline() and deletebufline() should fail and +" return 1 when "textlock" is active. +func Test_change_bufline_with_textlock() + new + inoremap setbufline('', 1, '') + call assert_fails("normal a\", 'E565:') + call assert_equal('1', getline(1)) + inoremap appendbufline('', 1, '') + call assert_fails("normal a\", 'E565:') + call assert_equal('11', getline(1)) + inoremap deletebufline('', 1) + call assert_fails("normal a\", 'E565:') + call assert_equal('111', getline(1)) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 841, +/**/ 840, /**/ 839,