summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/testdir/test_vim9_disassemble.vim5
-rw-r--r--src/testdir/test_vim9_script.vim5
-rw-r--r--src/version.c2
-rw-r--r--src/vim9.h1
-rw-r--r--src/vim9compile.c11
-rw-r--r--src/vim9execute.c8
6 files changed, 27 insertions, 5 deletions
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index 7f6d86a56..781495278 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 568338b27..4b7339961 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 89021265a..7af2e50e5 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 64749ce1b..a75e1752c 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 c4a5c08d8..daa1cbea4 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 e6758698c..6c8b8c86e 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));