Skip to content

Commit 3ae14d3

Browse files
committed
---
yaml --- r: 5605 b: refs/heads/master c: 508c48c h: refs/heads/master i: 5603: 56abdb1 v: v3
1 parent 492274b commit 3ae14d3

File tree

2 files changed

+36
-21
lines changed

2 files changed

+36
-21
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 15e34deba3efa7c064bf9ffe0fa1eff47f9b117e
2+
refs/heads/master: 508c48ce10bc7d7e5d4ff7c1f1053f113867b9bc

trunk/src/comp/middle/trans.rs

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3207,6 +3207,25 @@ fn trans_callee(cx: @block_ctxt, e: @ast::expr) -> lval_maybe_callee {
32073207
}
32083208
}
32093209

3210+
fn expr_is_lval(tcx: ty::ctxt, e: @ast::expr) -> bool {
3211+
alt e.node {
3212+
ast::expr_path(_) | ast::expr_index(_, _) |
3213+
ast::expr_unary(ast::deref., _) { true }
3214+
ast::expr_field(base, ident) {
3215+
let basety = ty::type_autoderef(tcx, ty::expr_ty(tcx, base));
3216+
alt ty::struct(tcx, basety) {
3217+
ty::ty_obj(_) { false }
3218+
ty::ty_rec(_) { true }
3219+
}
3220+
}
3221+
ast::expr_call(f, _) {
3222+
let fty = ty::expr_ty(tcx, f);
3223+
ast_util::ret_by_ref(ty::ty_fn_ret_style(tcx, fty))
3224+
}
3225+
_ { false }
3226+
}
3227+
}
3228+
32103229
// The additional bool returned indicates whether it's mem (that is
32113230
// represented as an alloca or heap, hence needs a 'load' to be used as an
32123231
// immediate).
@@ -4149,20 +4168,6 @@ fn trans_expr(cx: @block_ctxt, e: @ast::expr) -> result {
41494168
add_clean_temp(bcx, r.val, e_ty);
41504169
ret r;
41514170
}
4152-
ast::expr_move(dst, src) {
4153-
let lhs_res = trans_lval(cx, dst);
4154-
assert (lhs_res.is_mem);
4155-
// FIXME Fill in lhs_res.bcx.sp
4156-
4157-
let rhs_res = trans_lval(lhs_res.bcx, src);
4158-
let t = ty::expr_ty(bcx_tcx(cx), src);
4159-
// FIXME: calculate copy init-ness in typestate.
4160-
4161-
let bcx =
4162-
move_val(rhs_res.bcx, DROP_EXISTING, lhs_res.val, rhs_res,
4163-
t);
4164-
ret rslt(bcx, C_nil());
4165-
}
41664171
ast::expr_bind(f, args) { ret trans_bind(cx, f, args, e.id); }
41674172
ast::expr_cast(val, _) { ret trans_cast(cx, val, e.id); }
41684173
ast::expr_anon_obj(anon_obj) {
@@ -4325,6 +4330,19 @@ fn trans_expr_dps(bcx: @block_ctxt, e: @ast::expr, dest: dest)
43254330
assert is_mem;
43264331
ret trans_expr_save_in(bcx, src, lhs_addr, DROP_EXISTING);
43274332
}
4333+
ast::expr_move(dst, src) {
4334+
assert dest == ignore;
4335+
let {bcx, val: addr, is_mem} = trans_lval(bcx, dst);
4336+
assert is_mem;
4337+
// FIXME: calculate copy init-ness in typestate.
4338+
if expr_is_lval(bcx_tcx(bcx), src) {
4339+
ret trans_expr_save_in(bcx, src, addr, DROP_EXISTING);
4340+
} else {
4341+
let srclv = trans_lval(bcx, src);
4342+
let t = ty::expr_ty(bcx_tcx(bcx), src);
4343+
ret move_val(srclv.bcx, DROP_EXISTING, addr, srclv, t);
4344+
}
4345+
}
43284346
ast::expr_swap(dst, src) {
43294347
assert dest == ignore;
43304348
let lhs_res = trans_lval(bcx, dst);
@@ -4665,15 +4683,12 @@ fn init_local(bcx: @block_ctxt, local: @ast::local) -> @block_ctxt {
46654683

46664684
alt local.node.init {
46674685
some(init) {
4668-
alt init.op {
4669-
ast::init_assign. {
4686+
if init.op == ast::init_assign ||
4687+
!expr_is_lval(bcx_tcx(bcx), init.expr) {
46704688
bcx = trans_expr_save_in(bcx, init.expr, llptr, INIT);
4671-
}
4672-
// FIXME[DPS] do a save_in when expr isn't lval
4673-
ast::init_move. {
4689+
} else { // This is a move from an lval, must perform an actual move
46744690
let sub = trans_lval(bcx, init.expr);
46754691
bcx = move_val(sub.bcx, INIT, llptr, sub, ty);
4676-
}
46774692
}
46784693
}
46794694
_ { bcx = zero_alloca(bcx, llptr, ty); }

0 commit comments

Comments
 (0)