aboutsummaryrefslogtreecommitdiff
path: root/src/comp/middle
diff options
context:
space:
mode:
Diffstat (limited to 'src/comp/middle')
-rw-r--r--src/comp/middle/trans.rs31
1 files changed, 17 insertions, 14 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 28b22ea2..09dad4bc 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -5215,20 +5215,25 @@ fn init_local(@block_ctxt cx, @ast.local local) -> result {
}
}
case (_) {
- if (middle.ty.type_has_dynamic_size(ty)) {
- auto llsz = size_of(bcx, ty);
- bcx = call_bzero(llsz.bcx, llptr, llsz.val).bcx;
-
- } else {
- auto llty = type_of(bcx.fcx.ccx, ty);
- auto null = lib.llvm.llvm.LLVMConstNull(llty);
- bcx.build.Store(null, llptr);
- }
+ bcx = zero_alloca(bcx, llptr, ty).bcx;
}
}
ret res(bcx, llptr);
}
+fn zero_alloca(@block_ctxt cx, ValueRef llptr, @ty.t t) -> result {
+ auto bcx = cx;
+ if (ty.type_has_dynamic_size(t)) {
+ auto llsz = size_of(bcx, t);
+ bcx = call_bzero(llsz.bcx, llptr, llsz.val).bcx;
+ } else {
+ auto llty = type_of(bcx.fcx.ccx, t);
+ auto null = lib.llvm.llvm.LLVMConstNull(llty);
+ bcx.build.Store(null, llptr);
+ }
+ ret res(bcx, llptr);
+ }
+
fn trans_stmt(@block_ctxt cx, &ast.stmt s) -> result {
auto bcx = cx;
alt (s.node) {
@@ -5407,8 +5412,7 @@ fn trans_block(@block_ctxt cx, &ast.block b) -> result {
ret r;
} else {
auto r_ty = ty.expr_ty(e);
-
- if (ty.type_is_boxed(r_ty)) {
+ if (!ty.type_is_nil(r_ty)) {
// The value resulting from the block gets copied into an
// alloca created in an outer scope and its refcount
// bumped so that it can escape this block. This means
@@ -5424,9 +5428,8 @@ fn trans_block(@block_ctxt cx, &ast.block b) -> result {
// NB: Here we're building and initalizing the alloca in
// the alloca context, not this block's context.
auto res_alloca = alloc_ty(bcx, r_ty);
- auto alloca_ty = type_of(bcx.fcx.ccx, r_ty);
- auto builder = new_builder(bcx.fcx.llallocas);
- builder.Store(C_null(alloca_ty), res_alloca.val);
+ auto llbcx = llallocas_block_ctxt(bcx.fcx);
+ zero_alloca(llbcx, res_alloca.val, r_ty);
// Now we're working in our own block context again
auto res_copy = copy_ty(bcx, INIT,