diff --git a/compiler/src/compile.rs b/compiler/src/compile.rs index 844f952ea..877200f80 100644 --- a/compiler/src/compile.rs +++ b/compiler/src/compile.rs @@ -1426,11 +1426,15 @@ impl Compiler { ast::Expression::IfExpression { test, body, orelse } => { let no_label = self.new_label(); let end_label = self.new_label(); - self.compile_test(test, None, Some(no_label), EvalContext::Expression)?; + self.compile_test(test, None, None, EvalContext::Expression)?; + self.emit(Instruction::JumpIfFalse { target: no_label }); + // True case self.compile_expression(body)?; self.emit(Instruction::Jump { target: end_label }); + // False case self.set_label(no_label); self.compile_expression(orelse)?; + // End self.set_label(end_label); } } diff --git a/tests/snippets/if_expressions.py b/tests/snippets/if_expressions.py new file mode 100644 index 000000000..143cb6458 --- /dev/null +++ b/tests/snippets/if_expressions.py @@ -0,0 +1,26 @@ +def ret(expression): + return expression + + +assert ret("0" if True else "1") == "0" +assert ret("0" if False else "1") == "1" + +assert ret("0" if False else ("1" if True else "2")) == "1" +assert ret("0" if False else ("1" if False else "2")) == "2" + +assert ret(("0" if True else "1") if True else "2") == "0" +assert ret(("0" if False else "1") if True else "2") == "1" + +a = True +b = False +assert ret("0" if a or b else "1") == "0" +assert ret("0" if a and b else "1") == "1" + + +def func1(): + return 0 + +def func2(): + return 20 + +assert ret(func1() or func2()) == 20