patch 9.1.2096: Vim9: truthiness issue with objects

Problem:  Vim9: truthiness issue with objects
          (kennypete)
Solution: Return true for an non-null object
          (Yegappan Lakshmanan)

related: #19173
closes:  #19213

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Yegappan Lakshmanan
2026-01-19 18:21:12 +00:00
committed by Christian Brabandt
parent e803ad1c56
commit 4a08c8b5d4
4 changed files with 44 additions and 4 deletions
+6 -3
View File
@@ -1,4 +1,4 @@
*vim9.txt* For Vim version 9.1. Last change: 2025 Dec 03
*vim9.txt* For Vim version 9.1. Last change: 2026 Jan 19
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -1084,8 +1084,11 @@ empty list and dict is falsy:
special true or v:true
job when not NULL
channel when not NULL
class when not NULL
object when not NULL (TODO: when isTrue() returns true)
class not applicable
object when not NULL
enum not applicable
enum value always
typealias not applicable
The boolean operators "||" and "&&" expect the values to be boolean, zero or
one: >
+32
View File
@@ -231,6 +231,38 @@ def Test_expr1_falsy()
END
v9.CheckDefAndScriptSuccess(lines)
# falsy operator with objects and enum values
lines =<< trim END
vim9script
class C
endclass
var c = C.new()
assert_equal(c, c ?? 'falsy')
assert_equal('truthy', !c ?? 'truthy')
assert_equal('falsy', null_object ?? 'falsy')
assert_equal(true, !null_object ?? 'truthy')
enum Color
Red,
Blue
endenum
assert_equal(Color.Red, Color.Red ?? 'falsy')
assert_equal('truthy', !Color.Red ?? 'truthy')
def Fn()
var c2 = C.new()
assert_equal(c2, c2 ?? 'falsy')
assert_equal('truthy', !c2 ?? 'truthy')
assert_equal('falsy', null_object ?? 'falsy')
assert_equal(true, !null_object ?? 'truthy')
assert_equal(Color.Red, Color.Red ?? 'falsy')
assert_equal('truthy', !Color.Red ?? 'truthy')
enddef
Fn()
END
v9.CheckSourceScriptSuccess(lines)
var msg = "White space required before and after '??'"
call v9.CheckDefAndScriptFailure(["var x = 1?? 'one' : 'two'"], msg, 1)
call v9.CheckDefAndScriptFailure(["var x = 1 ??'one' : 'two'"], msg, 1)
+2
View File
@@ -734,6 +734,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2096,
/**/
2095,
/**/
+4 -1
View File
@@ -8127,12 +8127,15 @@ tv2bool(typval_T *tv)
#endif
case VAR_BLOB:
return tv->vval.v_blob != NULL && tv->vval.v_blob->bv_ga.ga_len > 0;
case VAR_OBJECT:
return tv->vval.v_object != NULL;
case VAR_UNKNOWN:
case VAR_ANY:
case VAR_VOID:
case VAR_INSTR:
case VAR_CLASS:
case VAR_OBJECT:
case VAR_TYPEALIAS:
break;
}