From 3e06a1e2a8c0854c881574f33363e00264db1f1d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 10 Aug 2020 21:57:54 +0200 Subject: patch 8.2.1416: Vim9: boolean evaluation does not work as intended Problem: Vim9: boolean evaluation does not work as intended. Solution: Use tv2bool() in Vim9 script. (closes #6681) --- src/eval.c | 13 +++++++--- src/testdir/test_vim9_expr.vim | 54 +++++++++++++++++++++++------------------- src/testdir/vim9.vim | 8 +++++++ src/version.c | 2 ++ 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 @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1416, /**/ 1415, /**/ -- cgit v1.2.1