summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/evalfunc.c7
-rw-r--r--src/testdir/test_blob.vim1
-rw-r--r--src/testdir/test_listdict.vim6
-rw-r--r--src/testdir/test_vim9_builtin.vim30
-rw-r--r--src/version.c2
5 files changed, 43 insertions, 3 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 4f68845a16..3817352ca3 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -6814,6 +6814,7 @@ indexof_eval_expr(typval_T *expr)
return FALSE;
found = tv_get_bool_chk(&newtv, &error);
+ clear_tv(&newtv);
return error ? FALSE : found;
}
@@ -6864,6 +6865,7 @@ indexof_list(list_T *l, long startidx, typval_T *expr)
{
listitem_T *item;
long idx = 0;
+ int found;
if (l == NULL)
return -1;
@@ -6888,7 +6890,10 @@ indexof_list(list_T *l, long startidx, typval_T *expr)
set_vim_var_nr(VV_KEY, idx);
copy_tv(&item->li_tv, get_vim_var_tv(VV_VAL));
- if (indexof_eval_expr(expr))
+ found = indexof_eval_expr(expr);
+ clear_tv(get_vim_var_tv(VV_VAL));
+
+ if (found)
return idx;
}
diff --git a/src/testdir/test_blob.vim b/src/testdir/test_blob.vim
index 46f2d61ad3..46370c4749 100644
--- a/src/testdir/test_blob.vim
+++ b/src/testdir/test_blob.vim
@@ -772,6 +772,7 @@ func Test_indexof()
call assert_equal(-1, indexof(b, {i, v -> v == 0x1}))
call assert_equal(1, indexof(b, "v:val == 0xad"))
call assert_equal(-1, indexof(b, "v:val == 0xff"))
+ call assert_equal(-1, indexof(b, {_, v -> "v == 0xad"}))
call assert_equal(-1, indexof(0z, "v:val == 0x0"))
call assert_equal(-1, indexof(test_null_blob(), "v:val == 0xde"))
diff --git a/src/testdir/test_listdict.vim b/src/testdir/test_listdict.vim
index 2c4e5c722d..bba4e3e1e1 100644
--- a/src/testdir/test_listdict.vim
+++ b/src/testdir/test_listdict.vim
@@ -1462,7 +1462,13 @@ func Test_indexof()
call assert_equal(-1, indexof(l, "v:val.n == 10", #{startidx: -4}))
call assert_equal(0, indexof(l, "v:val.n == 10", test_null_dict()))
+ let s = ["a", "b", "c"]
+ call assert_equal(2, indexof(s, {_, v -> v == 'c'}))
+ call assert_equal(-1, indexof(s, {_, v -> v == 'd'}))
+ call assert_equal(-1, indexof(s, {_, v -> "v == 'd'"}))
+
call assert_equal(-1, indexof([], {i, v -> v == 'a'}))
+ call assert_equal(-1, indexof([1, 2, 3], {_, v -> "v == 2"}))
call assert_equal(-1, indexof(test_null_list(), {i, v -> v == 'a'}))
call assert_equal(-1, indexof(l, test_null_string()))
call assert_equal(-1, indexof(l, test_null_function()))
diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim
index 244021c7eb..55ede984d9 100644
--- a/src/testdir/test_vim9_builtin.vim
+++ b/src/testdir/test_vim9_builtin.vim
@@ -2074,10 +2074,36 @@ def Test_indexof()
var b = 0zdeadbeef
indexof(b, "v:val == 0xef")->assert_equal(3)
- def TestIdx(k: number, v: dict<any>): bool
+ def TestIdx1(k: number, v: dict<any>): bool
return v.color == 'blue'
enddef
- indexof(l, TestIdx)->assert_equal(1)
+ indexof(l, TestIdx1)->assert_equal(1)
+
+ var lines =<< trim END
+ def TestIdx(v: dict<any>): bool
+ return v.color == 'blue'
+ enddef
+
+ indexof([{color: "red"}], TestIdx)
+ END
+ v9.CheckDefAndScriptFailure(lines, ['E176: Invalid number of arguments', 'E118: Too many arguments for function'])
+
+ lines =<< trim END
+ def TestIdx(k: number, v: dict<any>)
+ enddef
+
+ indexof([{color: "red"}], TestIdx)
+ END
+ v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(?number, ?any): bool', 'E1031: Cannot use void value'])
+
+ lines =<< trim END
+ def TestIdx(k: number, v: dict<any>): string
+ return "abc"
+ enddef
+
+ indexof([{color: "red"}], TestIdx)
+ END
+ v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(?number, ?any): bool', 'E1135: Using a String as a Bool'])
enddef
def Test_input()
diff --git a/src/version.c b/src/version.c
index f901eeaad8..3b5193fa58 100644
--- a/src/version.c
+++ b/src/version.c
@@ -736,6 +736,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 204,
+/**/
203,
/**/
202,