about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMichael Sullivan <sully@msully.net>2011-06-13 17:34:54 -0700
committerGraydon Hoare <graydon@mozilla.com>2011-06-16 11:47:54 -0700
commitcfd1f74ebb634eaaa6ca60844690c5cd7de16f52 (patch)
treec6eac2d075c199c1f0a7ec75b4dc36af786d81a1 /src
parent066599104aa50b684e63c0e8c39c5240a1fd597e (diff)
downloadrust-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.rs4
-rw-r--r--src/comp/middle/tstate/states.rs14
-rw-r--r--src/comp/middle/ty.rs1
-rw-r--r--src/comp/middle/typeck.rs4
-rw-r--r--src/comp/middle/visit.rs4
-rw-r--r--src/comp/middle/walk.rs1
-rw-r--r--src/comp/pretty/pprust.rs6
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);