summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-28 20:07:27 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-28 20:07:27 +0200
commitae616494d77e9930da703d65d12ac0abf6dc425f (patch)
tree37e2efd1d06148df39dd02f64c5d7136d0b1eba9 /src
parent0aac67a4314d72a29d3fbee91b6f0ba89e950462 (diff)
patch 8.2.1308: Vim9: accidentally using "x" causes Vim to exitv8.2.1308
Problem: Vim9: accidentally using "x" causes Vim to exit. Solution: Disallow using ":x" or "xit" in Vim9 script. (closes #6399)
Diffstat (limited to 'src')
-rw-r--r--src/ex_cmds.c6
-rw-r--r--src/ex_docmd.c2
-rw-r--r--src/proto/vim9script.pro1
-rw-r--r--src/testdir/test_vim9_script.vim15
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c7
-rw-r--r--src/vim9script.c21
7 files changed, 52 insertions, 2 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index e8e38aa97a..895912f419 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -3176,6 +3176,9 @@ ex_append(exarg_T *eap)
int vcol;
int empty = (curbuf->b_ml.ml_flags & ML_EMPTY);
+ if (not_in_vim9(eap) == FAIL)
+ return;
+
// the ! flag toggles autoindent
if (eap->forceit)
curbuf->b_p_ai = !curbuf->b_p_ai;
@@ -3317,6 +3320,9 @@ ex_change(exarg_T *eap)
{
linenr_T lnum;
+ if (not_in_vim9(eap) == FAIL)
+ return;
+
if (eap->line2 >= eap->line1
&& u_save(eap->line1 - 1, eap->line2 + 1) == FAIL)
return;
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 987e92dea9..fe654104da 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -5686,6 +5686,8 @@ ex_stop(exarg_T *eap)
static void
ex_exit(exarg_T *eap)
{
+ if (not_in_vim9(eap) == FAIL)
+ return;
#ifdef FEAT_CMDWIN
if (cmdwin_type != 0)
{
diff --git a/src/proto/vim9script.pro b/src/proto/vim9script.pro
index 6a32abdcac..f8b12ee5de 100644
--- a/src/proto/vim9script.pro
+++ b/src/proto/vim9script.pro
@@ -1,6 +1,7 @@
/* vim9script.c */
int in_vim9script(void);
void ex_vim9script(exarg_T *eap);
+int not_in_vim9(exarg_T *eap);
void ex_export(exarg_T *eap);
void free_imports(int sid);
void ex_import(exarg_T *eap);
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index ac76e8d5bc..379245f397 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -1515,6 +1515,21 @@ def Test_fixed_size_list()
assert_equal([2, 99, 3, 4, 5], l)
enddef
+def Test_no_insert_xit()
+ call CheckDefExecFailure(['x = 1'], 'E1100:')
+ call CheckDefExecFailure(['a = 1'], 'E1100:')
+ call CheckDefExecFailure(['i = 1'], 'E1100:')
+ call CheckDefExecFailure(['c = 1'], 'E1100:')
+
+ CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
+ CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
+ CheckScriptFailure(['vim9script', 'a'], 'E1100:')
+ CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
+ CheckScriptFailure(['vim9script', 'i'], 'E1100:')
+ CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
+ CheckScriptFailure(['vim9script', 'c'], 'E1100:')
+enddef
+
def IfElse(what: number): string
let res = ''
if what == 1
diff --git a/src/version.c b/src/version.c
index 78aafb8e3e..710c570604 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 */
/**/
+ 1308,
+/**/
1307,
/**/
1306,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 1ed3211463..cbb9231d8c 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -7409,6 +7409,13 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
// TODO: other commands with an expression argument
+ case CMD_append:
+ case CMD_change:
+ case CMD_insert:
+ case CMD_xit:
+ not_in_vim9(&ea);
+ goto erret;
+
case CMD_SIZE:
semsg(_("E476: Invalid command: %s"), ea.cmd);
goto erret;
diff --git a/src/vim9script.c b/src/vim9script.c
index 784283ef97..7d783ea934 100644
--- a/src/vim9script.c
+++ b/src/vim9script.c
@@ -59,12 +59,29 @@ ex_vim9script(exarg_T *eap)
}
/*
+ * When in Vim9 script give an error and return FAIL.
+ */
+ int
+not_in_vim9(exarg_T *eap)
+{
+ switch (eap->cmdidx)
+ {
+ case CMD_insert:
+ case CMD_append:
+ case CMD_change:
+ case CMD_xit:
+ semsg(_("E1100: Missing :let: %s"), eap->cmd);
+ return FAIL;
+ default: break;
+ }
+ return OK;
+}
+
+/*
* ":export let Name: type"
* ":export const Name: type"
* ":export def Name(..."
* ":export class Name ..."
- *
- * ":export {Name, ...}"
*/
void
ex_export(exarg_T *eap)