summaryrefslogtreecommitdiff
path: root/src/vim9compile.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-22 19:02:02 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-22 19:02:02 +0200
commit5390099a9733f7952a612670693dd4ebf9e0e178 (patch)
tree8fc26f8bb3da751553e24a0bd2ab916fd221e4cc /src/vim9compile.c
parent9943b3d97955ece99c747c959e0a7d493bb762bb (diff)
downloadvim-git-5390099a9733f7952a612670693dd4ebf9e0e178.tar.gz
patch 8.2.1510: using "var" in :def function may refer to legacy script varv8.2.1510
Problem: Using "var" in a :def function may refer to a legacy Vim script variable. Solution: Require using "s:" to refer to a legacy Vim script variable. (closes #6771)
Diffstat (limited to 'src/vim9compile.c')
-rw-r--r--src/vim9compile.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/vim9compile.c b/src/vim9compile.c
index a552c8512..e4b7d44ad 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -260,15 +260,20 @@ lookup_arg(
/*
* Lookup a variable in the current script.
+ * If "vim9script" is TRUE the script must be Vim9 script. Used for "var"
+ * without "s:".
* Returns OK or FAIL.
*/
static int
-lookup_script(char_u *name, size_t len)
+lookup_script(char_u *name, size_t len, int vim9script)
{
int cc;
hashtab_T *ht = &SCRIPT_VARS(current_sctx.sc_sid);
dictitem_T *di;
+ if (vim9script && SCRIPT_ITEM(current_sctx.sc_sid)->sn_version
+ != SCRIPT_VERSION_VIM9)
+ return FAIL;
cc = name[len];
name[len] = NUL;
di = find_var_in_ht(ht, 0, name, TRUE);
@@ -287,7 +292,7 @@ check_defined(char_u *p, size_t len, cctx_T *cctx)
int c = p[len];
p[len] = NUL;
- if (lookup_script(p, len) == OK
+ if (lookup_script(p, len, FALSE) == OK
|| (cctx != NULL
&& (lookup_local(p, len, cctx) != NULL
|| lookup_arg(p, len, NULL, NULL, NULL, cctx) == OK))
@@ -2145,15 +2150,14 @@ compile_load(char_u **arg, char_u *end_arg, cctx_T *cctx, int error)
else
{
// "var" can be script-local even without using "s:" if it
- // already exists.
- if (SCRIPT_ITEM(current_sctx.sc_sid)->sn_version
- == SCRIPT_VERSION_VIM9
- || lookup_script(*arg, len) == OK)
- res = compile_load_scriptvar(cctx, name, *arg, &end,
- FALSE);
+ // already exists in a Vim9 script or when it's imported.
+ if (lookup_script(*arg, len, TRUE) == OK
+ || find_imported(name, 0, cctx) != NULL)
+ res = compile_load_scriptvar(cctx, name, *arg, &end, FALSE);
// When the name starts with an uppercase letter or "x:" it
// can be a user defined function.
+ // TODO: this is just guessing
if (res == FAIL && (ASCII_ISUPPER(*name) || name[1] == ':'))
res = generate_funcref(cctx, name);
}
@@ -4697,8 +4701,8 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
int script_namespace = varlen > 1
&& STRNCMP(var_start, "s:", 2) == 0;
int script_var = (script_namespace
- ? lookup_script(var_start + 2, varlen - 2)
- : lookup_script(var_start, varlen)) == OK;
+ ? lookup_script(var_start + 2, varlen - 2, FALSE)
+ : lookup_script(var_start, varlen, TRUE)) == OK;
imported_T *import =
find_imported(var_start, varlen, cctx);
@@ -6637,7 +6641,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
|| lookup_local(ea.cmd, len, &cctx) != NULL
|| lookup_arg(ea.cmd, len, NULL, NULL,
NULL, &cctx) == OK
- || lookup_script(ea.cmd, len) == OK
+ || lookup_script(ea.cmd, len, FALSE) == OK
|| find_imported(ea.cmd, len, &cctx) != NULL)
{
line = compile_assignment(ea.cmd, &ea, CMD_SIZE, &cctx);