summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-19 21:20:49 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-19 21:20:49 +0200
commit191929b182ba38abe6bc431fb9d8d9507f408903 (patch)
tree6b3f1b39993d579f1cefa0f29a173d883860f1ac
parent9dc1917f42b23277e143fc58bbe27482b0b76bad (diff)
patch 8.2.1489: Vim9: error when setting an option with setbufvar()v8.2.1489
Problem: Vim9: error when setting an option with setbufvar(). Solution: Do not get a number from a string value. (closes #6740)
-rw-r--r--src/evalvars.c41
-rw-r--r--src/testdir/test_vim9_func.vim12
-rw-r--r--src/version.c2
3 files changed, 34 insertions, 21 deletions
diff --git a/src/evalvars.c b/src/evalvars.c
index f59dde9c69..bff6086e53 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -3293,6 +3293,24 @@ getwinvar(
}
/*
+ * Set option "varname" to the value of "varp" for the current buffer/window.
+ */
+ static void
+set_option_from_tv(char_u *varname, typval_T *varp)
+{
+ long numval = 0;
+ char_u *strval;
+ char_u nbuf[NUMBUFLEN];
+ int error = FALSE;
+
+ if (!in_vim9script() || varp->v_type != VAR_STRING)
+ numval = (long)tv_get_number_chk(varp, &error);
+ strval = tv_get_string_buf_chk(varp, nbuf);
+ if (!error && strval != NULL)
+ set_option_value(varname, numval, strval, OPT_LOCAL);
+}
+
+/*
* "setwinvar()" and "settabwinvar()" functions
*/
static void
@@ -3304,7 +3322,6 @@ setwinvar(typval_T *argvars, int off)
int need_switch_win;
char_u *varname, *winvarname;
typval_T *varp;
- char_u nbuf[NUMBUFLEN];
tabpage_T *tp = NULL;
if (check_secure())
@@ -3325,17 +3342,7 @@ setwinvar(typval_T *argvars, int off)
|| switch_win(&save_curwin, &save_curtab, win, tp, TRUE) == OK)
{
if (*varname == '&')
- {
- long numval;
- char_u *strval;
- int error = FALSE;
-
- ++varname;
- numval = (long)tv_get_number_chk(varp, &error);
- strval = tv_get_string_buf_chk(varp, nbuf);
- if (!error && strval != NULL)
- set_option_value(varname, numval, strval, OPT_LOCAL);
- }
+ set_option_from_tv(varname + 1, varp);
else
{
winvarname = alloc(STRLEN(varname) + 3);
@@ -3759,7 +3766,6 @@ f_setbufvar(typval_T *argvars, typval_T *rettv UNUSED)
buf_T *buf;
char_u *varname, *bufvarname;
typval_T *varp;
- char_u nbuf[NUMBUFLEN];
if (check_secure())
return;
@@ -3772,19 +3778,12 @@ f_setbufvar(typval_T *argvars, typval_T *rettv UNUSED)
{
if (*varname == '&')
{
- long numval;
- char_u *strval;
- int error = FALSE;
aco_save_T aco;
// set curbuf to be our buf, temporarily
aucmd_prepbuf(&aco, buf);
- ++varname;
- numval = (long)tv_get_number_chk(varp, &error);
- strval = tv_get_string_buf_chk(varp, nbuf);
- if (!error && strval != NULL)
- set_option_value(varname, numval, strval, OPT_LOCAL);
+ set_option_from_tv(varname + 1, varp);
// reset notion of buffer
aucmd_restbuf(&aco);
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index ad59844d54..1f0fd1c8a3 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -1391,6 +1391,18 @@ def Test_readdir()
eval expand('.')->readdirex({e -> e.name[0] !=# '.'})
enddef
+def Test_setbufvar()
+ setbufvar(bufnr('%'), '&syntax', 'vim')
+ assert_equal('vim', &syntax)
+ setbufvar(bufnr('%'), '&ts', 16)
+ assert_equal(16, &ts)
+ settabwinvar(1, 1, '&syntax', 'vam')
+ assert_equal('vam', &syntax)
+ settabwinvar(1, 1, '&ts', 15)
+ assert_equal(15, &ts)
+ setlocal ts=8
+enddef
+
def Fibonacci(n: number): number
if n < 2
return n
diff --git a/src/version.c b/src/version.c
index d6d197303a..b281a4728b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1489,
+/**/
1488,
/**/
1487,