]> granicus.if.org Git - vim/commitdiff
patch 8.2.0992: Vim9: crash when using :import in the Vim command v8.2.0992
authorBram Moolenaar <Bram@vim.org>
Tue, 16 Jun 2020 21:18:51 +0000 (23:18 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 16 Jun 2020 21:18:51 +0000 (23:18 +0200)
Problem:    Vim9: crash when using :import in the Vim command.
Solution:   Give an error when using :import outside of a script.
            (closes #6271)

src/testdir/term_util.vim
src/testdir/test_vim9_script.vim
src/version.c
src/vim9script.c

index df7cfa54cf46d9e201787d57205b4da47c7442c1..7c071bb3f86322399c73744d9ed1eaede8b1edcb 100644 (file)
@@ -107,16 +107,18 @@ func RunVimInTerminal(arguments, options)
 
   call TermWait(buf)
 
-  " Wait for "All" or "Top" of the ruler to be shown in the last line or in
-  " the status line of the last window. This can be quite slow (e.g. when
-  " using valgrind).
-  " If it fails then show the terminal contents for debugging.
-  try
-    call WaitFor({-> len(term_getline(buf, rows)) >= cols - 1 || len(term_getline(buf, rows - statusoff)) >= cols - 1})
-  catch /timed out after/
-    let lines = map(range(1, rows), {key, val -> term_getline(buf, val)})
-    call assert_report('RunVimInTerminal() failed, screen contents: ' . join(lines, "<NL>"))
-  endtry
+  if get(a:options, 'wait_for_ruler', 1)
+    " Wait for "All" or "Top" of the ruler to be shown in the last line or in
+    " the status line of the last window. This can be quite slow (e.g. when
+    " using valgrind).
+    " If it fails then show the terminal contents for debugging.
+    try
+      call WaitFor({-> len(term_getline(buf, rows)) >= cols - 1 || len(term_getline(buf, rows - statusoff)) >= cols - 1})
+    catch /timed out after/
+      let lines = map(range(1, rows), {key, val -> term_getline(buf, val)})
+      call assert_report('RunVimInTerminal() failed, screen contents: ' . join(lines, "<NL>"))
+    endtry
+  endif
 
   " Starting a terminal to run Vim is always considered flaky.
   let g:test_is_flaky = 1
index 9dd950523ec100666d55865e6ec266479c90faa4..d56b90e2ee9ed7b2a6990f5291ec1622cdfd88e2 100644 (file)
@@ -1,6 +1,7 @@
 " Test various aspects of the Vim9 script language.
 
 source check.vim
+source term_util.vim
 source view_util.vim
 source vim9.vim
 
@@ -777,6 +778,25 @@ def Test_vim9script_fails()
   assert_fails('export something', 'E1043')
 enddef
 
+def Test_import_fails_without_script()
+  CheckRunVimInTerminal
+
+  let export =<< trim END
+    vim9script
+    export def Foo(): number
+        return 0
+    enddef
+  END
+  writefile(export, 'Xexport.vim')
+
+  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
+                rows: 6, wait_for_ruler: 0})
+  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
+
+  delete('Xexport.vim')
+  StopVimInTerminal(buf)
+enddef
+
 def Test_vim9script_reload_import()
   let lines =<< trim END
     vim9script
index 9df09d1f9052ed1f85f03ac2205545af20a73e37..c1d8ca027b88ff12a89f3a912b69e9811c395e3b 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    992,
 /**/
     991,
 /**/
index cdbcb47e742603b22fd5beef770fe770ed82ab05..442158c48e6531ba299ee4e02140e86517758fce 100644 (file)
@@ -32,13 +32,14 @@ in_vim9script(void)
     void
 ex_vim9script(exarg_T *eap)
 {
-    scriptitem_T    *si = SCRIPT_ITEM(current_sctx.sc_sid);
+    scriptitem_T    *si;
 
     if (!getline_equal(eap->getline, eap->cookie, getsourceline))
     {
        emsg(_("E1038: vim9script can only be used in a script"));
        return;
     }
+    si = SCRIPT_ITEM(current_sctx.sc_sid);
     if (si->sn_had_command)
     {
        emsg(_("E1039: vim9script must be the first command in a script"));
@@ -141,8 +142,15 @@ free_imports(int sid)
     void
 ex_import(exarg_T *eap)
 {
-    char_u *cmd_end = handle_import(eap->arg, NULL, current_sctx.sc_sid, NULL);
+    char_u *cmd_end;
+
+    if (!getline_equal(eap->getline, eap->cookie, getsourceline))
+    {
+       emsg(_("E1094: import can only be used in a script"));
+       return;
+    }
 
+    cmd_end = handle_import(eap->arg, NULL, current_sctx.sc_sid, NULL);
     if (cmd_end != NULL)
        eap->nextcmd = check_nextcmd(cmd_end);
 }