Mercurial > vim
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 } /*