@@ -258,25 +258,43 @@ pub fn malloc_raw_dyn(bcx: block,
258
258
}
259
259
} ;
260
260
261
- // Grab the TypeRef type of box_ptr_ty.
262
- let box_ptr_ty = mk_fn ( bcx. tcx ( ) , t) ;
263
- let llty = type_of ( ccx, box_ptr_ty) ;
264
-
265
- // Get the tydesc for the body:
266
- let static_ti = get_tydesc ( ccx, t) ;
267
- glue:: lazily_emit_all_tydesc_glue ( ccx, static_ti) ;
268
-
269
- // Allocate space:
270
- let tydesc = PointerCast ( bcx, static_ti. tydesc , Type :: i8p ( ) ) ;
271
- let rval = alloca ( bcx, Type :: i8p ( ) ) ;
272
- let bcx = callee:: trans_lang_call (
273
- bcx,
274
- langcall,
275
- [ tydesc, size] ,
276
- expr:: SaveIn ( rval) ) ;
277
- let r = rslt ( bcx, PointerCast ( bcx, Load ( bcx, rval) , llty) ) ;
278
- maybe_set_managed_unique_rc ( r. bcx , r. val , heap) ;
279
- r
261
+ if heap == heap_exchange {
262
+ // Grab the TypeRef type of box_ptr_ty.
263
+ let box_ptr_ty = mk_fn ( bcx. tcx ( ) , t) ;
264
+ let llty = type_of ( ccx, box_ptr_ty) ;
265
+
266
+ let llty_value = type_of:: type_of ( ccx, t) ;
267
+ let llalign = llalign_of_min ( ccx, llty_value) ;
268
+
269
+ // Allocate space:
270
+ let rval = alloca ( bcx, Type :: i8p ( ) ) ;
271
+ let bcx = callee:: trans_lang_call (
272
+ bcx,
273
+ langcall,
274
+ [ C_i32 ( llalign as i32 ) , size] ,
275
+ expr:: SaveIn ( rval) ) ;
276
+ rslt ( bcx, PointerCast ( bcx, Load ( bcx, rval) , llty) )
277
+ } else {
278
+ // Grab the TypeRef type of box_ptr_ty.
279
+ let box_ptr_ty = mk_fn ( bcx. tcx ( ) , t) ;
280
+ let llty = type_of ( ccx, box_ptr_ty) ;
281
+
282
+ // Get the tydesc for the body:
283
+ let static_ti = get_tydesc ( ccx, t) ;
284
+ glue:: lazily_emit_all_tydesc_glue ( ccx, static_ti) ;
285
+
286
+ // Allocate space:
287
+ let tydesc = PointerCast ( bcx, static_ti. tydesc , Type :: i8p ( ) ) ;
288
+ let rval = alloca ( bcx, Type :: i8p ( ) ) ;
289
+ let bcx = callee:: trans_lang_call (
290
+ bcx,
291
+ langcall,
292
+ [ tydesc, size] ,
293
+ expr:: SaveIn ( rval) ) ;
294
+ let r = rslt ( bcx, PointerCast ( bcx, Load ( bcx, rval) , llty) ) ;
295
+ maybe_set_managed_unique_rc ( r. bcx , r. val , heap) ;
296
+ r
297
+ }
280
298
}
281
299
282
300
// malloc_raw: expects an unboxed type and returns a pointer to
0 commit comments