aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-05-08 23:17:28 +0800
committerGitHub <noreply@github.com>2023-05-08 23:17:28 +0800
commit71424a8a0e42ce56bbe3a4319764a8c32f1f511f (patch)
tree51c6d88e710a4fe5b66e4ac76e68657c08872b07
parent9753cda591e2fceaaeea26bdf2d5b5d874d7e9f5 (diff)
parent625926f729137658d0a8a73a55aeefc5583488c3 (diff)
downloadrneovim-71424a8a0e42ce56bbe3a4319764a8c32f1f511f.tar.gz
rneovim-71424a8a0e42ce56bbe3a4319764a8c32f1f511f.tar.bz2
rneovim-71424a8a0e42ce56bbe3a4319764a8c32f1f511f.zip
Merge pull request #23540 from zeertzjq/vim-9.0.1522
vim-patch:9.0.{1522,1524}: some functions give two error messages
-rw-r--r--src/nvim/eval/typval.c22
-rw-r--r--src/nvim/eval/typval.h4
-rw-r--r--src/nvim/strings.c37
-rw-r--r--test/old/testdir/test_expr.vim3
-rw-r--r--test/old/testdir/test_functions.vim4
-rw-r--r--test/old/testdir/test_utf8.vim6
6 files changed, 58 insertions, 18 deletions
diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c
index 5755178b18..cb8f8ce44d 100644
--- a/src/nvim/eval/typval.c
+++ b/src/nvim/eval/typval.c
@@ -2166,6 +2166,16 @@ varnumber_T tv_dict_get_number_def(const dict_T *const d, const char *const key,
return tv_get_number(&di->di_tv);
}
+varnumber_T tv_dict_get_bool(const dict_T *const d, const char *const key, const int def)
+ FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ dictitem_T *const di = tv_dict_find(d, key, -1);
+ if (di == NULL) {
+ return def;
+ }
+ return tv_get_bool(&di->di_tv);
+}
+
/// Converts a dict to an environment
char **tv_dict_to_env(dict_T *denv)
{
@@ -4049,6 +4059,18 @@ varnumber_T tv_get_number_chk(const typval_T *const tv, bool *const ret_error)
return (ret_error == NULL ? -1 : 0);
}
+varnumber_T tv_get_bool(const typval_T *const tv)
+ FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
+{
+ return tv_get_number_chk(tv, NULL);
+}
+
+varnumber_T tv_get_bool_chk(const typval_T *const tv, bool *const ret_error)
+ FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ARG(1)
+{
+ return tv_get_number_chk(tv, ret_error);
+}
+
/// Get the line number from VimL object
///
/// @param[in] tv Object to get value from. Is expected to be a number or
diff --git a/src/nvim/eval/typval.h b/src/nvim/eval/typval.h
index 84e4067f9d..767fd706b3 100644
--- a/src/nvim/eval/typval.h
+++ b/src/nvim/eval/typval.h
@@ -567,8 +567,4 @@ EXTERN const size_t kTVTranslate INIT(= TV_TRANSLATE);
# include "eval/typval.h.generated.h"
#endif
-#define tv_get_bool tv_get_number
-#define tv_get_bool_chk tv_get_number_chk
-#define tv_dict_get_bool tv_dict_get_number_def
-
#endif // NVIM_EVAL_TYPVAL_H
diff --git a/src/nvim/strings.c b/src/nvim/strings.c
index 5231ec0841..4e521b14f7 100644
--- a/src/nvim/strings.c
+++ b/src/nvim/strings.c
@@ -1502,7 +1502,8 @@ char *strrep(const char *src, const char *what, const char *rep)
return ret;
}
-static void byteidx(typval_T *argvars, typval_T *rettv, int comp)
+/// Implementation of "byteidx()" and "byteidxcomp()" functions
+static void byteidx_common(typval_T *argvars, typval_T *rettv, int comp)
{
rettv->vval.v_number = -1;
@@ -1514,7 +1515,11 @@ static void byteidx(typval_T *argvars, typval_T *rettv, int comp)
varnumber_T utf16idx = false;
if (argvars[2].v_type != VAR_UNKNOWN) {
- utf16idx = tv_get_bool(&argvars[2]);
+ bool error = false;
+ utf16idx = tv_get_bool_chk(&argvars[2], &error);
+ if (error) {
+ return;
+ }
if (utf16idx < 0 || utf16idx > 1) {
semsg(_(e_using_number_as_bool_nr), utf16idx);
return;
@@ -1550,13 +1555,13 @@ static void byteidx(typval_T *argvars, typval_T *rettv, int comp)
/// "byteidx()" function
void f_byteidx(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
{
- byteidx(argvars, rettv, false);
+ byteidx_common(argvars, rettv, false);
}
/// "byteidxcomp()" function
void f_byteidxcomp(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
{
- byteidx(argvars, rettv, true);
+ byteidx_common(argvars, rettv, true);
}
/// "charidx()" function
@@ -1764,16 +1769,21 @@ void f_strcharlen(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
/// "strchars()" function
void f_strchars(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
{
- int skipcc = false;
+ varnumber_T skipcc = false;
if (argvars[1].v_type != VAR_UNKNOWN) {
- skipcc = (int)tv_get_bool(&argvars[1]);
- }
- if (skipcc < 0 || skipcc > 1) {
- semsg(_(e_using_number_as_bool_nr), skipcc);
- } else {
- strchar_common(argvars, rettv, skipcc);
+ bool error = false;
+ skipcc = tv_get_bool_chk(&argvars[1], &error);
+ if (error) {
+ return;
+ }
+ if (skipcc < 0 || skipcc > 1) {
+ semsg(_(e_using_number_as_bool_nr), skipcc);
+ return;
+ }
}
+
+ strchar_common(argvars, rettv, skipcc);
}
/// "strutf16len()" function
@@ -1840,7 +1850,10 @@ void f_strcharpart(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
if (!error) {
if (argvars[2].v_type != VAR_UNKNOWN
&& argvars[3].v_type != VAR_UNKNOWN) {
- skipcc = tv_get_bool(&argvars[3]);
+ skipcc = tv_get_bool_chk(&argvars[3], &error);
+ if (error) {
+ return;
+ }
if (skipcc < 0 || skipcc > 1) {
semsg(_(e_using_number_as_bool_nr), skipcc);
return;
diff --git a/test/old/testdir/test_expr.vim b/test/old/testdir/test_expr.vim
index 9e089d50b8..4cb8da8c74 100644
--- a/test/old/testdir/test_expr.vim
+++ b/test/old/testdir/test_expr.vim
@@ -154,6 +154,9 @@ func Test_strcharpart()
call assert_equal('edit', "editor"[-10 : 3])
END
call CheckLegacyAndVim9Success(lines)
+
+ call assert_fails('call strcharpart("", 0, 0, {})', ['E728:', 'E728:'])
+ call assert_fails('call strcharpart("", 0, 0, -1)', ['E1023:', 'E1023:'])
endfunc
func Test_getreg_empty_list()
diff --git a/test/old/testdir/test_functions.vim b/test/old/testdir/test_functions.vim
index b934f7fac2..41a8610893 100644
--- a/test/old/testdir/test_functions.vim
+++ b/test/old/testdir/test_functions.vim
@@ -1096,6 +1096,8 @@ func Test_byteidx()
" error cases
call assert_fails("call byteidx([], 0)", 'E730:')
call assert_fails("call byteidx('abc', [])", 'E745:')
+ call assert_fails("call byteidx('abc', 0, {})", ['E728:', 'E728:'])
+ call assert_fails("call byteidx('abc', 0, -1)", ['E1023:', 'E1023:'])
endfunc
" Test for byteidxcomp() using a character index
@@ -1135,6 +1137,8 @@ func Test_byteidxcomp()
" error cases
call assert_fails("call byteidxcomp([], 0)", 'E730:')
call assert_fails("call byteidxcomp('abc', [])", 'E745:')
+ call assert_fails("call byteidxcomp('abc', 0, {})", ['E728:', 'E728:'])
+ call assert_fails("call byteidxcomp('abc', 0, -1)", ['E1023:', 'E1023:'])
endfunc
" Test for byteidx() using a UTF-16 index
diff --git a/test/old/testdir/test_utf8.vim b/test/old/testdir/test_utf8.vim
index e5f6d68720..00b060a9e2 100644
--- a/test/old/testdir/test_utf8.vim
+++ b/test/old/testdir/test_utf8.vim
@@ -29,8 +29,10 @@ func Test_strchars()
call assert_equal(exp[i], strcharlen(inp[i]))
endfor
- call assert_fails("let v=strchars('abc', [])", 'E745:')
- call assert_fails("let v=strchars('abc', 2)", 'E1023:')
+ call assert_fails("call strchars('abc', 2)", ['E1023:', 'E1023:'])
+ call assert_fails("call strchars('abc', -1)", ['E1023:', 'E1023:'])
+ call assert_fails("call strchars('abc', {})", ['E728:', 'E728:'])
+ call assert_fails("call strchars('abc', [])", ['E745:', 'E745:'])
endfunc
" Test for customlist completion