Mercurial > vim
diff src/vim9compile.c @ 21598:7b5b9558500a v8.2.1349
patch 8.2.1349: Vim9: can define a function with the name of an import
Commit: https://github.com/vim/vim/commit/eef2102e20d24f5fbd1c9f53c7a35df61585c5ab
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Aug 1 22:16:43 2020 +0200
patch 8.2.1349: Vim9: can define a function with the name of an import
Problem: Vim9: can define a function with the name of an import.
Solution: Disallow using an existing name. (closes https://github.com/vim/vim/issues/6585)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 01 Aug 2020 22:30:04 +0200 |
parents | d0c76ce48326 |
children | 7028f45bf0ea |
line wrap: on
line diff
--- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -294,9 +294,10 @@ check_defined(char_u *p, size_t len, cct if (lookup_script(p, len) == OK || (cctx != NULL && (lookup_local(p, len, cctx) != NULL - || find_imported(p, len, cctx) != NULL))) - { - semsg("E1073: imported name already defined: %s", p); + || lookup_arg(p, len, NULL, NULL, NULL, cctx) == OK)) + || find_imported(p, len, cctx) != NULL) + { + semsg(_(e_already_defined), p); return FAIL; } return OK; @@ -4899,17 +4900,21 @@ compile_nested_function(exarg_T *eap, cc int is_global = *eap->arg == 'g' && eap->arg[1] == ':'; char_u *name_start = eap->arg; char_u *name_end = to_name_end(eap->arg, is_global); - char_u *name = get_lambda_name(); + char_u *lambda_name; lvar_T *lvar; ufunc_T *ufunc; int r; + if (check_defined(name_start, name_end - name_start, cctx) == FAIL) + return NULL; + eap->arg = name_end; eap->getline = exarg_getline; eap->cookie = cctx; eap->skip = cctx->ctx_skip == SKIP_YES; eap->forceit = FALSE; - ufunc = def_function(eap, name); + lambda_name = get_lambda_name(); + ufunc = def_function(eap, lambda_name); if (ufunc == NULL) return NULL; @@ -4925,13 +4930,15 @@ compile_nested_function(exarg_T *eap, cc if (func_name == NULL) r = FAIL; else - r = generate_NEWFUNC(cctx, name, func_name); + r = generate_NEWFUNC(cctx, lambda_name, func_name); } else { // Define a local variable for the function reference. lvar = reserve_local(cctx, name_start, name_end - name_start, TRUE, ufunc->uf_func_type); + if (lvar == NULL) + return NULL; if (generate_FUNCREF(cctx, ufunc->uf_dfunc_idx) == FAIL) return NULL; r = generate_STORE(cctx, ISN_STORE, lvar->lv_idx, NULL);