diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-04-19 18:27:26 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-04-19 18:27:26 +0200 |
commit | 7bdaea6e0df849cf3dd7eaaf454eb88f637d1884 (patch) | |
tree | fb91b5cbe233e4fe9ab0b52a7851a6f47c5cd84c | |
parent | eb58a2465825c258beafae96240824923f73779f (diff) |
patch 8.2.0605: Vim9: cannot unlet an environment variablev8.2.0605
Problem: Vim9: cannot unlet an environment variable.
Solution: Implement unlet for $VAR.
-rw-r--r-- | src/testdir/test_vim9_disassemble.vim | 5 | ||||
-rw-r--r-- | src/testdir/test_vim9_script.vim | 5 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9.h | 1 | ||||
-rw-r--r-- | src/vim9compile.c | 11 | ||||
-rw-r--r-- | src/vim9execute.c | 8 |
6 files changed, 27 insertions, 5 deletions
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim index 7f6d86a56e..7814952789 100644 --- a/src/testdir/test_vim9_disassemble.vim +++ b/src/testdir/test_vim9_disassemble.vim @@ -130,6 +130,7 @@ def s:ScriptFuncUnlet() g:somevar = "value" unlet g:somevar unlet! g:somevar + unlet $SOMEVAR enddef def Test_disassemble_unlet() @@ -141,7 +142,9 @@ def Test_disassemble_unlet() 'unlet g:somevar.*' .. '\d UNLET g:somevar.*' .. 'unlet! g:somevar.*' .. - '\d UNLET! g:somevar.*', + '\d UNLET! g:somevar.*' .. + 'unlet $SOMEVAR.*' .. + '\d UNLETENV $SOMEVAR.*', res) enddef diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 568338b27b..4b7339961f 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -289,6 +289,11 @@ def Test_unlet() ' unlet s:svar', 'enddef', ], 'E1081:') + + $ENVVAR = 'foobar' + assert_equal('foobar', $ENVVAR) + unlet $ENVVAR + assert_equal('', $ENVVAR) enddef func Test_wrong_type() diff --git a/src/version.c b/src/version.c index 89021265ab..7af2e50e5a 100644 --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 605, +/**/ 604, /**/ 603, diff --git a/src/vim9.h b/src/vim9.h index 64749ce1b5..a75e1752cd 100644 --- a/src/vim9.h +++ b/src/vim9.h @@ -45,6 +45,7 @@ typedef enum { ISN_STORENR, // store number into local variable isn_arg.storenr.stnr_idx ISN_UNLET, // unlet variable isn_arg.unlet.ul_name + ISN_UNLETENV, // unlet environment variable isn_arg.unlet.ul_name // constants ISN_PUSHNR, // push number isn_arg.number diff --git a/src/vim9compile.c b/src/vim9compile.c index c4a5c08d89..daa1cbea41 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -990,12 +990,12 @@ generate_LOADV( * Generate an ISN_UNLET instruction. */ static int -generate_UNLET(cctx_T *cctx, char_u *name, int forceit) +generate_UNLET(cctx_T *cctx, isntype_T isn_type, char_u *name, int forceit) { isn_T *isn; RETURN_OK_IF_SKIP(cctx); - if ((isn = generate_instr(cctx, ISN_UNLET)) == NULL) + if ((isn = generate_instr(cctx, isn_type)) == NULL) return FAIL; isn->isn_arg.unlet.ul_name = vim_strsave(name); isn->isn_arg.unlet.ul_forceit = forceit; @@ -4594,10 +4594,12 @@ compile_unlet( // Normal name. Only supports g:, w:, t: and b: namespaces. *name_end = NUL; - if (check_vim9_unlet(p) == FAIL) + if (*p == '$') + ret = generate_UNLET(cctx, ISN_UNLETENV, p + 1, eap->forceit); + else if (check_vim9_unlet(p) == FAIL) ret = FAIL; else - ret = generate_UNLET(cctx, p, eap->forceit); + ret = generate_UNLET(cctx, ISN_UNLET, p, eap->forceit); *name_end = cc; return ret; @@ -6363,6 +6365,7 @@ delete_instr(isn_T *isn) break; case ISN_UNLET: + case ISN_UNLETENV: vim_free(isn->isn_arg.unlet.ul_name); break; diff --git a/src/vim9execute.c b/src/vim9execute.c index e6758698c4..6c8b8c86ea 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1073,6 +1073,9 @@ call_def_function( iptr->isn_arg.unlet.ul_forceit) == FAIL) goto failed; break; + case ISN_UNLETENV: + vim_unsetenv(iptr->isn_arg.unlet.ul_name); + break; // create a list from items on the stack; uses a single allocation // for the list header and the items @@ -2119,6 +2122,11 @@ ex_disassemble(exarg_T *eap) iptr->isn_arg.unlet.ul_forceit ? "!" : "", iptr->isn_arg.unlet.ul_name); break; + case ISN_UNLETENV: + smsg("%4d UNLETENV%s $%s", current, + iptr->isn_arg.unlet.ul_forceit ? "!" : "", + iptr->isn_arg.unlet.ul_name); + break; case ISN_NEWLIST: smsg("%4d NEWLIST size %lld", current, (long long)(iptr->isn_arg.number)); |