]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.0179: still a few places where range() does not work v8.2.0179
authorBram Moolenaar <Bram@vim.org>
Thu, 30 Jan 2020 13:55:42 +0000 (14:55 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 30 Jan 2020 13:55:42 +0000 (14:55 +0100)
Problem:    Still a few places where range() does not work.
Solution:   Fix using range() causing problems.

src/globals.h
src/popupwin.c
src/tag.c
src/terminal.c
src/testdir/dumps/Test_popup_settext_07.dump [new file with mode: 0644]
src/testdir/dumps/Test_popupwin_20.dump
src/testdir/dumps/Test_popupwin_21.dump
src/testdir/test_functions.vim
src/testdir/test_popupwin.vim
src/version.c

index b40eb2a85f5f8235c9bf2223c6668aad9620a982..562d956eb1ab014f6f1fba63cf329803d7fc8cfd 100644 (file)
@@ -1798,7 +1798,7 @@ EXTERN int *eval_lavars_used INIT(= NULL);
 // Only filled for Win32.
 EXTERN char windowsVersion[20] INIT(= {0});
 
-// Used for a non-materialized range() list.
+// Used for lv_first in a non-materialized range() list.
 EXTERN listitem_T range_list_item;
 #endif
 
index 47e9238bab86c68279871a1eeec9315987205228..8a3f500d211fa13e9d194b6b2aa6adc462a87610 100644 (file)
@@ -97,6 +97,8 @@ set_padding_border(dict_T *dict, int *array, char *name, int max_val)
            for (i = 0; i < 4; ++i)
                array[i] = 1;
            if (list != NULL)
+           {
+               range_list_materialize(list);
                for (i = 0, li = list->lv_first; i < 4 && i < list->lv_len;
                                                         ++i, li = li->li_next)
                {
@@ -104,6 +106,7 @@ set_padding_border(dict_T *dict, int *array, char *name, int max_val)
                    if (nr >= 0)
                        array[i] = nr > max_val ? max_val : nr;
                }
+           }
        }
     }
 }
@@ -476,6 +479,9 @@ apply_move_options(win_T *wp, dict_T *d)
        wp->w_popup_prop_id = dict_get_number(d, (char_u *)"textpropid");
 }
 
+/*
+ * Handle "moved" and "mousemoved" arguments.
+ */
     static void
 handle_moved_argument(win_T *wp, dictitem_T *di, int mousemoved)
 {
@@ -506,11 +512,13 @@ handle_moved_argument(win_T *wp, dictitem_T *di, int mousemoved)
             || di->di_tv.vval.v_list->lv_len == 3))
     {
        list_T      *l = di->di_tv.vval.v_list;
-       listitem_T  *li = l->lv_first;
+       listitem_T  *li;
        int         mincol;
        int         maxcol;
 
-       if (di->di_tv.vval.v_list->lv_len == 3)
+       range_list_materialize(l);
+       li = l->lv_first;
+       if (l->lv_len == 3)
        {
            varnumber_T nr = tv_get_number(&l->lv_first->li_tv);
 
@@ -748,6 +756,7 @@ apply_general_options(win_T *wp, dict_T *dict)
            listitem_T  *li;
            int         i;
 
+           range_list_materialize(list);
            for (i = 0, li = list->lv_first; i < 4 && i < list->lv_len;
                                                     ++i, li = li->li_next)
            {
@@ -780,6 +789,8 @@ apply_general_options(win_T *wp, dict_T *dict)
            int         i;
 
            if (list != NULL)
+           {
+               range_list_materialize(list);
                for (i = 0, li = list->lv_first; i < 8 && i < list->lv_len;
                                                         ++i, li = li->li_next)
                {
@@ -787,6 +798,7 @@ apply_general_options(win_T *wp, dict_T *dict)
                    if (*str != NUL)
                        wp->w_border_char[i] = mb_ptr2char(str);
                }
+           }
            if (list->lv_len == 1)
                for (i = 1; i < 8; ++i)
                    wp->w_border_char[i] = wp->w_border_char[0];
@@ -833,6 +845,8 @@ apply_general_options(win_T *wp, dict_T *dict)
                    ok = FALSE;
                    break;
                }
+               else
+                   range_list_materialize(li->li_tv.vval.v_list);
            }
        }
        if (ok)
index cfc300e4659c7628f83189d6674bbbec1d29457f..148a5a013099beb6f40364767fd8709b84358377 100644 (file)
--- a/src/tag.c
+++ b/src/tag.c
@@ -4267,6 +4267,7 @@ set_tagstack(win_T *wp, dict_T *d, int action)
        taggy_T *tagstack = wp->w_tagstack;
        int     tagstackidx = wp->w_tagstackidx;
        int     tagstacklen = wp->w_tagstacklen;
+
        // delete all the tag stack entries above the current entry
        while (tagstackidx < tagstacklen)
            tagstack_clear_entry(&tagstack[--tagstacklen]);
index da27a9c17b86ae2c65590562767dc19d46cc9b1a..3bf914ae9a9703cf6f4746d735ea754c0bae38fa 100644 (file)
@@ -417,7 +417,11 @@ term_start(
     if ((opt->jo_set & (JO_IN_IO + JO_OUT_IO + JO_ERR_IO))
                                         == (JO_IN_IO + JO_OUT_IO + JO_ERR_IO)
        || (!(opt->jo_set & JO_OUT_IO) && (opt->jo_set & JO_OUT_BUF))
-       || (!(opt->jo_set & JO_ERR_IO) && (opt->jo_set & JO_ERR_BUF)))
+       || (!(opt->jo_set & JO_ERR_IO) && (opt->jo_set & JO_ERR_BUF))
+       || (argvar != NULL
+           && argvar->v_type == VAR_LIST
+           && argvar->vval.v_list != NULL
+           && argvar->vval.v_list->lv_first == &range_list_item))
     {
        emsg(_(e_invarg));
        return NULL;
@@ -538,7 +542,7 @@ term_start(
        }
        else if (argvar->v_type != VAR_LIST
                || argvar->vval.v_list == NULL
-               || argvar->vval.v_list->lv_len < 1
+               || argvar->vval.v_list->lv_len == 0
                || (cmd = tv_get_string_chk(
                               &argvar->vval.v_list->lv_first->li_tv)) == NULL)
            cmd = (char_u*)"";
@@ -3763,9 +3767,9 @@ set_ansi_colors_list(VTerm *vterm, list_T *list)
 {
     int                n = 0;
     long_u     rgb[16];
-    listitem_T *li = list->lv_first;
+    listitem_T *li;
 
-    for (; li != NULL && n < 16; li = li->li_next, n++)
+    for (li = list->lv_first; li != NULL && n < 16; li = li->li_next, n++)
     {
        char_u          *color_name;
        guicolor_T      guicolor;
@@ -3800,6 +3804,7 @@ init_vterm_ansi_colors(VTerm *vterm)
     if (var != NULL
            && (var->di_tv.v_type != VAR_LIST
                || var->di_tv.vval.v_list == NULL
+               || var->di_tv.vval.v_list->lv_first == &range_list_item
                || set_ansi_colors_list(vterm, var->di_tv.vval.v_list) == FAIL))
        semsg(_(e_invarg2), "g:terminal_ansi_colors");
 }
diff --git a/src/testdir/dumps/Test_popup_settext_07.dump b/src/testdir/dumps/Test_popup_settext_07.dump
new file mode 100644 (file)
index 0000000..146dec6
--- /dev/null
@@ -0,0 +1,10 @@
+> +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @35| +0#0000001#ffd7ff255| +0#4040ff13#ffffff0@36
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|E+0#ffffff16#e000002|7|1|5|:| |D|i|c|t|i|o|n|a|r|y| |r|e|q|u|i|r|e|d| +0#0000000#ffffff0@31|0|,|0|-|1| @8|A|l@1| 
index 707db58dd2adfe58186f93a5665b54b6e98297c6..692708beb09daaf52356f22e91ca3a79efa836dd 100644 (file)
@@ -3,11 +3,11 @@
 |3| ||+0#0000001#ffd7ff255|h|e|l@1|o| |b|o|r|d|e|r||| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255|h|e|l@1|o| |p|a|d@1|i|n|g| | +0#0000000#ffffff0@4||| @11||| @16|X+0#0000001#ffd7ff255| +0#0000000#ffffff0
 |4| |++0#0000001#ffd7ff255|-@11|+| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@4||| |h|e|l@1|o| |b|o|t|h| ||| @17|X+0#0000001#ffd7ff255
 |5+0#0000000#ffffff0| @40||| @11||| @17|X+0#0000001#ffd7ff255
-|6+0#0000000#ffffff0| |++0#0000001#ffd7ff255|-@8| +0#0000000#ffffff0@9| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@4|+|-@11|+| @18
-|7| ||+0#0000001#ffd7ff255|b|o|r|d|e|r| |T|L| +0#0000000#ffffff0@9| +0#0000001#ffd7ff255@3|p|a|d@1|i|n|g|s| @2| +0#0000000#ffffff0@37
-|8| @20| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@12||+0#0000001#ffd7ff255| @2|w|r|a|p@1|e|d| |l|o|n|g|e|r| |t|e| @2||
-|9+0#0000000#ffffff0| @20| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@12||+0#0000001#ffd7ff255| @2|x|t| @17||
-|1+0#0000000#ffffff0|0| @72
+|6+0#0000000#ffffff0| |++0#0000001#ffd7ff255|-@8| +0#0000000#ffffff0@9| +0#0000001#ffd7ff255@13| +0#0000000#ffffff0@5|+|-@11|+| @18
+|7| ||+0#0000001#ffd7ff255|b|o|r|d|e|r| |T|L| +0#0000000#ffffff0@9| +0#0000001#ffd7ff255@3|p|a|d@1|i|n|g|s| @1| +0#0000000#ffffff0@38
+|8| @20| +0#0000001#ffd7ff255@13| +0#0000000#ffffff0@13||+0#0000001#ffd7ff255| @2|w|r|a|p@1|e|d| |l|o|n|g|e|r| |t|e| @2||
+|9+0#0000000#ffffff0| @20| +0#0000001#ffd7ff255@13| +0#0000000#ffffff0@13||+0#0000001#ffd7ff255| @2|x|t| @17||
+|1+0#0000000#ffffff0|0| @19| +0#0000001#ffd7ff255@13| +0#0000000#ffffff0@38
 |1@1| @46||+0#0000001#ffd7ff255| @2|r|i|g|h|t| |a|l|i|g|n|e|d| |t|e|x|t| @2||
 |1+0#0000000#ffffff0|2| @72
 |1|3| @72
index 9b6f4d000dbdf16cd2787367d55d377e666ab4d0..6398549db854ec9fb60d808513ec9b33303b8c25 100644 (file)
@@ -3,11 +3,11 @@
 |3| |║+0#0000001#ffd7ff255|h|e|l@1|o| |b|o|r|d|e|r|║| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255|h|e|l@1|o| |p|a|d@1|i|n|g| | +0#0000000#ffffff0@4|║| @11|║| @16|X+0#0000001#ffd7ff255| +0#0000000#ffffff0
 |4| |╚+0#0000001#ffd7ff255|═@11|╝| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@4|║| |h|e|l@1|o| |b|o|t|h| |║| @17|X+0#0000001#ffd7ff255
 |5+0#0000000#ffffff0| @40|║| @11|║| @17|X+0#0000001#ffd7ff255
-|6+0#0000000#ffffff0| |╔+0#0000001#ffd7ff255|═@8| +0#0000000#ffffff0@9| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@4|╚|═@11|╝| @18
-|7| |║+0#0000001#ffd7ff255|b|o|r|d|e|r| |T|L| +0#0000000#ffffff0@9| +0#0000001#ffd7ff255@3|p|a|d@1|i|n|g|s| @2| +0#0000000#ffffff0@37
-|8| @20| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@12|║+0#0000001#ffd7ff255| @2|w|r|a|p@1|e|d| |l|o|n|g|e|r| |t|e| @2|║
-|9+0#0000000#ffffff0| @20| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@12|║+0#0000001#ffd7ff255| @2|x|t| @17|║
-|1+0#0000000#ffffff0|0| @72
+|6+0#0000000#ffffff0| |╔+0#0000001#ffd7ff255|═@8| +0#0000000#ffffff0@9| +0#0000001#ffd7ff255@13| +0#0000000#ffffff0@5|╚|═@11|╝| @18
+|7| |║+0#0000001#ffd7ff255|b|o|r|d|e|r| |T|L| +0#0000000#ffffff0@9| +0#0000001#ffd7ff255@3|p|a|d@1|i|n|g|s| @1| +0#0000000#ffffff0@38
+|8| @20| +0#0000001#ffd7ff255@13| +0#0000000#ffffff0@13|║+0#0000001#ffd7ff255| @2|w|r|a|p@1|e|d| |l|o|n|g|e|r| |t|e| @2|║
+|9+0#0000000#ffffff0| @20| +0#0000001#ffd7ff255@13| +0#0000000#ffffff0@13|║+0#0000001#ffd7ff255| @2|x|t| @17|║
+|1+0#0000000#ffffff0|0| @19| +0#0000001#ffd7ff255@13| +0#0000000#ffffff0@38
 |1@1| @46|║+0#0000001#ffd7ff255| @2|r|i|g|h|t| |a|l|i|g|n|e|d| |t|e|x|t| @2|║
 |1+0#0000000#ffffff0|2| @72
 |1|3| @72
index 595a96358d7d11ed7b6a78f69a10ce96edb307be..6150a0c3e33b2e4f94784e87a738d5fdd82fca75 100644 (file)
@@ -1955,12 +1955,49 @@ func Test_range()
   call setreg('a', range(3))
   call assert_equal("0\n1\n2\n", getreg('a'))
 
+  " settagstack()
+  call settagstack(1, #{items : range(4)})
+  
+  " sign_define()
+  call assert_fails("call sign_define(range(5))", "E715:")
+  call assert_fails("call sign_placelist(range(5))", "E715:")
+
+  " sign_undefine()
+  call assert_fails("call sign_undefine(range(5))", "E908:")
+
+  " sign_unplacelist()
+  call assert_fails("call sign_unplacelist(range(5))", "E715:")
+
   " sort()
   call assert_equal([0, 1, 2, 3, 4, 5], sort(range(5, 0, -1)))
 
+  " 'spellsuggest'
+  func MySuggest()
+    return range(3)
+  endfunc
+  set spell spellsuggest=expr:MySuggest()
+  call assert_equal([], spellsuggest('baord', 3))
+  set nospell spellsuggest&
+
   " string()
   call assert_equal('[0, 1, 2, 3, 4]', string(range(5)))
 
+  " taglist() with 'tagfunc'
+  func TagFunc(pattern, flags, info)
+    return range(10)
+  endfunc
+  set tagfunc=TagFunc
+  call assert_fails("call taglist('asdf')", 'E987:')
+  set tagfunc=
+  
+  " term_start()
+  if has('terminal')
+    call assert_fails('call term_start(range(3, 4))', 'E474:')
+    let g:terminal_ansi_colors = range(16)
+    call assert_fails('call term_start("ls", #{term_finish: "close"})', 'E475:')
+    unlet g:terminal_ansi_colors
+  endif
+
   " type()
   call assert_equal(v:t_list, type(range(5)))
 
index ebcc1f41490d5c6c86ddc5c41c13d392293cf648..75247b5334545cfcf17df384f8d9d7c5ffb19b3c 100644 (file)
@@ -86,7 +86,7 @@ func Test_popup_with_border_and_padding()
          call popup_create('hello padding', #{line: 2, col: 23, padding: []})
          call popup_create('hello both', #{line: 2, col: 43, border: [], padding: [], highlight: 'Normal'})
          call popup_create('border TL', #{line: 6, col: 3, border: [1, 0, 0, 4]})
-         call popup_create('paddings', #{line: 6, col: 23, padding: [1, 3, 2, 4]})
+         call popup_create('paddings', #{line: 6, col: 23, padding: range(1, 4)})
          call popup_create('wrapped longer text', #{line: 8, col: 55, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
          call popup_create('right aligned text', #{line: 11, col: 56, wrap: 0, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
          call popup_create('X', #{line: 2, col: 73})
@@ -180,6 +180,14 @@ func Test_popup_with_border_and_padding()
   call popup_setoptions(winid, options)
   call assert_equal(options, popup_getoptions(winid))
 
+  " Check that range() doesn't crash
+  call popup_setoptions(winid, #{
+       \ padding: range(1, 4),
+       \ border: range(5, 8),
+       \ borderhighlight: range(4),
+       \ borderchars: range(8),
+       \ })
+
   let winid = popup_create('hello both', #{line: 3, col: 8, border: [], padding: []})
   call assert_equal(#{
        \ line: 3,
@@ -883,8 +891,14 @@ func Test_popup_invalid_arguments()
   call popup_clear()
   call assert_fails('call popup_create([#{text: "text", props: ["none"]}], {})', 'E715:')
   call popup_clear()
+  call assert_fails('call popup_create([#{text: "text", props: range(3)}], {})', 'E715:')
+  call popup_clear()
   call assert_fails('call popup_create("text", #{mask: ["asdf"]})', 'E475:')
   call popup_clear()
+  call assert_fails('call popup_create("text", #{mask: range(5)})', 'E475:')
+  call popup_clear()
+  call popup_create("text", #{mask: [range(4)]})
+  call popup_clear()
   call assert_fails('call popup_create("text", #{mask: test_null_list()})', 'E475:')
   call assert_fails('call popup_create("text", #{mapping: []})', 'E745:')
   call popup_clear()
@@ -1331,7 +1345,8 @@ func Test_popup_atcursor_pos()
        normal 3G45|r@
        let winid1 = popup_atcursor(['First', 'SeconD'], #{
              \ pos: 'topright',
-             \ moved: [0, 0, 0],
+             \ moved: range(3),
+             \ mousemoved: range(3),
              \ })
   END
   call writefile(lines, 'XtestPopupAtcursorPos')
@@ -2099,6 +2114,10 @@ func Test_popup_settext()
   call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
   call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
 
+  " range() (doesn't work)
+  call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
+  call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
+
   " clean up
   call StopVimInTerminal(buf)
   call delete('XtestPopupSetText')
index 3d4b1cbcc0b0cb10d653755309ce9f0abea3fffc..8b52a9467951a23e8a99856ab4fa5d8e13fb38cc 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    179,
 /**/
     178,
 /**/