rustc: Store the lhs and rhs of receive exprs in left to right order

With the changing of receive semantics the parser has been putting the rhs
expression in the first argument of expr_recv and the lhs in the second, and
all subsequent passes have been referring to them backwords (but still doing
the right thing because they were assuming that lhs was the port and rhs was
the receiver).

This makes all code agree on what lhs and rhs mean for receive expressions.
This commit is contained in:
Brian Anderson 2011-06-18 20:16:30 -07:00
parent 364cd5763c
commit 514813148b
6 changed files with 27 additions and 27 deletions

View file

@ -1201,7 +1201,7 @@ fn parse_assign_expr(&parser p) -> @ast::expr {
p.bump(); p.bump();
auto rhs = parse_expr(p); auto rhs = parse_expr(p);
ret @spanned(lo, rhs.span.hi, ret @spanned(lo, rhs.span.hi,
ast::expr_recv(rhs, lhs, p.get_ann())); ast::expr_recv(lhs, rhs, p.get_ann()));
} }
case (token::DARROW) { case (token::DARROW) {
p.bump(); p.bump();

View file

@ -6429,30 +6429,30 @@ fn trans_send(&@block_ctxt cx, &@ast::expr lhs, &@ast::expr rhs,
fn trans_recv(&@block_ctxt cx, &@ast::expr lhs, &@ast::expr rhs, fn trans_recv(&@block_ctxt cx, &@ast::expr lhs, &@ast::expr rhs,
&ast::ann ann) -> result { &ast::ann ann) -> result {
auto bcx = cx; auto bcx = cx;
auto data = trans_lval(bcx, lhs); auto data = trans_lval(bcx, rhs);
assert (data.is_mem); assert (data.is_mem);
bcx = data.res.bcx; bcx = data.res.bcx;
auto unit_ty = node_ann_type(bcx.fcx.lcx.ccx, ann); auto unit_ty = node_ann_type(bcx.fcx.lcx.ccx, ann);
// FIXME: calculate copy init-ness in typestate. // FIXME: calculate copy init-ness in typestate.
ret recv_val(bcx, data.res.val, rhs, unit_ty, DROP_EXISTING); ret recv_val(bcx, data.res.val, lhs, unit_ty, DROP_EXISTING);
} }
fn recv_val(&@block_ctxt cx, ValueRef lhs, &@ast::expr rhs, &ty::t unit_ty, fn recv_val(&@block_ctxt cx, ValueRef to, &@ast::expr from, &ty::t unit_ty,
copy_action action) -> result { copy_action action) -> result {
auto bcx = cx; auto bcx = cx;
auto prt = trans_expr(bcx, rhs); auto prt = trans_expr(bcx, from);
bcx = prt.bcx; bcx = prt.bcx;
auto lldataptr = bcx.build.PointerCast(lhs, T_ptr(T_ptr(T_i8()))); auto lldataptr = bcx.build.PointerCast(to, T_ptr(T_ptr(T_i8())));
auto llportptr = bcx.build.PointerCast(prt.val, T_opaque_port_ptr()); auto llportptr = bcx.build.PointerCast(prt.val, T_opaque_port_ptr());
bcx.build.Call(bcx.fcx.lcx.ccx.upcalls.recv, bcx.build.Call(bcx.fcx.lcx.ccx.upcalls.recv,
[bcx.fcx.lltaskptr, lldataptr, llportptr]); [bcx.fcx.lltaskptr, lldataptr, llportptr]);
auto data_load = load_if_immediate(bcx, lhs, unit_ty); auto data_load = load_if_immediate(bcx, to, unit_ty);
auto cp = copy_val(bcx, action, lhs, data_load, unit_ty); auto cp = copy_val(bcx, action, to, data_load, unit_ty);
bcx = cp.bcx; bcx = cp.bcx;
// TODO: Any cleanup need to be done here? // TODO: Any cleanup need to be done here?
ret res(bcx, lhs); ret res(bcx, to);
} }

View file

@ -387,12 +387,12 @@ fn find_pre_post_expr(&fn_ctxt fcx, @expr e) {
} }
} }
case (expr_recv(?lhs, ?rhs, ?a)) { case (expr_recv(?lhs, ?rhs, ?a)) {
alt (lhs.node) { alt (rhs.node) {
case (expr_path(?p, ?a_lhs)) { case (expr_path(?p, ?a_rhs)) {
gen_if_local(fcx, lhs, rhs, a, a_lhs, p); gen_if_local(fcx, rhs, lhs, a, a_rhs, p);
} }
case (_) { case (_) {
// doesn't check that lhs is an lval, but // doesn't check that rhs is an lval, but
// that's probably ok // that's probably ok
find_pre_post_exprs(fcx, [lhs, rhs], a); find_pre_post_exprs(fcx, [lhs, rhs], a);

View file

@ -447,31 +447,31 @@ fn find_pre_post_state_expr(&fn_ctxt fcx, &prestate pres, @expr e) -> bool {
} }
case (expr_recv(?lhs, ?rhs, ?a)) { case (expr_recv(?lhs, ?rhs, ?a)) {
extend_prestate_ann(fcx.ccx, a, pres); extend_prestate_ann(fcx.ccx, a, pres);
alt (lhs.node) { alt (rhs.node) {
case (expr_path(?p, ?a_lhs)) { case (expr_path(?p, ?a_rhs)) {
// receive to local var // receive to local var
changed = pure_exp(fcx.ccx, a_lhs, pres) || changed; changed = pure_exp(fcx.ccx, a_rhs, pres) || changed;
changed = changed =
find_pre_post_state_expr(fcx, pres, rhs) || changed; find_pre_post_state_expr(fcx, pres, lhs) || changed;
changed = changed =
extend_poststate_ann(fcx.ccx, a, extend_poststate_ann(fcx.ccx, a,
expr_poststate(fcx.ccx, rhs)) || expr_poststate(fcx.ccx, lhs)) ||
changed; changed;
changed = gen_if_local(fcx, a_lhs, a, p) || changed; changed = gen_if_local(fcx, a_rhs, a, p) || changed;
} }
case (_) { case (_) {
// receive to something that must already have been init'd // receive to something that must already have been init'd
changed = changed =
find_pre_post_state_expr(fcx, pres, lhs) || changed; find_pre_post_state_expr(fcx, pres, rhs) || changed;
changed = changed =
find_pre_post_state_expr(fcx, find_pre_post_state_expr(fcx,
expr_poststate(fcx.ccx, lhs), expr_poststate(fcx.ccx, rhs),
rhs) || changed; lhs) || changed;
changed = changed =
extend_poststate_ann(fcx.ccx, a, extend_poststate_ann(fcx.ccx, a,
expr_poststate(fcx.ccx, rhs)) || expr_poststate(fcx.ccx, lhs)) ||
changed; changed;
} }
} }

View file

@ -1705,9 +1705,9 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) {
require_impure(fcx.ccx.tcx.sess, fcx.purity, expr.span); require_impure(fcx.ccx.tcx.sess, fcx.purity, expr.span);
check_expr(fcx, lhs); check_expr(fcx, lhs);
check_expr(fcx, rhs); check_expr(fcx, rhs);
auto item_t = expr_ty(fcx.ccx.tcx, lhs); auto item_t = expr_ty(fcx.ccx.tcx, rhs);
auto port_t = ty::mk_port(fcx.ccx.tcx, item_t); auto port_t = ty::mk_port(fcx.ccx.tcx, item_t);
demand::simple(fcx, expr.span, port_t, expr_ty(fcx.ccx.tcx, rhs)); demand::simple(fcx, expr.span, port_t, expr_ty(fcx.ccx.tcx, lhs));
write::ty_only_fixup(fcx, a.id, item_t); write::ty_only_fixup(fcx, a.id, item_t);
} }
case (ast::expr_if(?cond, ?thn, ?elsopt, ?a)) { case (ast::expr_if(?cond, ?thn, ?elsopt, ?a)) {

View file

@ -750,10 +750,10 @@ fn print_expr(&ps s, &@ast::expr expr) {
print_expr(s, rhs); print_expr(s, rhs);
} }
case (ast::expr_recv(?lhs, ?rhs, _)) { case (ast::expr_recv(?lhs, ?rhs, _)) {
print_expr(s, rhs); print_expr(s, lhs);
space(s.s); space(s.s);
word_space(s, "|>"); word_space(s, "|>");
print_expr(s, lhs); print_expr(s, rhs);
} }
case (ast::expr_field(?expr, ?id, _)) { case (ast::expr_field(?expr, ?id, _)) {
print_expr(s, expr); print_expr(s, expr);