1b980c9dbe
When a tuple is the condition of an if statement, it's only possible to optimise that tuple away when it is a constant tuple (ie all its elements are constants), because if it's not constant then the elements must be evaluated in case they have side effects (even though the resulting tuple will always be "true"). The code before this change handled the empty tuple OK (because it doesn't need to be evaluated), but it discarded non-empty tuples without evaluating them, which is incorrect behaviour (as show by the updated test). This optimisation is anyway rarely applied because it's not common Python coding practice to write things like `if (): ...` and `if (1, 2): ...`, so removing this optimisation completely won't affect much code, if any. Furthermore, when MICROPY_COMP_CONST_TUPLE is enabled, constant tuples are already optimised by the parser, so expression with constant tuples like `if (): ...` and `if (1, 2): ...` will continue to be optimised properly (and so when this option is enabled the code that's deleted in this commit is actually unreachable when the if condition is a constant tuple). Signed-off-by: Damien George <damien@micropython.org>
107 lines
1.4 KiB
Python
107 lines
1.4 KiB
Python
# test if conditions which are optimised by the compiler
|
|
|
|
if 0:
|
|
print(5)
|
|
else:
|
|
print(6)
|
|
|
|
if 1:
|
|
print(7)
|
|
|
|
if 2:
|
|
print(8)
|
|
|
|
if -1:
|
|
print(9)
|
|
elif 1:
|
|
print(10)
|
|
|
|
if 0:
|
|
print(11)
|
|
else:
|
|
print(12)
|
|
|
|
if 0:
|
|
print(13)
|
|
elif 1:
|
|
print(14)
|
|
|
|
if 0:
|
|
print(15)
|
|
elif 0:
|
|
print(16)
|
|
else:
|
|
print(17)
|
|
|
|
if not False:
|
|
print('a')
|
|
|
|
if not True:
|
|
print('a')
|
|
else:
|
|
print('b')
|
|
|
|
if False:
|
|
print('a')
|
|
else:
|
|
print('b')
|
|
|
|
if True:
|
|
print('a')
|
|
|
|
if (1,):
|
|
print('a')
|
|
|
|
if not (1,):
|
|
print('a')
|
|
else:
|
|
print('b')
|
|
|
|
# test evaluation of the if-condition with tuples as arguments
|
|
# non-constant tuples should be evaluated even though they will evaluate to true
|
|
|
|
def f(x):
|
|
print("f", x)
|
|
|
|
if (f(1),):
|
|
print(18)
|
|
|
|
if (f(2), f(3)):
|
|
print(19)
|
|
|
|
# test if-conditions within a function
|
|
|
|
f2 = 0
|
|
|
|
def f(t1, t2, f1):
|
|
if False:
|
|
print(1)
|
|
if True:
|
|
print(1)
|
|
if ():
|
|
print(1)
|
|
if (1,):
|
|
print(1)
|
|
if (1, 2):
|
|
print(1)
|
|
if t1 and t2:
|
|
print(1)
|
|
if (t1 and t2): # parsed differently to above
|
|
print(1)
|
|
if not (t1 and f1):
|
|
print(1)
|
|
if t1 or t2:
|
|
print(1)
|
|
if (t1 or t2): # parse differently to above
|
|
print(1)
|
|
if f1 or t1:
|
|
print(1)
|
|
if not (f1 or f2):
|
|
print(1)
|
|
if t1 and f1 or t1 and t2:
|
|
print(1)
|
|
if (f1 or t1) and (f2 or t2):
|
|
print(1)
|
|
|
|
f(True, 1, False)
|