@@ -980,44 +980,13 @@ impl ExecutingFrame<'_> {
980
980
self . jump ( * target) ;
981
981
Ok ( None )
982
982
}
983
- bytecode:: Instruction :: JumpIfTrue { target } => {
984
- let obj = self . pop_value ( ) ;
985
- let value = obj. try_to_bool ( vm) ?;
986
- if value {
987
- self . jump ( * target) ;
988
- }
989
- Ok ( None )
990
- }
991
-
992
- bytecode:: Instruction :: JumpIfFalse { target } => {
993
- let obj = self . pop_value ( ) ;
994
- let value = obj. try_to_bool ( vm) ?;
995
- if !value {
996
- self . jump ( * target) ;
997
- }
998
- Ok ( None )
999
- }
1000
-
983
+ bytecode:: Instruction :: JumpIfTrue { target } => self . jump_if ( vm, * target, true ) ,
984
+ bytecode:: Instruction :: JumpIfFalse { target } => self . jump_if ( vm, * target, false ) ,
1001
985
bytecode:: Instruction :: JumpIfTrueOrPop { target } => {
1002
- let obj = self . last_value ( ) ;
1003
- let value = obj. try_to_bool ( vm) ?;
1004
- if value {
1005
- self . jump ( * target) ;
1006
- } else {
1007
- self . pop_value ( ) ;
1008
- }
1009
- Ok ( None )
986
+ self . jump_if_or_pop ( vm, * target, true )
1010
987
}
1011
-
1012
988
bytecode:: Instruction :: JumpIfFalseOrPop { target } => {
1013
- let obj = self . last_value ( ) ;
1014
- let value = obj. try_to_bool ( vm) ?;
1015
- if !value {
1016
- self . jump ( * target) ;
1017
- } else {
1018
- self . pop_value ( ) ;
1019
- }
1020
- Ok ( None )
989
+ self . jump_if_or_pop ( vm, * target, false )
1021
990
}
1022
991
1023
992
bytecode:: Instruction :: Raise { kind } => self . execute_raise ( vm, * kind) ,
@@ -1484,6 +1453,33 @@ impl ExecutingFrame<'_> {
1484
1453
self . update_lasti ( |i| * i = target_pc) ;
1485
1454
}
1486
1455
1456
+ #[ inline]
1457
+ fn jump_if ( & mut self , vm : & VirtualMachine , target : bytecode:: Label , flag : bool ) -> FrameResult {
1458
+ let obj = self . pop_value ( ) ;
1459
+ let value = obj. try_to_bool ( vm) ?;
1460
+ if value == flag {
1461
+ self . jump ( target) ;
1462
+ }
1463
+ Ok ( None )
1464
+ }
1465
+
1466
+ #[ inline]
1467
+ fn jump_if_or_pop (
1468
+ & mut self ,
1469
+ vm : & VirtualMachine ,
1470
+ target : bytecode:: Label ,
1471
+ flag : bool ,
1472
+ ) -> FrameResult {
1473
+ let obj = self . last_value ( ) ;
1474
+ let value = obj. try_to_bool ( vm) ?;
1475
+ if value == flag {
1476
+ self . jump ( target) ;
1477
+ } else {
1478
+ self . pop_value ( ) ;
1479
+ }
1480
+ Ok ( None )
1481
+ }
1482
+
1487
1483
/// The top of stack contains the iterator, lets push it forward
1488
1484
fn execute_for_iter ( & mut self , vm : & VirtualMachine , target : bytecode:: Label ) -> FrameResult {
1489
1485
let top_of_stack = PyIter :: new ( self . last_value ( ) ) ;
0 commit comments