]> git.lizzy.rs Git - rust.git/commitdiff
pass exchange_malloc an alignment, not a tydesc
authorDaniel Micay <danielmicay@gmail.com>
Mon, 1 Jul 2013 03:30:40 +0000 (23:30 -0400)
committerDaniel Micay <danielmicay@gmail.com>
Mon, 1 Jul 2013 03:30:40 +0000 (23:30 -0400)
src/librustc/middle/trans/base.rs
src/libstd/rt/global_heap.rs

index cf671bdce6776e8ce2bfff0158157ff299c4646c..411cbcbe9eb76a9caf34801347728638f73b5f3e 100644 (file)
@@ -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
index 1e0ad3352fef770441363eecb1877dde4e8dbc8d..1020580d52c008de48056ed273e45fbf93f3517e 100644 (file)
@@ -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
 }