diff --git a/vm/src/frame.rs b/vm/src/frame.rs index 63089a48f2..39cea1467f 100644 --- a/vm/src/frame.rs +++ b/vm/src/frame.rs @@ -980,44 +980,13 @@ impl ExecutingFrame<'_> { self.jump(*target); Ok(None) } - bytecode::Instruction::JumpIfTrue { target } => { - let obj = self.pop_value(); - let value = obj.try_to_bool(vm)?; - if value { - self.jump(*target); - } - Ok(None) - } - - bytecode::Instruction::JumpIfFalse { target } => { - let obj = self.pop_value(); - let value = obj.try_to_bool(vm)?; - if !value { - self.jump(*target); - } - Ok(None) - } - + bytecode::Instruction::JumpIfTrue { target } => self.jump_if(vm, *target, true), + bytecode::Instruction::JumpIfFalse { target } => self.jump_if(vm, *target, false), bytecode::Instruction::JumpIfTrueOrPop { target } => { - let obj = self.last_value(); - let value = obj.try_to_bool(vm)?; - if value { - self.jump(*target); - } else { - self.pop_value(); - } - Ok(None) + self.jump_if_or_pop(vm, *target, true) } - bytecode::Instruction::JumpIfFalseOrPop { target } => { - let obj = self.last_value(); - let value = obj.try_to_bool(vm)?; - if !value { - self.jump(*target); - } else { - self.pop_value(); - } - Ok(None) + self.jump_if_or_pop(vm, *target, false) } bytecode::Instruction::Raise { kind } => self.execute_raise(vm, *kind), @@ -1484,6 +1453,33 @@ impl ExecutingFrame<'_> { self.update_lasti(|i| *i = target_pc); } + #[inline] + fn jump_if(&mut self, vm: &VirtualMachine, target: bytecode::Label, flag: bool) -> FrameResult { + let obj = self.pop_value(); + let value = obj.try_to_bool(vm)?; + if value == flag { + self.jump(target); + } + Ok(None) + } + + #[inline] + fn jump_if_or_pop( + &mut self, + vm: &VirtualMachine, + target: bytecode::Label, + flag: bool, + ) -> FrameResult { + let obj = self.last_value(); + let value = obj.try_to_bool(vm)?; + if value == flag { + self.jump(target); + } else { + self.pop_value(); + } + Ok(None) + } + /// The top of stack contains the iterator, lets push it forward fn execute_for_iter(&mut self, vm: &VirtualMachine, target: bytecode::Label) -> FrameResult { let top_of_stack = PyIter::new(self.last_value());