Add a ret_style field to fn_ctxt in trans

This commit is contained in:
Marijn Haverbeke 2011-09-14 13:48:51 +02:00
parent 2aac43d809
commit 6cd24173d4
2 changed files with 19 additions and 9 deletions

View file

@ -2706,7 +2706,8 @@ fn trans_for_each(cx: @block_ctxt, local: @ast::local, seq: @ast::expr,
ty::mk_iter_body_fn(lcx.ccx.tcx, decl_ty), 0u);
let lliterbody: ValueRef =
decl_internal_fastcall_fn(lcx.ccx.llmod, s, iter_body_llty);
let fcx = new_fn_ctxt_w_id(lcx, cx.sp, lliterbody, body.node.id);
let fcx = new_fn_ctxt_w_id(lcx, cx.sp, lliterbody, body.node.id,
ast::return_val);
fcx.iterbodyty = cx.fcx.iterbodyty;
// Generate code to load the environment out of the
@ -4383,8 +4384,11 @@ fn trans_ret(cx: @block_ctxt, e: option::t<@ast::expr>) -> result {
let t = ty::expr_ty(bcx_tcx(cx), x);
let lv = trans_lval(cx, x);
bcx = lv.res.bcx;
let is_local =
alt x.node {
if cx.fcx.ret_style == ast::return_ref {
assert lv.is_mem;
Store(bcx, cx.fcx.llretptr, lv.res.val);
} else {
let is_local = alt x.node {
ast::expr_path(p) {
alt bcx_tcx(bcx).def_map.get(x.id) {
ast::def_local(_) { true }
@ -4393,9 +4397,12 @@ fn trans_ret(cx: @block_ctxt, e: option::t<@ast::expr>) -> result {
}
_ { false }
};
if is_local {
bcx = move_val(bcx, INIT, cx.fcx.llretptr, lv, t);
} else { bcx = move_val_if_temp(bcx, INIT, cx.fcx.llretptr, lv, t); }
if is_local {
bcx = move_val(bcx, INIT, cx.fcx.llretptr, lv, t);
} else {
bcx = move_val_if_temp(bcx, INIT, cx.fcx.llretptr, lv, t);
}
}
}
_ {
let t = llvm::LLVMGetElementType(val_ty(cx.fcx.llretptr));
@ -4822,7 +4829,8 @@ fn mk_standard_basic_blocks(llfn: ValueRef) ->
// - new_fn_ctxt
// - trans_args
fn new_fn_ctxt_w_id(cx: @local_ctxt, sp: span, llfndecl: ValueRef,
id: ast::node_id) -> @fn_ctxt {
id: ast::node_id, rstyle: ast::ret_style)
-> @fn_ctxt {
let llbbs = mk_standard_basic_blocks(llfndecl);
ret @{llfn: llfndecl,
lltaskptr: llvm::LLVMGetParam(llfndecl, 1u),
@ -4845,12 +4853,13 @@ fn new_fn_ctxt_w_id(cx: @local_ctxt, sp: span, llfndecl: ValueRef,
mutable lltydescs: [],
derived_tydescs: map::mk_hashmap(ty::hash_ty, ty::eq_ty),
id: id,
ret_style: rstyle,
sp: sp,
lcx: cx};
}
fn new_fn_ctxt(cx: @local_ctxt, sp: span, llfndecl: ValueRef) -> @fn_ctxt {
be new_fn_ctxt_w_id(cx, sp, llfndecl, -1);
ret new_fn_ctxt_w_id(cx, sp, llfndecl, -1, ast::return_val);
}
// NB: must keep 4 fns in sync:
@ -5024,7 +5033,7 @@ fn trans_closure(bcx_maybe: option::t<@block_ctxt>,
set_uwtable(llfndecl);
// Set up arguments to the function.
let fcx = new_fn_ctxt_w_id(cx, sp, llfndecl, id);
let fcx = new_fn_ctxt_w_id(cx, sp, llfndecl, id, f.decl.cf);
create_llargs_for_fn_args(fcx, f.proto, ty_self,
ty::ret_ty_of_fn(cx.ccx.tcx, id), f.decl.inputs,
ty_params);

View file

@ -261,6 +261,7 @@ type fn_ctxt =
mutable lltydescs: [ValueRef],
derived_tydescs: hashmap<ty::t, derived_tydesc_info>,
id: ast::node_id,
ret_style: ast::ret_style,
sp: span,
lcx: @local_ctxt};