diff src/ex_eval.c @ 22555:7d25264c246c v8.2.1826

patch 8.2.1826: Vim9: cannot use a {} block at script level Commit: https://github.com/vim/vim/commit/9becdf2b98e56d5eb193f3413d706ea433269216 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Oct 10 21:33:48 2020 +0200 patch 8.2.1826: Vim9: cannot use a {} block at script level Problem: Vim9: cannot use a {} block at script level. Solution: Recognize a {} block.
author Bram Moolenaar <Bram@vim.org>
date Sat, 10 Oct 2020 21:45:06 +0200
parents 3ed3bed38e0f
children 209c7aa56325
line wrap: on
line diff
--- 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"