diff options
| author | Michael Sullivan <sully@msully.net> | 2011-06-13 17:34:54 -0700 |
|---|---|---|
| committer | Graydon Hoare <graydon@mozilla.com> | 2011-06-16 11:47:54 -0700 |
| commit | cfd1f74ebb634eaaa6ca60844690c5cd7de16f52 (patch) | |
| tree | c6eac2d075c199c1f0a7ec75b4dc36af786d81a1 /src | |
| parent | 066599104aa50b684e63c0e8c39c5240a1fd597e (diff) | |
| download | rust-cfd1f74ebb634eaaa6ca60844690c5cd7de16f52.tar.gz rust-cfd1f74ebb634eaaa6ca60844690c5cd7de16f52.zip | |
Bring swap through typechecking and typestate.
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp/middle/tstate/pre_post_conditions.rs | 4 | ||||
| -rw-r--r-- | src/comp/middle/tstate/states.rs | 14 | ||||
| -rw-r--r-- | src/comp/middle/ty.rs | 1 | ||||
| -rw-r--r-- | src/comp/middle/typeck.rs | 4 | ||||
| -rw-r--r-- | src/comp/middle/visit.rs | 4 | ||||
| -rw-r--r-- | src/comp/middle/walk.rs | 1 | ||||
| -rw-r--r-- | src/comp/pretty/pprust.rs | 6 |
7 files changed, 34 insertions, 0 deletions
diff --git a/src/comp/middle/tstate/pre_post_conditions.rs b/src/comp/middle/tstate/pre_post_conditions.rs index 38509e2672e..cfa5aed2faf 100644 --- a/src/comp/middle/tstate/pre_post_conditions.rs +++ b/src/comp/middle/tstate/pre_post_conditions.rs @@ -292,6 +292,10 @@ fn find_pre_post_expr(&fn_ctxt fcx, @expr e) { case (_) { find_pre_post_exprs(fcx, [lhs, rhs], a); } } } + case (expr_swap(?lhs, ?rhs, ?a)) { + // Both sides must already be initialized + find_pre_post_exprs(fcx, [lhs, rhs], a); + } case (expr_assign(?lhs, ?rhs, ?a)) { alt (lhs.node) { case (expr_path(?p, ?a_lhs)) { diff --git a/src/comp/middle/tstate/states.rs b/src/comp/middle/tstate/states.rs index 697e9e14e49..ebf6b7ca300 100644 --- a/src/comp/middle/tstate/states.rs +++ b/src/comp/middle/tstate/states.rs @@ -327,6 +327,20 @@ fn find_pre_post_state_expr(&fn_ctxt fcx, &prestate pres, @expr e) -> bool { } ret changed; } + case (expr_swap(?lhs, ?rhs, ?a)) { + /* quite similar to binary -- should abstract this */ + changed = extend_prestate_ann(fcx.ccx, a, pres) || changed; + changed = find_pre_post_state_expr(fcx, pres, lhs) + || changed; + changed = + find_pre_post_state_expr(fcx, + expr_poststate(fcx.ccx, lhs), + rhs) || changed; + changed = + extend_poststate_ann(fcx.ccx, a, + expr_poststate(fcx.ccx, rhs)) || changed; + ret changed; + } case (expr_recv(?lhs, ?rhs, ?a)) { extend_prestate_ann(fcx.ccx, a, pres); alt (lhs.node) { diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index e954d593bbf..e7f43e75bed 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -1528,6 +1528,7 @@ fn expr_ann(&@ast::expr e) -> ast::ann { case (ast::expr_block(_, ?a)) { ret a; } case (ast::expr_move(_, _, ?a)) { ret a; } case (ast::expr_assign(_, _, ?a)) { ret a; } + case (ast::expr_swap(_,_,?a)) { ret a; } case (ast::expr_assign_op(_, _, _, ?a)) { ret a; } case (ast::expr_send(_, _, ?a)) { ret a; } case (ast::expr_recv(_, _, ?a)) { ret a; } diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 016c3ac2ac4..0b615740e3c 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -1637,6 +1637,10 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) { require_impure(fcx.ccx.tcx.sess, fcx.purity, expr.span); check_assignment(fcx, expr.span, lhs, rhs, a); } + case (ast::expr_swap(?lhs, ?rhs, ?a)) { + require_impure(fcx.ccx.tcx.sess, fcx.purity, expr.span); + check_assignment(fcx, expr.span, lhs, rhs, a); + } case (ast::expr_assign_op(?op, ?lhs, ?rhs, ?a)) { require_impure(fcx.ccx.tcx.sess, fcx.purity, expr.span); check_assignment(fcx, expr.span, lhs, rhs, a); diff --git a/src/comp/middle/visit.rs b/src/comp/middle/visit.rs index 9afbaef1ff7..642d4d26e52 100644 --- a/src/comp/middle/visit.rs +++ b/src/comp/middle/visit.rs @@ -314,6 +314,10 @@ fn visit_expr[E](&@expr ex, &E e, &vt[E] v) { vt(v).visit_expr(b, e, v); vt(v).visit_expr(a, e, v); } + case (expr_swap(?a, ?b, _)) { + vt(v).visit_expr(a, e, v); + vt(v).visit_expr(b, e, v); + } case (expr_assign_op(_, ?a, ?b, _)) { vt(v).visit_expr(b, e, v); vt(v).visit_expr(a, e, v); diff --git a/src/comp/middle/walk.rs b/src/comp/middle/walk.rs index 3d5a534b4a5..143069c3f58 100644 --- a/src/comp/middle/walk.rs +++ b/src/comp/middle/walk.rs @@ -347,6 +347,7 @@ fn walk_expr(&ast_visitor v, @ast::expr e) { walk_expr(v, b); } case (ast::expr_move(?a, ?b, _)) { walk_expr(v, a); walk_expr(v, b); } + case (ast::expr_swap(?a, ?b, _)) { walk_expr(v, a); walk_expr(v, b); } case (ast::expr_assign_op(_, ?a, ?b, _)) { walk_expr(v, a); walk_expr(v, b); diff --git a/src/comp/pretty/pprust.rs b/src/comp/pretty/pprust.rs index f7de0acec3d..9e5e905eb80 100644 --- a/src/comp/pretty/pprust.rs +++ b/src/comp/pretty/pprust.rs @@ -704,6 +704,12 @@ fn print_expr(&ps s, &@ast::expr expr) { word_space(s, "="); print_expr(s, rhs); } + case (ast::expr_swap(?lhs, ?rhs, _)) { + print_expr(s, lhs); + space(s.s); + word_space(s, "<->"); + print_expr(s, rhs); + } case (ast::expr_assign_op(?op, ?lhs, ?rhs, _)) { print_expr(s, lhs); space(s.s); |
