summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-09-01 23:06:01 +0200
committerBram Moolenaar <Bram@vim.org>2020-09-01 23:06:01 +0200
commit3767e3a3302d745349eff8cfe45411f03e13de43 (patch)
tree03523354dd08a8bbdee8868d3e22213d10da2513
parent81fcb67fb32a12414512b72e691a1bbbff9f8511 (diff)
downloadvim-git-3767e3a3302d745349eff8cfe45411f03e13de43.tar.gz
patch 8.2.1562: Vim9: error when using "%" where a buffer is expectedv8.2.1562
Problem: Vim9: error when using "%" where a buffer is expected. Solution: Add tv_get_buf_from_arg(). (closes #6814)
-rw-r--r--src/evalbuffer.c34
-rw-r--r--src/proto/typval.pro1
-rw-r--r--src/testdir/test_vim9_func.vim5
-rw-r--r--src/typval.c19
-rw-r--r--src/version.c2
5 files changed, 32 insertions, 29 deletions
diff --git a/src/evalbuffer.c b/src/evalbuffer.c
index 5cf884a80..300441551 100644
--- a/src/evalbuffer.c
+++ b/src/evalbuffer.c
@@ -364,16 +364,7 @@ f_bufname(typval_T *argvars, typval_T *rettv)
if (tv->v_type == VAR_UNKNOWN)
buf = curbuf;
else
- {
- ++emsg_off;
- buf = tv_get_buf(tv, FALSE);
- --emsg_off;
- if (buf == NULL
- && tv->v_type != VAR_NUMBER
- && tv->v_type != VAR_STRING)
- // issue errmsg for type error
- (void)tv_get_number(tv);
- }
+ buf = tv_get_buf_from_arg(tv);
rettv->v_type = VAR_STRING;
if (buf != NULL && buf->b_fname != NULL)
rettv->vval.v_string = vim_strsave(buf->b_fname);
@@ -394,13 +385,7 @@ f_bufnr(typval_T *argvars, typval_T *rettv)
if (argvars[0].v_type == VAR_UNKNOWN)
buf = curbuf;
else
- {
- if (argvars[0].v_type != VAR_STRING)
- (void)tv_get_number(&argvars[0]); // issue errmsg if type error
- ++emsg_off;
- buf = tv_get_buf(&argvars[0], FALSE);
- --emsg_off;
- }
+ buf = tv_get_buf_from_arg(&argvars[0]);
// If the buffer isn't found and the second argument is not zero create a
// new buffer.
@@ -425,9 +410,7 @@ buf_win_common(typval_T *argvars, typval_T *rettv, int get_nr)
int winnr = 0;
buf_T *buf;
- (void)tv_get_number(&argvars[0]); // issue errmsg if type error
- ++emsg_off;
- buf = tv_get_buf(&argvars[0], TRUE);
+ buf = tv_get_buf_from_arg(&argvars[0]);
FOR_ALL_WINDOWS(wp)
{
++winnr;
@@ -435,7 +418,6 @@ buf_win_common(typval_T *argvars, typval_T *rettv, int get_nr)
break;
}
rettv->vval.v_number = (wp != NULL ? (get_nr ? winnr : wp->w_id) : -1);
- --emsg_off;
}
/*
@@ -662,10 +644,7 @@ f_getbufinfo(typval_T *argvars, typval_T *rettv)
else if (argvars[0].v_type != VAR_UNKNOWN)
{
// Information about one buffer. Argument specifies the buffer
- (void)tv_get_number(&argvars[0]); // issue errmsg if type error
- ++emsg_off;
- argbuf = tv_get_buf(&argvars[0], FALSE);
- --emsg_off;
+ argbuf = tv_get_buf_from_arg(&argvars[0]);
if (argbuf == NULL)
return;
}
@@ -752,10 +731,7 @@ f_getbufline(typval_T *argvars, typval_T *rettv)
linenr_T end;
buf_T *buf;
- (void)tv_get_number(&argvars[0]); // issue errmsg if type error
- ++emsg_off;
- buf = tv_get_buf(&argvars[0], FALSE);
- --emsg_off;
+ buf = tv_get_buf_from_arg(&argvars[0]);
lnum = tv_get_lnum_buf(&argvars[1], buf);
if (argvars[2].v_type == VAR_UNKNOWN)
diff --git a/src/proto/typval.pro b/src/proto/typval.pro
index 25ad3e673..9c57226da 100644
--- a/src/proto/typval.pro
+++ b/src/proto/typval.pro
@@ -29,4 +29,5 @@ int eval_env_var(char_u **arg, typval_T *rettv, int evaluate);
linenr_T tv_get_lnum(typval_T *argvars);
linenr_T tv_get_lnum_buf(typval_T *argvars, buf_T *buf);
buf_T *tv_get_buf(typval_T *tv, int curtab_only);
+buf_T *tv_get_buf_from_arg(typval_T *tv);
/* vim: set ft=c : */
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 282d8dcec..057583644 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -1443,6 +1443,11 @@ def Test_bufname()
close
enddef
+def Test_gebufinfo()
+ let bufinfo = getbufinfo(bufnr())
+ assert_equal(bufinfo, getbufinfo('%'))
+enddef
+
def Fibonacci(n: number): number
if n < 2
return n
diff --git a/src/typval.c b/src/typval.c
index d1732f2b7..c7cfd4116 100644
--- a/src/typval.c
+++ b/src/typval.c
@@ -1562,4 +1562,23 @@ tv_get_buf(typval_T *tv, int curtab_only)
return buf;
}
+/*
+ * Like tv_get_buf() but give an error message is the type is wrong.
+ */
+ buf_T *
+tv_get_buf_from_arg(typval_T *tv)
+{
+ buf_T *buf;
+
+ ++emsg_off;
+ buf = tv_get_buf(tv, FALSE);
+ --emsg_off;
+ if (buf == NULL
+ && tv->v_type != VAR_NUMBER
+ && tv->v_type != VAR_STRING)
+ // issue errmsg for type error
+ (void)tv_get_number(tv);
+ return buf;
+}
+
#endif // FEAT_EVAL
diff --git a/src/version.c b/src/version.c
index 80c39982d..f2d89f672 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 */
/**/
+ 1562,
+/**/
1561,
/**/
1560,