@@ -309,7 +309,7 @@ impl<N: CfgState, D: ModelTransition<N::Model>> std::fmt::Debug for CtlFormula<N
309309 }
310310}
311311impl < N : CfgState , D : ModelTransition < N :: Model > > CtlFormula < N , D > {
312- pub fn check ( & self , g : & PcodeCfgVisitor < N , D > ) -> Bool {
312+ pub fn check ( & self , g : & mut PcodeCfgVisitor < N , D > ) -> Bool {
313313 match self {
314314 CtlFormula :: Bottom => Bool :: from_bool ( false ) ,
315315 CtlFormula :: Top => Bool :: from_bool ( true ) ,
@@ -351,24 +351,26 @@ impl<N: CfgState, D: ModelTransition<N::Model>> CtlFormula<N, D> {
351351 }
352352 }
353353
354- pub ( crate ) fn check_next_exists ( & self , g : & PcodeCfgVisitor < N , D > ) -> Bool {
355- let state = g. state ( ) . unwrap ( ) ;
356- let connect: Vec < _ > = g
357- . successors ( )
354+ pub ( crate ) fn check_next_exists ( & self , g : & mut PcodeCfgVisitor < N , D > ) -> Bool {
355+ let state = g. state ( ) . unwrap ( ) . clone ( ) ;
356+ let trans = g. transition ( ) . cloned ( ) ;
357+ let successors: Vec < _ > = g. successors ( ) . collect ( ) ;
358+ let connect: Vec < _ > = successors
359+ . iter ( )
358360 . map ( |a| {
359361 let successor = a. state ( ) . unwrap ( ) ;
360- let after = g . transition ( ) . unwrap ( ) . transition ( state) . unwrap ( ) ;
362+ let after = trans . clone ( ) . unwrap ( ) . transition ( & state) . unwrap ( ) ;
361363
362364 after. location_eq ( successor)
363365 } )
364366 . collect ( ) ;
365367 let connect = Bool :: or ( & connect) ;
366- let bools: Vec < _ > = g
367- . successors ( )
368- . flat_map ( |a| {
368+ let bools: Vec < _ > = successors
369+ . into_iter ( )
370+ . flat_map ( |mut a| {
371+ let check = self . check ( & mut a) ;
369372 let successor = a. state ( ) . unwrap ( ) ;
370- let check = self . check ( & a) ;
371- let after = g. transition ( ) . unwrap ( ) . transition ( state) . unwrap ( ) ;
373+ let after = trans. clone ( ) . unwrap ( ) . transition ( & state) . unwrap ( ) ;
372374 let imp = after
373375 . location_eq ( successor)
374376 . implies ( after. state_eq ( successor) ) ;
@@ -378,24 +380,26 @@ impl<N: CfgState, D: ModelTransition<N::Model>> CtlFormula<N, D> {
378380 Bool :: or ( & bools) . bitand ( connect)
379381 }
380382
381- pub ( crate ) fn check_next_universal ( & self , g : & PcodeCfgVisitor < N , D > ) -> Bool {
382- let state = g. state ( ) . unwrap ( ) ;
383- let connect: Vec < _ > = g
384- . successors ( )
383+ pub ( crate ) fn check_next_universal ( & self , g : & mut PcodeCfgVisitor < N , D > ) -> Bool {
384+ let state = g. state ( ) . unwrap ( ) . clone ( ) ;
385+ let trans = g. transition ( ) . cloned ( ) ;
386+ let successors: Vec < _ > = g. successors ( ) . collect ( ) ;
387+ let connect: Vec < _ > = successors
388+ . iter ( )
385389 . map ( |a| {
386390 let successor = a. state ( ) . unwrap ( ) ;
387- let after = g . transition ( ) . unwrap ( ) . transition ( state) . unwrap ( ) ;
391+ let after = trans . clone ( ) . unwrap ( ) . transition ( & state) . unwrap ( ) ;
388392
389393 after. location_eq ( successor)
390394 } )
391395 . collect ( ) ;
392396 let connect = Bool :: or ( & connect) ;
393- let bools: Vec < _ > = g
394- . successors ( )
395- . flat_map ( |a| {
397+ let bools: Vec < _ > = successors
398+ . into_iter ( )
399+ . flat_map ( |mut a| {
400+ let check = self . check ( & mut a) ;
396401 let successor = a. state ( ) . unwrap ( ) ;
397- let check = self . check ( & a) ;
398- let after = g. transition ( ) . unwrap ( ) . transition ( state) . unwrap ( ) ;
402+ let after = trans. clone ( ) . unwrap ( ) . transition ( & state) . unwrap ( ) ;
399403 let imp = after
400404 . location_eq ( successor)
401405 . implies ( after. state_eq ( successor) ) ;
0 commit comments