@@ -114,28 +114,36 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
114114 }
115115
116116 // Call CopyNonOverlapping
117- CopyNonOverlapping ( box rustc_middle:: mir:: CopyNonOverlapping { dst, src, size } ) => {
118- let size = self . eval_operand ( size, None ) ?;
117+ CopyNonOverlapping ( box rustc_middle:: mir:: CopyNonOverlapping { dst, src, count } ) => {
118+ let ( src, size) = {
119+ let src = self . eval_operand ( src, None ) ?;
120+ let size = src. layout . layout . size ;
121+ let mplace = * src. assert_mem_place ( self ) ;
122+ let ptr = match mplace. ptr {
123+ Scalar :: Ptr ( ptr) => ptr,
124+ _ => panic ! ( ) ,
125+ } ;
126+ ( ptr, size)
127+ } ;
119128
120129 let dst = {
121130 let dst = self . eval_operand ( dst, None ) ?;
122131 let mplace = * dst. assert_mem_place ( self ) ;
123132 match mplace. ptr {
124- Scalar :: Ptr ( ptr) => ptr,
125- _ => panic ! ( ) ,
133+ Scalar :: Ptr ( ptr) => ptr,
134+ _ => panic ! ( ) ,
126135 }
127136 } ;
128- let src = {
129- let src = self . eval_operand ( src , None ) ?;
130- let mplace = * src . assert_mem_place ( self ) ;
131- match mplace . ptr {
132- Scalar :: Ptr ( ptr ) => ptr ,
133- _ => panic ! ( ) ,
134- }
137+
138+ let count = self . eval_operand ( count , None ) ?;
139+ let count = self . read_immediate ( count ) ? . to_scalar ( ) ? ;
140+ let count = if let Scalar :: Int ( i ) = count {
141+ core :: convert :: TryFrom :: try_from ( i ) . unwrap ( )
142+ } else {
143+ panic ! ( ) ;
135144 } ;
136- // Not sure how to convert an MPlaceTy<'_, <M as Machine<'_, '_>>::PointerTag>
137- // to a pointer, or OpTy to a size
138- self . memory . copy ( src, dst, size. layout . layout . size , /*nonoverlapping*/ true ) ?;
145+
146+ self . memory . copy_repeatedly ( src, dst, size, count, /*nonoverlapping*/ true ) ?;
139147 }
140148
141149 // Statements we do not track.
0 commit comments