diff src/ex_eval.c @ 22594:209c7aa56325 v8.2.1845

patch 8.2.1845: Vim9: function defined in a block can't use block variables Commit: https://github.com/vim/vim/commit/8d739de43b84ef7817b3b5b826d1cbfe7572a62a Author: Bram Moolenaar <Bram@vim.org> Date: Wed Oct 14 19:39:19 2020 +0200 patch 8.2.1845: Vim9: function defined in a block can't use block variables Problem: Vim9: function defined in a block can't use variables defined in that block. Solution: First step: Make a second hashtab that holds all script variables, also block-local ones, with more information.
author Bram Moolenaar <Bram@vim.org>
date Wed, 14 Oct 2020 19:45:04 +0200
parents 7d25264c246c
children 107eae953b87
line wrap: on
line diff
--- a/src/ex_eval.c
+++ b/src/ex_eval.c
@@ -914,41 +914,35 @@ enter_block(cstack_T *cstack)
 {
     ++cstack->cs_idx;
     if (in_vim9script())
-	cstack->cs_script_var_len[cstack->cs_idx] =
-			  SCRIPT_ITEM(current_sctx.sc_sid)->sn_var_vals.ga_len;
+    {
+	scriptitem_T *si = SCRIPT_ITEM(current_sctx.sc_sid);
+
+	cstack->cs_script_var_len[cstack->cs_idx] = si->sn_var_vals.ga_len;
+	cstack->cs_block_id[cstack->cs_idx] = ++si->sn_current_block_id;
+    }
 }
 
     static void
 leave_block(cstack_T *cstack)
 {
-    int i;
-
-    if (in_vim9script())
+    if (in_vim9script() && SCRIPT_ID_VALID(current_sctx.sc_sid))
     {
 	scriptitem_T	*si = SCRIPT_ITEM(current_sctx.sc_sid);
-	hashtab_T	*ht = get_script_local_ht();
+	int		i;
 
-	if (ht != NULL)
+	for (i = cstack->cs_script_var_len[cstack->cs_idx];
+					       i < si->sn_var_vals.ga_len; ++i)
 	{
-	    for (i = cstack->cs_script_var_len[cstack->cs_idx];
-					       i < si->sn_var_vals.ga_len; ++i)
-	    {
-		svar_T	*sv = ((svar_T *)si->sn_var_vals.ga_data) + i;
-		hashitem_T	*hi;
+	    svar_T	*sv = ((svar_T *)si->sn_var_vals.ga_data) + i;
 
-		if (sv->sv_name != NULL)
-		{
-		    // Remove a variable declared inside the block, if it still
-		    // exists.
-		    hi = hash_find(ht, sv->sv_name);
-		    if (!HASHITEM_EMPTY(hi))
-		    {
-			delete_var(ht, hi);
-			sv->sv_name = NULL;
-		    }
-		}
-	    }
+	    if (sv->sv_name != NULL)
+		// Remove a variable declared inside the block, if it still
+		// exists, from sn_vars and move the value into sn_all_vars.
+		hide_script_var(si, sv);
 	}
+
+	// TODO: is this needed?
+	cstack->cs_script_var_len[cstack->cs_idx] = si->sn_var_vals.ga_len;
     }
     --cstack->cs_idx;
 }