Skip to content

Commit c4d4432

Browse files
committed
JumpIfTrue
1 parent 7b345d0 commit c4d4432

2 files changed

Lines changed: 32 additions & 0 deletions

File tree

jit/src/instructions.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,21 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
180180

181181
Ok(())
182182
}
183+
Instruction::JumpIfTrue { target } => {
184+
let cond = self.stack.pop().ok_or(JitCompileError::BadBytecode)?;
185+
186+
let then_block = self.builder.create_block();
187+
self.label_to_block.insert(*target, then_block);
188+
189+
let val = self.boolean_val(cond)?;
190+
self.builder.ins().brnz(val, then_block, &[]);
191+
192+
let block = self.builder.create_block();
193+
self.builder.ins().fallthrough(block, &[]);
194+
self.builder.switch_to_block(block);
195+
196+
Ok(())
197+
}
183198
Instruction::Jump { target } => {
184199
let target_block = self.builder.create_block();
185200
self.label_to_block.insert(*target, target_block);

jit/tests/bool_tests.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,20 @@ fn test_not() {
3434
assert_eq!(not_(true), Ok(false));
3535
assert_eq!(not_(false), Ok(true));
3636
}
37+
38+
#[test]
39+
fn test_if_not() {
40+
let if_not = jit_function! { if_not(a: bool) -> i64 => r##"
41+
def if_not(a: bool):
42+
if not a:
43+
return 0
44+
else:
45+
return 1
46+
47+
return -1
48+
"## };
49+
50+
assert_eq!(if_not(true), Ok(1));
51+
assert_eq!(if_not(false), Ok(0));
52+
}
53+

0 commit comments

Comments
 (0)