diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-06-16 23:18:51 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-06-16 23:18:51 +0200 |
commit | 101f4810e27e432970bc8809e18f018e1795937f (patch) | |
tree | e9087cbb9b5d767866fce51696cce626fc21d051 /src | |
parent | 0fe937fd8616fcd24b1b1ef2ab9f1657615dd22c (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)
Diffstat (limited to 'src')
-rw-r--r-- | src/testdir/term_util.vim | 22 | ||||
-rw-r--r-- | src/testdir/test_vim9_script.vim | 20 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9script.c | 12 |
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); } |