summaryrefslogtreecommitdiff
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
parent6f8f7337c1211692d508239eb4cbc8a6f67de497 (diff)
downloadvim-git-8.2.1416.tar.gz
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)
-rw-r--r--src/eval.c13
-rw-r--r--src/testdir/test_vim9_expr.vim54
-rw-r--r--src/testdir/vim9.vim8
-rw-r--r--src/version.c2
4 files changed, 49 insertions, 28 deletions
diff --git a/src/eval.c b/src/eval.c
index abdf076d2..99554e7e2 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);
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index aa5997318..d2d2e0b1e 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -1750,31 +1750,35 @@ enddef
def Test_expr7_not()
- assert_equal(true, !'')
- assert_equal(true, ![])
- assert_equal(false, !'asdf')
- assert_equal(false, ![2])
- assert_equal(true, !!'asdf')
- assert_equal(true, !![2])
-
- assert_equal(true, !test_null_partial())
- assert_equal(false, !{-> 'yes'})
-
- assert_equal(true, !test_null_dict())
- assert_equal(true, !{})
- assert_equal(false, !{'yes': 'no'})
-
- if has('channel')
- assert_equal(true, !test_null_job())
- assert_equal(true, !test_null_channel())
- endif
-
- assert_equal(true, !test_null_blob())
- assert_equal(true, !0z)
- assert_equal(false, !0z01)
-
- assert_equal(true, !test_void())
- assert_equal(true, !test_unknown())
+ let lines =<< trim END
+ assert_equal(true, !'')
+ assert_equal(true, ![])
+ assert_equal(false, !'asdf')
+ assert_equal(false, ![2])
+ assert_equal(true, !!'asdf')
+ assert_equal(true, !![2])
+
+ assert_equal(true, !test_null_partial())
+ assert_equal(false, !{-> 'yes'})
+
+ assert_equal(true, !test_null_dict())
+ assert_equal(true, !{})
+ assert_equal(false, !{'yes': 'no'})
+
+ if has('channel')
+ assert_equal(true, !test_null_job())
+ assert_equal(true, !test_null_channel())
+ endif
+
+ assert_equal(true, !test_null_blob())
+ assert_equal(true, !0z)
+ assert_equal(false, !0z01)
+
+ assert_equal(true, !test_void())
+ assert_equal(true, !test_unknown())
+ END
+ CheckDefSuccess(lines)
+ CheckScriptSuccess(['vim9script'] + lines)
enddef
func Test_expr7_fails()
diff --git a/src/testdir/vim9.vim b/src/testdir/vim9.vim
index fdad9f7c3..448aa3db9 100644
--- a/src/testdir/vim9.vim
+++ b/src/testdir/vim9.vim
@@ -1,5 +1,13 @@
" Utility functions for testing vim9 script
+" Check that "lines" inside ":def" has no error.
+func CheckDefSuccess(lines)
+ call writefile(['def Func()'] + a:lines + ['enddef', 'defcompile'], 'Xdef')
+ so Xdef
+ call Func()
+ call delete('Xdef')
+endfunc
+
" Check that "lines" inside ":def" results in an "error" message.
func CheckDefFailure(lines, error)
call writefile(['def Func()'] + a:lines + ['enddef', 'defcompile'], 'Xdef')
diff --git a/src/version.c b/src/version.c
index e7a103971..627df9923 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 */
/**/
+ 1416,
+/**/
1415,
/**/
1414,