0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.2.1489: Vim9: error when setting an option with setbufvar()

Problem:    Vim9: error when setting an option with setbufvar().
Solution:   Do not get a number from a string value. (closes #6740)
This commit is contained in:
Bram Moolenaar
2020-08-19 21:20:49 +02:00
parent 9dc1917f42
commit 191929b182
3 changed files with 34 additions and 21 deletions

View File

@@ -3292,6 +3292,24 @@ getwinvar(
--emsg_off; --emsg_off;
} }
/*
* 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 * "setwinvar()" and "settabwinvar()" functions
*/ */
@@ -3304,7 +3322,6 @@ setwinvar(typval_T *argvars, int off)
int need_switch_win; int need_switch_win;
char_u *varname, *winvarname; char_u *varname, *winvarname;
typval_T *varp; typval_T *varp;
char_u nbuf[NUMBUFLEN];
tabpage_T *tp = NULL; tabpage_T *tp = NULL;
if (check_secure()) if (check_secure())
@@ -3325,17 +3342,7 @@ setwinvar(typval_T *argvars, int off)
|| switch_win(&save_curwin, &save_curtab, win, tp, TRUE) == OK) || switch_win(&save_curwin, &save_curtab, win, tp, TRUE) == OK)
{ {
if (*varname == '&') if (*varname == '&')
{ set_option_from_tv(varname + 1, varp);
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);
}
else else
{ {
winvarname = alloc(STRLEN(varname) + 3); winvarname = alloc(STRLEN(varname) + 3);
@@ -3759,7 +3766,6 @@ f_setbufvar(typval_T *argvars, typval_T *rettv UNUSED)
buf_T *buf; buf_T *buf;
char_u *varname, *bufvarname; char_u *varname, *bufvarname;
typval_T *varp; typval_T *varp;
char_u nbuf[NUMBUFLEN];
if (check_secure()) if (check_secure())
return; return;
@@ -3772,19 +3778,12 @@ f_setbufvar(typval_T *argvars, typval_T *rettv UNUSED)
{ {
if (*varname == '&') if (*varname == '&')
{ {
long numval;
char_u *strval;
int error = FALSE;
aco_save_T aco; aco_save_T aco;
// set curbuf to be our buf, temporarily // set curbuf to be our buf, temporarily
aucmd_prepbuf(&aco, buf); aucmd_prepbuf(&aco, buf);
++varname; set_option_from_tv(varname + 1, varp);
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);
// reset notion of buffer // reset notion of buffer
aucmd_restbuf(&aco); aucmd_restbuf(&aco);

View File

@@ -1391,6 +1391,18 @@ def Test_readdir()
eval expand('.')->readdirex({e -> e.name[0] !=# '.'}) eval expand('.')->readdirex({e -> e.name[0] !=# '.'})
enddef 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 def Fibonacci(n: number): number
if n < 2 if n < 2
return n return n

View File

@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1489,
/**/ /**/
1488, 1488,
/**/ /**/