File tree Expand file tree Collapse file tree 2 files changed +16
-2
lines changed Expand file tree Collapse file tree 2 files changed +16
-2
lines changed Original file line number Diff line number Diff line change @@ -46,7 +46,21 @@ impl Instant {
46
46
InstantKind :: Virtual { nanoseconds : earlier } ,
47
47
) => {
48
48
let duration = nanoseconds. saturating_sub ( earlier) ;
49
- Duration :: from_nanos_u128 ( duration)
49
+ cfg_select ! {
50
+ bootstrap => {
51
+ // `Duration` does not provide a nice constructor from a `u128` of nanoseconds,
52
+ // so we have to implement this ourselves.
53
+ // It is possible for second to overflow because u64::MAX < (u128::MAX / 1e9).
54
+ // It will be saturated to u64::MAX seconds if the value after division exceeds u64::MAX.
55
+ let seconds = u64 :: try_from( duration / 1_000_000_000 ) . unwrap_or( u64 :: MAX ) ;
56
+ // It is impossible for nanosecond to overflow because u32::MAX > 1e9.
57
+ let nanosecond = u32 :: try_from( duration. wrapping_rem( 1_000_000_000 ) ) . unwrap( ) ;
58
+ Duration :: new( seconds, nanosecond)
59
+ }
60
+ _ => {
61
+ Duration :: from_nanos_u128( duration)
62
+ }
63
+ }
50
64
}
51
65
_ => panic ! ( "all `Instant` must be of the same kind" ) ,
52
66
}
Original file line number Diff line number Diff line change 18
18
#![ feature( derive_coerce_pointee) ]
19
19
#![ feature( arbitrary_self_types) ]
20
20
#![ feature( iter_advance_by) ]
21
- #![ feature( duration_from_nanos_u128) ]
21
+ #![ cfg_attr ( not ( bootstrap ) , feature( duration_from_nanos_u128) ) ]
22
22
// Configure clippy and other lints
23
23
#![ allow(
24
24
clippy:: collapsible_else_if,
You can’t perform that action at this time.
0 commit comments