summaryrefslogtreecommitdiffstats
path: root/src/ex_eval.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-10-10 21:33:48 +0200
committerBram Moolenaar <Bram@vim.org>2020-10-10 21:33:48 +0200
commit9becdf2b98e56d5eb193f3413d706ea433269216 (patch)
tree5733bdcc5289fed0156acb11d6e9e32bef266a06 /src/ex_eval.c
parentd747548c664815bb6e8520afa90b6108e1997591 (diff)
patch 8.2.1826: Vim9: cannot use a {} block at script levelv8.2.1826
Problem: Vim9: cannot use a {} block at script level. Solution: Recognize a {} block.
Diffstat (limited to 'src/ex_eval.c')
-rw-r--r--src/ex_eval.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/src/ex_eval.c b/src/ex_eval.c
index d205cafc47..57c6178727 100644
--- a/src/ex_eval.c
+++ b/src/ex_eval.c
@@ -1002,7 +1002,7 @@ ex_endif(exarg_T *eap)
did_endif = TRUE;
if (cstack->cs_idx < 0
|| (cstack->cs_flags[cstack->cs_idx]
- & (CSF_WHILE | CSF_FOR | CSF_TRY)))
+ & (CSF_WHILE | CSF_FOR | CSF_TRY | CSF_BLOCK)))
eap->errmsg = _(e_endif_without_if);
else
{
@@ -1043,7 +1043,7 @@ ex_else(exarg_T *eap)
if (cstack->cs_idx < 0
|| (cstack->cs_flags[cstack->cs_idx]
- & (CSF_WHILE | CSF_FOR | CSF_TRY)))
+ & (CSF_WHILE | CSF_FOR | CSF_TRY | CSF_BLOCK)))
{
if (eap->cmdidx == CMD_else)
{
@@ -1375,6 +1375,37 @@ ex_endwhile(exarg_T *eap)
}
}
+/*
+ * "{" start of a block in Vim9 script
+ */
+ void
+ex_block(exarg_T *eap)
+{
+ cstack_T *cstack = eap->cstack;
+
+ if (cstack->cs_idx == CSTACK_LEN - 1)
+ eap->errmsg = _("E579: block nesting too deep");
+ else
+ {
+ enter_block(cstack);
+ cstack->cs_flags[cstack->cs_idx] = CSF_BLOCK | CSF_ACTIVE | CSF_TRUE;
+ }
+}
+
+/*
+ * "}" end of a block in Vim9 script
+ */
+ void
+ex_endblock(exarg_T *eap)
+{
+ cstack_T *cstack = eap->cstack;
+
+ if (cstack->cs_idx < 0
+ || (cstack->cs_flags[cstack->cs_idx] & CSF_BLOCK) == 0)
+ eap->errmsg = _(e_endblock_without_block);
+ else
+ leave_block(cstack);
+}
/*
* ":throw expr"