@@ -25,7 +25,7 @@ use rustc_middle::{
25
25
} ,
26
26
} ;
27
27
use rustc_span:: def_id:: { CrateNum , DefId } ;
28
- use rustc_span:: Symbol ;
28
+ use rustc_span:: { Span , Symbol } ;
29
29
use rustc_target:: abi:: Size ;
30
30
use rustc_target:: spec:: abi:: Abi ;
31
31
@@ -415,6 +415,10 @@ impl<'mir, 'tcx> Evaluator<'mir, 'tcx> {
415
415
let def_id = frame. instance . def_id ( ) ;
416
416
def_id. is_local ( ) || self . local_crates . contains ( & def_id. krate )
417
417
}
418
+
419
+ pub ( crate ) fn current_span ( & self ) -> CurrentSpan < ' _ , ' mir , ' tcx > {
420
+ CurrentSpan { span : None , machine : self }
421
+ }
418
422
}
419
423
420
424
/// A rustc InterpCx for Miri.
@@ -580,8 +584,7 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'mir, 'tcx> {
580
584
alloc. size ( ) ,
581
585
stacked_borrows,
582
586
kind,
583
- & ecx. machine . threads ,
584
- ecx. machine . local_crates . clone ( ) ,
587
+ ecx. machine . current_span ( ) ,
585
588
) )
586
589
} else {
587
590
None
@@ -663,7 +666,7 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'mir, 'tcx> {
663
666
tag,
664
667
range,
665
668
machine. stacked_borrows . as_ref ( ) . unwrap ( ) ,
666
- & machine. threads ,
669
+ machine. current_span ( ) ,
667
670
)
668
671
} else {
669
672
Ok ( ( ) )
@@ -687,7 +690,7 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'mir, 'tcx> {
687
690
tag,
688
691
range,
689
692
machine. stacked_borrows . as_ref ( ) . unwrap ( ) ,
690
- & machine. threads ,
693
+ machine. current_span ( ) ,
691
694
)
692
695
} else {
693
696
Ok ( ( ) )
@@ -789,3 +792,33 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'mir, 'tcx> {
789
792
res
790
793
}
791
794
}
795
+
796
+ #[ derive( Clone ) ]
797
+ pub struct CurrentSpan < ' a , ' tcx , ' mir > {
798
+ span : Option < Span > ,
799
+ machine : & ' a Evaluator < ' tcx , ' mir > ,
800
+ }
801
+
802
+ impl < ' a , ' tcx , ' mir > CurrentSpan < ' a , ' tcx , ' mir > {
803
+ pub fn get ( & mut self ) -> rustc_span:: Span {
804
+ if self . span . is_none ( ) {
805
+ self . span = Some ( self . current_span ( ) ) ;
806
+ }
807
+ self . span . unwrap ( )
808
+ }
809
+
810
+ #[ inline( never) ]
811
+ fn current_span ( & self ) -> Span {
812
+ self . machine
813
+ . threads
814
+ . active_thread_stack ( )
815
+ . into_iter ( )
816
+ . rev ( )
817
+ . find ( |frame| {
818
+ let def_id = frame. instance . def_id ( ) ;
819
+ def_id. is_local ( ) || self . machine . local_crates . contains ( & def_id. krate )
820
+ } )
821
+ . map ( |frame| frame. current_span ( ) )
822
+ . unwrap_or ( rustc_span:: DUMMY_SP )
823
+ }
824
+ }
0 commit comments