summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-06-16 23:18:51 +0200
committerBram Moolenaar <Bram@vim.org>2020-06-16 23:18:51 +0200
commit101f4810e27e432970bc8809e18f018e1795937f (patch)
treee9087cbb9b5d767866fce51696cce626fc21d051
parent0fe937fd8616fcd24b1b1ef2ab9f1657615dd22c (diff)
patch 8.2.0992: Vim9: crash when using :import in the Vim commandv8.2.0992
Problem: Vim9: crash when using :import in the Vim command. Solution: Give an error when using :import outside of a script. (closes #6271)
-rw-r--r--src/testdir/term_util.vim22
-rw-r--r--src/testdir/test_vim9_script.vim20
-rw-r--r--src/version.c2
-rw-r--r--src/vim9script.c12
4 files changed, 44 insertions, 12 deletions
diff --git a/src/testdir/term_util.vim b/src/testdir/term_util.vim
index df7cfa54cf..7c071bb3f8 100644
--- a/src/testdir/term_util.vim
+++ b/src/testdir/term_util.vim
@@ -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
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 9dd950523e..d56b90e2ee 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index 9df09d1f90..c1d8ca027b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 992,
+/**/
991,
/**/
990,
diff --git a/src/vim9script.c b/src/vim9script.c
index cdbcb47e74..442158c48e 100644
--- a/src/vim9script.c
+++ b/src/vim9script.c
@@ -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);
}