From 191929b182ba38abe6bc431fb9d8d9507f408903 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 19 Aug 2020 21:20:49 +0200 Subject: 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) --- src/evalvars.c | 41 ++++++++++++++++++++--------------------- src/testdir/test_vim9_func.vim | 12 ++++++++++++ src/version.c | 2 ++ 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 @@ -3292,6 +3292,24 @@ getwinvar( --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 */ @@ -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 @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1489, /**/ 1488, /**/ -- cgit v1.2.3