@@ -241,13 +241,18 @@ impl VirtAddr {
241241
242242 // FIXME: Move this into the `Step` impl, once `Step` is stabilized.
243243 #[ cfg( any( feature = "instructions" , feature = "step_trait" ) ) ]
244- pub ( crate ) fn steps_between_impl ( start : & Self , end : & Self ) -> Option < usize > {
245- let mut steps = end. 0 . checked_sub ( start. 0 ) ?;
244+ pub ( crate ) fn steps_between_impl ( start : & Self , end : & Self ) -> ( usize , Option < usize > ) {
245+ let mut steps = if let Some ( steps) = end. 0 . checked_sub ( start. 0 ) {
246+ steps
247+ } else {
248+ return ( 0 , None ) ;
249+ } ;
246250
247251 // Mask away extra bits that appear while jumping the gap.
248252 steps &= 0xffff_ffff_ffff ;
249253
250- usize:: try_from ( steps) . ok ( )
254+ let steps = usize:: try_from ( steps) . ok ( ) ;
255+ ( steps. unwrap_or ( usize:: MAX ) , steps)
251256 }
252257
253258 // FIXME: Move this into the `Step` impl, once `Step` is stabilized.
@@ -360,7 +365,7 @@ impl Sub<VirtAddr> for VirtAddr {
360365#[ cfg( feature = "step_trait" ) ]
361366impl Step for VirtAddr {
362367 #[ inline]
363- fn steps_between ( start : & Self , end : & Self ) -> Option < usize > {
368+ fn steps_between ( start : & Self , end : & Self ) -> ( usize , Option < usize > ) {
364369 Self :: steps_between_impl ( start, end)
365370 }
366371
@@ -721,43 +726,49 @@ mod tests {
721726 #[ test]
722727 #[ cfg( feature = "step_trait" ) ]
723728 fn virtaddr_steps_between ( ) {
724- assert_eq ! ( Step :: steps_between( & VirtAddr ( 0 ) , & VirtAddr ( 0 ) ) , Some ( 0 ) ) ;
725- assert_eq ! ( Step :: steps_between( & VirtAddr ( 0 ) , & VirtAddr ( 1 ) ) , Some ( 1 ) ) ;
726- assert_eq ! ( Step :: steps_between( & VirtAddr ( 1 ) , & VirtAddr ( 0 ) ) , None ) ;
729+ assert_eq ! (
730+ Step :: steps_between( & VirtAddr ( 0 ) , & VirtAddr ( 0 ) ) ,
731+ ( 0 , Some ( 0 ) )
732+ ) ;
733+ assert_eq ! (
734+ Step :: steps_between( & VirtAddr ( 0 ) , & VirtAddr ( 1 ) ) ,
735+ ( 1 , Some ( 1 ) )
736+ ) ;
737+ assert_eq ! ( Step :: steps_between( & VirtAddr ( 1 ) , & VirtAddr ( 0 ) ) , ( 0 , None ) ) ;
727738 assert_eq ! (
728739 Step :: steps_between(
729740 & VirtAddr ( 0x7fff_ffff_ffff ) ,
730741 & VirtAddr ( 0xffff_8000_0000_0000 )
731742 ) ,
732- Some ( 1 )
743+ ( 1 , Some ( 1 ) )
733744 ) ;
734745 assert_eq ! (
735746 Step :: steps_between(
736747 & VirtAddr ( 0xffff_8000_0000_0000 ) ,
737748 & VirtAddr ( 0x7fff_ffff_ffff )
738749 ) ,
739- None
750+ ( 0 , None )
740751 ) ;
741752 assert_eq ! (
742753 Step :: steps_between(
743754 & VirtAddr ( 0xffff_8000_0000_0000 ) ,
744755 & VirtAddr ( 0xffff_8000_0000_0000 )
745756 ) ,
746- Some ( 0 )
757+ ( 0 , Some ( 0 ) )
747758 ) ;
748759 assert_eq ! (
749760 Step :: steps_between(
750761 & VirtAddr ( 0xffff_8000_0000_0000 ) ,
751762 & VirtAddr ( 0xffff_8000_0000_0001 )
752763 ) ,
753- Some ( 1 )
764+ ( 1 , Some ( 1 ) )
754765 ) ;
755766 assert_eq ! (
756767 Step :: steps_between(
757768 & VirtAddr ( 0xffff_8000_0000_0001 ) ,
758769 & VirtAddr ( 0xffff_8000_0000_0000 )
759770 ) ,
760- None
771+ ( 0 , None )
761772 ) ;
762773 }
763774
@@ -951,7 +962,7 @@ mod proofs {
951962 } ;
952963
953964 // ...then `steps_between` succeeds as well.
954- assert ! ( Step :: steps_between( & start, & end) == Some ( count) ) ;
965+ assert ! ( Step :: steps_between( & start, & end) == ( count , Some ( count) ) ) ;
955966 }
956967
957968 // This harness proves that for all inputs for which `steps_between`
@@ -968,7 +979,7 @@ mod proofs {
968979 } ;
969980
970981 // If `steps_between` succeeds...
971- let Some ( count) = Step :: steps_between ( & start, & end) else {
982+ let Some ( count) = Step :: steps_between ( & start, & end) . 1 else {
972983 return ;
973984 } ;
974985
0 commit comments