diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-11-06 22:26:05 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-11-06 22:26:05 +0000 |
commit | 7af3ee2b83545169d78a28ab1cd89aff1127f8b3 (patch) | |
tree | 9f34e13a19ff1f9f8247e8374d7bcb6d4b806bdd /src | |
parent | adbc08fd69433b5216e609a404d674f3e67eea9c (diff) |
patch 9.0.0841: deletebufline() does not always return 1 on failurev9.0.0841
Problem: deletebufline() does not always return 1 on failure.
Solution: Refactor the code to make it work more predictable. (closes #11511)
Diffstat (limited to 'src')
-rw-r--r-- | src/evalbuffer.c | 46 | ||||
-rw-r--r-- | src/testdir/test_bufline.vim | 16 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 40 insertions, 24 deletions
diff --git a/src/evalbuffer.c b/src/evalbuffer.c index 9ce1d41aeb..4a9d5989eb 100644 --- a/src/evalbuffer.c +++ b/src/evalbuffer.c @@ -535,6 +535,7 @@ f_deletebufline(typval_T *argvars, typval_T *rettv) || 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, typval_T *rettv) } 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_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 (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); + 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 index 13e891bcf1..da8c4a5aa2 100644 --- 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 <buffer> <expr> <F2> setbufline('', 1, '') + call assert_fails("normal a\<F2>", 'E565:') + call assert_equal('1', getline(1)) + inoremap <buffer> <expr> <F2> appendbufline('', 1, '') + call assert_fails("normal a\<F2>", 'E565:') + call assert_equal('11', getline(1)) + inoremap <buffer> <expr> <F2> deletebufline('', 1) + call assert_fails("normal a\<F2>", '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 index e7dc5a5b5c..0e59a7874c 100644 --- 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, |