patch 8.2.3442: Vim9: || and && are not handled at compile time
Problem: Vim9: || and && are not handled at compile time when possible.
Solution: When using constants generate fewer instructions.
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index 8400174..ba2d0a1 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -1218,6 +1218,38 @@
instr)
enddef
+def AndConstant(arg: any): string
+ if true && arg
+ return "yes"
+ endif
+ if false && arg
+ return "never"
+ endif
+ return "no"
+enddef
+
+def Test_disassemble_and_constant()
+ assert_equal("yes", AndConstant(1))
+ assert_equal("no", AndConstant(false))
+ var instr = execute('disassemble AndConstant')
+ assert_match('AndConstant\_s*' ..
+ 'if true && arg\_s*' ..
+ '0 LOAD arg\[-1\]\_s*' ..
+ '1 COND2BOOL\_s*' ..
+ '2 JUMP_IF_FALSE -> 5\_s*' ..
+ 'return "yes"\_s*' ..
+ '3 PUSHS "yes"\_s*' ..
+ '4 RETURN\_s*' ..
+ 'endif\_s*' ..
+ 'if false && arg\_s*' ..
+ 'return "never"\_s*' ..
+ 'endif\_s*' ..
+ 'return "no"\_s*' ..
+ '5 PUSHS "no"\_s*' ..
+ '6 RETURN',
+ instr)
+enddef
+
def ForLoop(): list<number>
var res: list<number>
for i in range(3)
@@ -1734,25 +1766,31 @@
enddef
def ReturnBool(): bool
- var name: bool = 1 && 0 || 1
+ var one = 1
+ var zero = 0
+ var name: bool = one && zero || one
return name
enddef
def Test_disassemble_return_bool()
var instr = execute('disassemble ReturnBool')
assert_match('ReturnBool\_s*' ..
- 'var name: bool = 1 && 0 || 1\_s*' ..
- '0 PUSHNR 1\_s*' ..
- '1 COND2BOOL\_s*' ..
- '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
- '3 PUSHNR 0\_s*' ..
- '4 COND2BOOL\_s*' ..
- '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
- '6 PUSHNR 1\_s*' ..
- '7 COND2BOOL\_s*' ..
- '\d STORE $0\_s*' ..
+ 'var one = 1\_s*' ..
+ '0 STORE 1 in $0\_s*' ..
+ 'var zero = 0\_s*' ..
+ '1 STORE 0 in $1\_s*' ..
+ 'var name: bool = one && zero || one\_s*' ..
+ '2 LOAD $0\_s*' ..
+ '3 COND2BOOL\_s*' ..
+ '4 JUMP_IF_COND_FALSE -> 7\_s*' ..
+ '5 LOAD $1\_s*' ..
+ '6 COND2BOOL\_s*' ..
+ '7 JUMP_IF_COND_TRUE -> 10\_s*' ..
+ '8 LOAD $0\_s*' ..
+ '9 COND2BOOL\_s*' ..
+ '10 STORE $2\_s*' ..
'return name\_s*' ..
- '\d\+ LOAD $0\_s*' ..
+ '\d\+ LOAD $2\_s*' ..
'\d\+ RETURN',
instr)
assert_equal(true, InvertBool())