diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2013-06-30 23:30:40 -0400 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2013-06-30 23:30:40 -0400 |
| commit | 5b40f2ae5b4357a9488bd97da011bd07aebf6aaa (patch) | |
| tree | a18f2744b792d5698140b397247f45978e89c953 /src | |
| parent | 0d7799d3048eea4039d59c0cca98449e1c52a561 (diff) | |
| download | rust-5b40f2ae5b4357a9488bd97da011bd07aebf6aaa.tar.gz rust-5b40f2ae5b4357a9488bd97da011bd07aebf6aaa.zip | |
pass exchange_malloc an alignment, not a tydesc
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/middle/trans/base.rs | 56 | ||||
| -rw-r--r-- | src/libstd/rt/global_heap.rs | 9 |
2 files changed, 39 insertions, 26 deletions
diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index cf671bdce67..411cbcbe9eb 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -258,25 +258,43 @@ pub fn malloc_raw_dyn(bcx: block, } }; - // 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 diff --git a/src/libstd/rt/global_heap.rs b/src/libstd/rt/global_heap.rs index 1e0ad3352fe..1020580d52c 100644 --- a/src/libstd/rt/global_heap.rs +++ b/src/libstd/rt/global_heap.rs @@ -80,13 +80,8 @@ pub unsafe fn exchange_malloc(td: *c_char, size: uintptr_t) -> *c_char { #[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 } |
