@@ -99,7 +99,7 @@ pub enum Insn {
99
99
Jump ( BranchEdge ) ,
100
100
101
101
// Conditional branch instructions
102
- IfTrue { val : Opnd , branch : BranchEdge } ,
102
+ IfTrue { val : Opnd , target : BranchEdge } ,
103
103
IfFalse { val : Opnd , target : BranchEdge } ,
104
104
105
105
// Call a C function
@@ -393,15 +393,24 @@ pub fn iseq_to_ssa(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
393
393
let val = state. pop ( ) ?;
394
394
let test_id = fun. push_insn ( block, Insn :: Test { val } ) ;
395
395
// TODO(max): Check interrupts
396
- let _branch_id = fun. push_insn ( block,
397
- Insn :: IfFalse {
398
- val : Opnd :: Insn ( test_id) ,
399
- target : BranchEdge {
400
- target : insn_idx_to_block[ & insn_idx_at_offset ( insn_idx, offset) ] ,
401
- // TODO(max): Merge locals/stack for bb arguments
402
- args : vec ! [ ] ,
403
- }
404
- } ) ;
396
+ let target = insn_idx_to_block[ & insn_idx_at_offset ( insn_idx, offset) ] ;
397
+ // TODO(max): Merge locals/stack for bb arguments
398
+ let _branch_id = fun. push_insn ( block, Insn :: IfFalse { val : Opnd :: Insn ( test_id) , target : BranchEdge { target, args : vec ! [ ] } } ) ;
399
+ }
400
+ YARVINSN_branchif => {
401
+ let offset = get_arg ( pc, 0 ) . as_i64 ( ) ;
402
+ let val = state. pop ( ) ?;
403
+ let test_id = fun. push_insn ( block, Insn :: Test { val } ) ;
404
+ // TODO(max): Check interrupts
405
+ let target = insn_idx_to_block[ & insn_idx_at_offset ( insn_idx, offset) ] ;
406
+ // TODO(max): Merge locals/stack for bb arguments
407
+ let _branch_id = fun. push_insn ( block, Insn :: IfTrue { val : Opnd :: Insn ( test_id) , target : BranchEdge { target, args : vec ! [ ] } } ) ;
408
+ }
409
+ YARVINSN_jump => {
410
+ let offset = get_arg ( pc, 0 ) . as_i64 ( ) ;
411
+ // TODO(max): Check interrupts
412
+ let target = insn_idx_to_block[ & insn_idx_at_offset ( insn_idx, offset) ] ;
413
+ let _branch_id = fun. push_insn ( block, Insn :: Jump ( BranchEdge { target, args : vec ! [ ] } ) ) ;
405
414
}
406
415
YARVINSN_opt_nil_p => {
407
416
let recv = state. pop ( ) ?;
0 commit comments