]> granicus.if.org Git - vim/commitdiff
patch 8.2.4006: Vim9: crash when declaring variable on the command line v8.2.4006
authorBram Moolenaar <Bram@vim.org>
Wed, 5 Jan 2022 10:16:30 +0000 (10:16 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 5 Jan 2022 10:16:30 +0000 (10:16 +0000)
Problem:    Vim9: crash when declaring variable on the command line.
Solution:   Use a temporary type list. (closes #9474)

src/eval.c
src/testdir/test_vim9_assign.vim
src/version.c

index a99d149a0f31e83de59060074e5b23656fe2a54b..2e370c1b2f7ef6045e1490a50553eec28dafc4da 100644 (file)
@@ -889,8 +889,9 @@ get_lval(
            }
            if (*p == ':')
            {
-               scriptitem_T *si = SCRIPT_ITEM(current_sctx.sc_sid);
-               char_u       *tp = skipwhite(p + 1);
+               garray_T    tmp_type_list;
+               garray_T    *type_list;
+               char_u      *tp = skipwhite(p + 1);
 
                if (tp == p + 1 && !quiet)
                {
@@ -898,11 +899,26 @@ get_lval(
                    return NULL;
                }
 
+               if (SCRIPT_ID_VALID(current_sctx.sc_sid))
+                   type_list = &SCRIPT_ITEM(current_sctx.sc_sid)->sn_type_list;
+               else
+               {
+                   type_list = &tmp_type_list;
+                   ga_init2(type_list, sizeof(type_T), 10);
+               }
+
                // parse the type after the name
-               lp->ll_type = parse_type(&tp, &si->sn_type_list, !quiet);
+               lp->ll_type = parse_type(&tp, type_list, !quiet);
                if (lp->ll_type == NULL && !quiet)
                    return NULL;
                lp->ll_name_end = tp;
+
+               // drop the type when not in a script
+               if (type_list == &tmp_type_list)
+               {
+                   lp->ll_type = NULL;
+                   clear_type_list(type_list);
+               }
            }
        }
     }
index c91cd6547379c0fc263602eb83d84c9966aa3a77..209ac95f843c80f239e38398592f9e6b19923dd4 100644 (file)
@@ -2,6 +2,7 @@
 
 source check.vim
 source vim9.vim
+source term_util.vim
 
 let s:appendToMe = 'xxx'
 let s:addToMe = 111
@@ -2281,6 +2282,23 @@ def Test_abort_after_error()
   delete('Xtestscript')
 enddef
 
+func Test_declare_command_line()
+  CheckRunVimInTerminal
+  call Run_Test_declare_command_line()
+endfunc
+
+def Run_Test_declare_command_line()
+  # On the command line the type is parsed but not used.
+  # To get rid of the script context have to run this in another Vim instance.
+  var buf = RunVimInTerminal('', {'rows': 6})
+  term_sendkeys(buf, ":vim9 var abc: list<list<number>> = [ [1, 2, 3], [4, 5, 6] ]\<CR>")
+  TermWait(buf)
+  term_sendkeys(buf, ":echo abc\<CR>")
+  TermWait(buf)
+  WaitForAssert(() => assert_match('\[\[1, 2, 3\], \[4, 5, 6\]\]', term_getline(buf, 6)))
+  StopVimInTerminal(buf)
+enddef
+
 
 
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
index 9f17657fe1b6c69ea85f8395785e896986f2af45..ad0d49e5d6b13c8e1529ae88077ebc53fe779be3 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4006,
 /**/
     4005,
 /**/