@@ -81,14 +81,9 @@ pub struct Frame<'mir, 'tcx, Tag = (), Extra = ()> {
81
81
////////////////////////////////////////////////////////////////////////////////
82
82
// Current position within the function
83
83
////////////////////////////////////////////////////////////////////////////////
84
- /// The block that is currently executed (or will be executed after the above call stacks
85
- /// return).
86
84
/// If this is `None`, we are unwinding and this function doesn't need any clean-up.
87
85
/// Just continue the same as with `Resume`.
88
- pub block : Option < mir:: BasicBlock > ,
89
-
90
- /// The index of the currently evaluated statement.
91
- pub stmt : usize ,
86
+ pub loc : Option < mir:: Location > ,
92
87
}
93
88
94
89
#[ derive( Clone , Eq , PartialEq , Debug , HashStable ) ] // Miri debug-prints these
@@ -168,8 +163,7 @@ impl<'mir, 'tcx, Tag> Frame<'mir, 'tcx, Tag> {
168
163
return_to_block : self . return_to_block ,
169
164
return_place : self . return_place ,
170
165
locals : self . locals ,
171
- block : self . block ,
172
- stmt : self . stmt ,
166
+ loc : self . loc ,
173
167
extra,
174
168
}
175
169
}
@@ -178,10 +172,10 @@ impl<'mir, 'tcx, Tag> Frame<'mir, 'tcx, Tag> {
178
172
impl < ' mir , ' tcx , Tag , Extra > Frame < ' mir , ' tcx , Tag , Extra > {
179
173
/// Return the `SourceInfo` of the current instruction.
180
174
pub fn current_source_info ( & self ) -> Option < mir:: SourceInfo > {
181
- self . block . map ( |block | {
182
- let block = & self . body . basic_blocks ( ) [ block] ;
183
- if self . stmt < block. statements . len ( ) {
184
- block. statements [ self . stmt ] . source_info
175
+ self . loc . map ( |loc | {
176
+ let block = & self . body . basic_blocks ( ) [ loc . block ] ;
177
+ if loc . statement_index < block. statements . len ( ) {
178
+ block. statements [ loc . statement_index ] . source_info
185
179
} else {
186
180
block. terminator ( ) . source_info
187
181
}
@@ -615,14 +609,13 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
615
609
// first push a stack frame so we have access to the local substs
616
610
let pre_frame = Frame {
617
611
body,
618
- block : Some ( mir:: START_BLOCK ) ,
612
+ loc : Some ( mir:: Location :: START ) ,
619
613
return_to_block,
620
614
return_place,
621
615
// empty local array, we fill it in below, after we are inside the stack frame and
622
616
// all methods actually know about the frame
623
617
locals : IndexVec :: new ( ) ,
624
618
instance,
625
- stmt : 0 ,
626
619
extra : ( ) ,
627
620
} ;
628
621
let frame = M :: init_frame_extra ( self , pre_frame) ?;
@@ -671,9 +664,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
671
664
/// Jump to the given block.
672
665
#[ inline]
673
666
pub fn go_to_block ( & mut self , target : mir:: BasicBlock ) {
674
- let frame = self . frame_mut ( ) ;
675
- frame. block = Some ( target) ;
676
- frame. stmt = 0 ;
667
+ self . frame_mut ( ) . loc = Some ( mir:: Location { block : target, statement_index : 0 } ) ;
677
668
}
678
669
679
670
/// *Return* to the given `target` basic block.
@@ -695,9 +686,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
695
686
/// If `target` is `None`, that indicates the function does not need cleanup during
696
687
/// unwinding, and we will just keep propagating that upwards.
697
688
pub fn unwind_to_block ( & mut self , target : Option < mir:: BasicBlock > ) {
698
- let frame = self . frame_mut ( ) ;
699
- frame. block = target;
700
- frame. stmt = 0 ;
689
+ self . frame_mut ( ) . loc = target. map ( |block| mir:: Location { block, statement_index : 0 } ) ;
701
690
}
702
691
703
692
/// Pops the current frame from the stack, deallocating the
@@ -724,9 +713,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
724
713
// Sanity check `unwinding`.
725
714
assert_eq ! (
726
715
unwinding,
727
- match self . frame( ) . block {
716
+ match self . frame( ) . loc {
728
717
None => true ,
729
- Some ( block ) => self . body( ) . basic_blocks( ) [ block] . is_cleanup,
718
+ Some ( loc ) => self . body( ) . basic_blocks( ) [ loc . block] . is_cleanup,
730
719
}
731
720
) ;
732
721
@@ -987,13 +976,14 @@ where
987
976
Tag : HashStable < StableHashingContext < ' ctx > > ,
988
977
{
989
978
fn hash_stable ( & self , hcx : & mut StableHashingContext < ' ctx > , hasher : & mut StableHasher ) {
990
- self . body . hash_stable ( hcx, hasher) ;
991
- self . instance . hash_stable ( hcx, hasher) ;
992
- self . return_to_block . hash_stable ( hcx, hasher) ;
993
- self . return_place . as_ref ( ) . map ( |r| & * * r) . hash_stable ( hcx, hasher) ;
994
- self . locals . hash_stable ( hcx, hasher) ;
995
- self . block . hash_stable ( hcx, hasher) ;
996
- self . stmt . hash_stable ( hcx, hasher) ;
997
- self . extra . hash_stable ( hcx, hasher) ;
979
+ // Exhaustive match on fields to make sure we forget no field.
980
+ let Frame { body, instance, return_to_block, return_place, locals, loc, extra } = self ;
981
+ body. hash_stable ( hcx, hasher) ;
982
+ instance. hash_stable ( hcx, hasher) ;
983
+ return_to_block. hash_stable ( hcx, hasher) ;
984
+ return_place. as_ref ( ) . map ( |r| & * * r) . hash_stable ( hcx, hasher) ;
985
+ locals. hash_stable ( hcx, hasher) ;
986
+ loc. hash_stable ( hcx, hasher) ;
987
+ extra. hash_stable ( hcx, hasher) ;
998
988
}
999
989
}
0 commit comments