@@ -144,14 +144,18 @@ impl Evaluator<'_> {
144
144
let [ ptr, old_size, align, new_size] = args else {
145
145
return Err ( MirEvalError :: TypeError ( "rustc_allocator args are not provided" ) ) ;
146
146
} ;
147
- let ptr = Address :: from_bytes ( ptr. get ( self ) ?) ?;
148
147
let old_size = from_bytes ! ( usize , old_size. get( self ) ?) ;
149
148
let new_size = from_bytes ! ( usize , new_size. get( self ) ?) ;
150
- let align = from_bytes ! ( usize , align. get( self ) ?) ;
151
- let result = self . heap_allocate ( new_size, align) ;
152
- Interval { addr : result, size : old_size }
153
- . write_from_interval ( self , Interval { addr : ptr, size : old_size } ) ?;
154
- destination. write_from_bytes ( self , & result. to_bytes ( ) ) ?;
149
+ if old_size >= new_size {
150
+ destination. write_from_interval ( self , ptr. interval ) ?;
151
+ } else {
152
+ let ptr = Address :: from_bytes ( ptr. get ( self ) ?) ?;
153
+ let align = from_bytes ! ( usize , align. get( self ) ?) ;
154
+ let result = self . heap_allocate ( new_size, align) ;
155
+ Interval { addr : result, size : old_size }
156
+ . write_from_interval ( self , Interval { addr : ptr, size : old_size } ) ?;
157
+ destination. write_from_bytes ( self , & result. to_bytes ( ) ) ?;
158
+ }
155
159
}
156
160
_ => not_supported ! ( "unknown alloc function" ) ,
157
161
}
0 commit comments