# HG changeset patch # User Bram Moolenaar # Date 1592343004 -7200 # Node ID 58137dbee8dab44b5da7ec8c0cd92d63c4d87ef0 # Parent 038888dff2a165e4fe8fa7249ccf15010ad175cf patch 8.2.0992: Vim9: crash when using :import in the Vim command Commit: https://github.com/vim/vim/commit/101f4810e27e432970bc8809e18f018e1795937f Author: Bram Moolenaar Date: Tue Jun 16 23:18:51 2020 +0200 patch 8.2.0992: Vim9: crash when using :import in the Vim command Problem: Vim9: crash when using :import in the Vim command. Solution: Give an error when using :import outside of a script. (closes #6271) diff --git a/src/testdir/term_util.vim b/src/testdir/term_util.vim --- 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, "")) - 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, "")) + 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 --- 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 --- 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 --- 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); }