}
};
- // Grab the TypeRef type of box_ptr_ty.
- let box_ptr_ty = mk_fn(bcx.tcx(), t);
- let llty = type_of(ccx, box_ptr_ty);
-
- // Get the tydesc for the body:
- let static_ti = get_tydesc(ccx, t);
- glue::lazily_emit_all_tydesc_glue(ccx, static_ti);
-
- // Allocate space:
- let tydesc = PointerCast(bcx, static_ti.tydesc, Type::i8p());
- let rval = alloca(bcx, Type::i8p());
- let bcx = callee::trans_lang_call(
- bcx,
- langcall,
- [tydesc, size],
- expr::SaveIn(rval));
- let r = rslt(bcx, PointerCast(bcx, Load(bcx, rval), llty));
- maybe_set_managed_unique_rc(r.bcx, r.val, heap);
- r
+ if heap == heap_exchange {
+ // Grab the TypeRef type of box_ptr_ty.
+ let box_ptr_ty = mk_fn(bcx.tcx(), t);
+ let llty = type_of(ccx, box_ptr_ty);
+
+ let llty_value = type_of::type_of(ccx, t);
+ let llalign = llalign_of_min(ccx, llty_value);
+
+ // Allocate space:
+ let rval = alloca(bcx, Type::i8p());
+ let bcx = callee::trans_lang_call(
+ bcx,
+ langcall,
+ [C_i32(llalign as i32), size],
+ expr::SaveIn(rval));
+ rslt(bcx, PointerCast(bcx, Load(bcx, rval), llty))
+ } else {
+ // Grab the TypeRef type of box_ptr_ty.
+ let box_ptr_ty = mk_fn(bcx.tcx(), t);
+ let llty = type_of(ccx, box_ptr_ty);
+
+ // Get the tydesc for the body:
+ let static_ti = get_tydesc(ccx, t);
+ glue::lazily_emit_all_tydesc_glue(ccx, static_ti);
+
+ // Allocate space:
+ let tydesc = PointerCast(bcx, static_ti.tydesc, Type::i8p());
+ let rval = alloca(bcx, Type::i8p());
+ let bcx = callee::trans_lang_call(
+ bcx,
+ langcall,
+ [tydesc, size],
+ expr::SaveIn(rval));
+ let r = rslt(bcx, PointerCast(bcx, Load(bcx, rval), llty));
+ maybe_set_managed_unique_rc(r.bcx, r.val, heap);
+ r
+ }
}
// malloc_raw: expects an unboxed type and returns a pointer to
#[cfg(not(stage0), not(test))]
#[lang="exchange_malloc"]
#[inline]
-pub unsafe fn exchange_malloc(td: *c_char, size: uintptr_t) -> *c_char {
- let td = td as *TyDesc;
- let size = size as uint;
-
- assert!(td.is_not_null());
-
- let total_size = get_box_size(size, (*td).align);
+pub unsafe fn exchange_malloc(align: u32, size: uintptr_t) -> *c_char {
+ let total_size = get_box_size(size as uint, align as uint);
malloc_raw(total_size as uint) as *c_char
}