diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-08-22 19:02:02 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-08-22 19:02:02 +0200 |
commit | 5390099a9733f7952a612670693dd4ebf9e0e178 (patch) | |
tree | 8fc26f8bb3da751553e24a0bd2ab916fd221e4cc /src/vim9compile.c | |
parent | 9943b3d97955ece99c747c959e0a7d493bb762bb (diff) | |
download | vim-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.c | 26 |
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); |