summaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-10 21:57:54 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-10 21:57:54 +0200
commit3e06a1e2a8c0854c881574f33363e00264db1f1d (patch)
tree157355f93618af7809f52aa3bf2a83d0ce79867e /src/eval.c
parent6f8f7337c1211692d508239eb4cbc8a6f67de497 (diff)
patch 8.2.1416: Vim9: boolean evaluation does not work as intendedv8.2.1416
Problem: Vim9: boolean evaluation does not work as intended. Solution: Use tv2bool() in Vim9 script. (closes #6681)
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/eval.c b/src/eval.c
index abdf076d26..99554e7e26 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -192,7 +192,10 @@ eval_to_bool(
*error = FALSE;
if (!skip)
{
- retval = (tv_get_number_chk(&tv, error) != 0);
+ if (in_vim9script())
+ retval = tv2bool(&tv);
+ else
+ retval = (tv_get_number_chk(&tv, error) != 0);
clear_tv(&tv);
}
}
@@ -3098,7 +3101,8 @@ eval7(
// Apply prefixed "-" and "+" now. Matters especially when
// "->" follows.
- if (ret == OK && evaluate && end_leader > start_leader)
+ if (ret == OK && evaluate && end_leader > start_leader
+ && rettv->v_type != VAR_BLOB)
ret = eval7_leader(rettv, TRUE, start_leader, &end_leader);
break;
@@ -3281,7 +3285,10 @@ eval7_leader(
f = rettv->vval.v_float;
else
#endif
- val = tv_get_number_chk(rettv, &error);
+ if (in_vim9script() && end_leader[-1] == '!')
+ val = tv2bool(rettv);
+ else
+ val = tv_get_number_chk(rettv, &error);
if (error)
{
clear_tv(rettv);