To: vim_dev@googlegroups.com Subject: Patch 8.2.2497 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.2497 Problem: No error when using more than one character for a register name. Solution: In Vim9 script check for a single character string. (closes #7814) Fix that VAR_BOOL and VAR_SPECIAL are not considered equal. Files: src/errors.h, src/evalfunc.c, src/typval.c, src/testdir/test_vim9_builtin.vim *** ../vim-8.2.2496/src/errors.h 2021-02-08 21:53:05.592963320 +0100 --- src/errors.h 2021-02-10 21:56:21.096641926 +0100 *************** *** 359,361 **** --- 359,363 ---- INIT(= N_("E1160: Cannot use a default for variable arguments")); EXTERN char e_cannot_json_encode_str[] INIT(= N_("E1161: Cannot json encode a %s")); + EXTERN char e_register_name_must_be_one_char_str[] + INIT(= N_("E1162: Register name must be one character: %s")); *** ../vim-8.2.2496/src/evalfunc.c 2021-02-06 12:38:47.623324174 +0100 --- src/evalfunc.c 2021-02-10 22:10:31.822776214 +0100 *************** *** 4285,4291 **** if (argvars[0].v_type != VAR_UNKNOWN) { strregname = tv_get_string_chk(&argvars[0]); ! error = strregname == NULL; if (argvars[1].v_type != VAR_UNKNOWN) { arg2 = (int)tv_get_bool_chk(&argvars[1], &error); --- 4285,4297 ---- if (argvars[0].v_type != VAR_UNKNOWN) { strregname = tv_get_string_chk(&argvars[0]); ! if (strregname == NULL) ! error = TRUE; ! else if (in_vim9script() && STRLEN(strregname) > 1) ! { ! semsg(_(e_register_name_must_be_one_char_str), strregname); ! error = TRUE; ! } if (argvars[1].v_type != VAR_UNKNOWN) { arg2 = (int)tv_get_bool_chk(&argvars[1], &error); *************** *** 4335,4340 **** --- 4341,4351 ---- if (argvars[0].v_type != VAR_UNKNOWN) { strregname = tv_get_string_chk(&argvars[0]); + if (strregname != NULL && in_vim9script() && STRLEN(strregname) > 1) + { + semsg(_(e_register_name_must_be_one_char_str), strregname); + strregname = NULL; + } if (strregname == NULL) // type error; errmsg already given { rettv->v_type = VAR_STRING; *************** *** 7368,7373 **** --- 7379,7389 ---- strregname = tv_get_string_chk(&argvars[0]); if (strregname == NULL) return; + if (in_vim9script() && STRLEN(strregname) > 1) + { + semsg(_(e_register_name_must_be_one_char_str), strregname); + return; + } } else strregname = get_vim_var_str(VV_REG); *************** *** 7410,7416 **** { item->di_tv.v_type = VAR_SPECIAL; item->di_tv.vval.v_number = regname == buf[0] ! ? VVAL_TRUE : VVAL_FALSE; (void)dict_add(dict, item); } } --- 7426,7432 ---- { item->di_tv.v_type = VAR_SPECIAL; item->di_tv.vval.v_number = regname == buf[0] ! ? VVAL_TRUE : VVAL_FALSE; (void)dict_add(dict, item); } } *************** *** 8472,8477 **** --- 8488,8498 ---- if (strregname == NULL) return; // type error; errmsg already given + if (in_vim9script() && STRLEN(strregname) > 1) + { + semsg(_(e_register_name_must_be_one_char_str), strregname); + return; + } regname = *strregname; if (regname == 0 || regname == '@') regname = '"'; *** ../vim-8.2.2496/src/typval.c 2021-01-31 13:08:16.164367438 +0100 --- src/typval.c 2021-02-10 22:17:49.756864145 +0100 *************** *** 1069,1075 **** return r; } ! if (tv1->v_type != tv2->v_type) return FALSE; switch (tv1->v_type) --- 1069,1077 ---- return r; } ! if (tv1->v_type != tv2->v_type ! && ((tv1->v_type != VAR_BOOL && tv1->v_type != VAR_SPECIAL) ! || (tv2->v_type != VAR_BOOL && tv2->v_type != VAR_SPECIAL))) return FALSE; switch (tv1->v_type) *** ../vim-8.2.2496/src/testdir/test_vim9_builtin.vim 2021-02-07 14:31:02.963000750 +0100 --- src/testdir/test_vim9_builtin.vim 2021-02-10 22:11:25.770657848 +0100 *************** *** 531,536 **** --- 531,537 ---- var lines = ['aaa', 'bbb', 'ccc'] setreg('a', lines) getreg('a', true, true)->assert_equal(lines) + assert_fails('getreg("ab")', 'E1162:') enddef def Test_getreg_return_type() *************** *** 539,544 **** --- 540,559 ---- var s3: list = getreg('"', 1, 1) enddef + def Test_getreginfo() + var text = 'abc' + setreg('a', text) + getreginfo('a')->assert_equal({regcontents: [text], regtype: 'v', isunnamed: false}) + assert_fails('getreginfo("ab")', 'E1162:') + enddef + + def Test_getregtype() + var lines = ['aaa', 'bbb', 'ccc'] + setreg('a', lines) + getregtype('a')->assert_equal('V') + assert_fails('getregtype("ab")', 'E1162:') + enddef + def Test_glob() glob('runtest.vim', true, true, true)->assert_equal(['runtest.vim']) enddef *************** *** 878,883 **** --- 893,899 ---- var reginfo = getreginfo('a') setreg('a', reginfo) getreginfo('a')->assert_equal(reginfo) + assert_fails('setreg("ab", 0)', 'E1162:') enddef def Test_slice() *** ../vim-8.2.2496/src/version.c 2021-02-10 21:20:21.969294832 +0100 --- src/version.c 2021-02-10 21:57:56.012433870 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 2497, /**/