summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-06-27 13:04:00 +0200
committerBram Moolenaar <Bram@vim.org>2021-06-27 13:04:00 +0200
commit4cd5c52d64a66ad1984d33462a40e0c6721ca232 (patch)
tree6030ab9a9e9971692340d7f71189c245d2b90924
parent054794c20f6322bbd9482c4124041dc0a140c78e (diff)
downloadvim-git-4cd5c52d64a66ad1984d33462a40e0c6721ca232.tar.gz
patch 8.2.3062: internal error when adding several text propertiesv8.2.3062
Problem: Internal error when adding several text properties. Solution: Do not handle text properties when deleting a line for splitting a data block. (closes #8466)
-rw-r--r--src/memline.c10
-rw-r--r--src/structs.h1
-rw-r--r--src/testdir/test_textprop.vim22
-rw-r--r--src/version.c2
4 files changed, 31 insertions, 4 deletions
diff --git a/src/memline.c b/src/memline.c
index f1c2a8a52..0eac1cdcb 100644
--- a/src/memline.c
+++ b/src/memline.c
@@ -3662,7 +3662,7 @@ ml_delete_int(buf_T *buf, linenr_T lnum, int flags)
#ifdef FEAT_PROP_POPUP
// If there are text properties, make a copy, so that we can update
// properties in preceding and following lines.
- if (buf->b_has_textprop && !(flags & ML_DEL_UNDO))
+ if (buf->b_has_textprop && !(flags & (ML_DEL_UNDO | ML_DEL_NOPROP)))
{
size_t textlen = STRLEN((char_u *)dp + line_start) + 1;
@@ -3765,9 +3765,11 @@ theend:
{
// Adjust text properties in the line above and below.
if (lnum > 1)
- adjust_text_props_for_delete(buf, lnum - 1, textprop_save, textprop_save_len, TRUE);
+ adjust_text_props_for_delete(buf, lnum - 1, textprop_save,
+ textprop_save_len, TRUE);
if (lnum <= buf->b_ml.ml_line_count)
- adjust_text_props_for_delete(buf, lnum, textprop_save, textprop_save_len, FALSE);
+ adjust_text_props_for_delete(buf, lnum, textprop_save,
+ textprop_save_len, FALSE);
}
vim_free(textprop_save);
#endif
@@ -4021,7 +4023,7 @@ ml_flush_line(buf_T *buf)
| ML_APPEND_NOPROP
#endif
);
- (void)ml_delete_int(buf, lnum, 0);
+ (void)ml_delete_int(buf, lnum, ML_DEL_NOPROP);
}
}
vim_free(new_line);
diff --git a/src/structs.h b/src/structs.h
index ae2c0b850..d6f4988e7 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -769,6 +769,7 @@ typedef struct memline
// Values for the flags argument of ml_delete_flags().
#define ML_DEL_MESSAGE 1 // may give a "No lines in buffer" message
#define ML_DEL_UNDO 2 // called from undo, do not update textprops
+#define ML_DEL_NOPROP 4 // splitting data block, do not update textprops
// Values for the flags argument of ml_append_int().
#define ML_APPEND_NEW 1 // starting to edit a new file
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index d1e8f38d4..e2de3ba93 100644
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -1488,5 +1488,27 @@ def Test_prop_splits_data_block()
prop_type_delete('someprop')
enddef
+" This was calling ml_delete_int() and try to change text properties.
+def Test_prop_add_delete_line()
+ new
+ var a = 10
+ var b = 20
+ repeat([''], a)->append('$')
+ prop_type_add('Test', {highlight: 'ErrorMsg'})
+ for lnum in range(1, a)
+ for col in range(1, b)
+ prop_add(1, 1, {end_lnum: lnum, end_col: col, type: 'Test'})
+ endfor
+ endfor
+
+ # check deleting lines is OK
+ :5del
+ :1del
+ :$del
+
+ prop_type_delete('Test')
+ bwipe!
+enddef
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index f4f5df33b..e311104f5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3062,
+/**/
3061,
/**/
3060,