@@ -792,26 +792,37 @@ macro_rules! visit_place_fns {
792
792
) {
793
793
self . visit_place_base( & mut place. base, context, location) ;
794
794
795
- place. projection = self . process_projection( & place. projection) ;
795
+ if let Some ( new_projection) = self . process_projection( & place. projection) {
796
+ place. projection = new_projection;
797
+ }
796
798
}
797
799
798
800
fn process_projection(
799
801
& mut self ,
800
- projection: & Box <[ PlaceElem <' tcx>] >,
801
- ) -> Box <[ PlaceElem <' tcx>] > {
802
- let new_projection: Vec <_> = projection. iter( ) . map( |elem|
803
- self . process_projection_elem( elem)
804
- ) . collect( ) ;
802
+ projection: & ' a [ PlaceElem <' tcx>] ,
803
+ ) -> Option <Box <[ PlaceElem <' tcx>] >> {
804
+ let mut projection = Cow :: Borrowed ( projection) ;
805
+
806
+ for i in 0 ..projection. len( ) {
807
+ if let Some ( elem) = projection. get( i) {
808
+ if let Cow :: Owned ( elem) = self . process_projection_elem( Cow :: Borrowed ( elem) ) {
809
+ let vec = projection. to_mut( ) ;
810
+ vec[ i] = elem;
811
+ }
812
+ }
813
+ }
805
814
806
- new_projection. into_boxed_slice( )
815
+ match projection {
816
+ Cow :: Borrowed ( _) => None ,
817
+ Cow :: Owned ( vec) => Some ( vec. into_boxed_slice( ) ) ,
818
+ }
807
819
}
808
820
809
821
fn process_projection_elem(
810
822
& mut self ,
811
- elem: & PlaceElem <' tcx>,
812
- ) -> PlaceElem <' tcx> {
813
- // FIXME: avoid cloning here
814
- elem. clone( )
823
+ elem: Cow <' a, PlaceElem <' tcx>>,
824
+ ) -> Cow <' a, PlaceElem <' tcx>> {
825
+ elem
815
826
}
816
827
) ;
817
828
0 commit comments