about summary refs log tree commit diff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2011-12-09 19:12:03 -0800
committerNiko Matsakis <niko@alum.mit.edu>2011-12-14 14:32:19 -0800
commit7fbca4e31ce51ac4b7cae155780730e1ab2dccb4 (patch)
treefb4f7d4f8932926723b26094dafbd530d5caf008 /src/comp/middle
parentaa1cd61c84199c8a1e44645e4af3f8c15c6dd018 (diff)
sendable functions now "work", meaning pass through trans/typestate
but they do not generate correct code
Diffstat (limited to 'src/comp/middle')
-rw-r--r--src/comp/middle/resolve.rs5
-rw-r--r--src/comp/middle/trans.rs4
2 files changed, 7 insertions, 2 deletions
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs
index 1fe94a14345..b898a73b3be 100644
--- a/src/comp/middle/resolve.rs
+++ b/src/comp/middle/resolve.rs
@@ -678,9 +678,14 @@ fn scope_is_fn(sc: scope) -> bool {
         };
 }
 
+// Returns:
+//   none - does not close
+//   some(true) - closes and permits mutation
+//   some(false) - closes but no mutation
 fn scope_closes(sc: scope) -> option::t<bool> {
     alt sc {
       scope_fn(_, ast::proto_block., _) { some(true) }
+      scope_fn(_, ast::proto_send., _) { some(false) }
       scope_fn(_, ast::proto_shared(_), _) { some(false) }
       _ { none }
     }
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 0654b6da699..8f2f79a9dc3 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -2192,7 +2192,7 @@ fn trans_expr_fn(bcx: @block_ctxt, f: ast::_fn, sp: span,
                || f.proto == ast::proto_shared(ast::sugar_sexy);
     let env;
     alt f.proto {
-      ast::proto_block. | ast::proto_shared(_) {
+      ast::proto_block. | ast::proto_shared(_) | ast::proto_send. {
         let upvars = get_freevars(ccx.tcx, id);
         let env_r = build_closure(bcx, upvars, copying);
         env = env_r.ptr;
@@ -2201,7 +2201,7 @@ fn trans_expr_fn(bcx: @block_ctxt, f: ast::_fn, sp: span,
             load_environment(bcx, fcx, env_r.ptrty, upvars, copying);
         });
       }
-      _ {
+      ast::proto_bare. {
         env = C_null(T_opaque_closure_ptr(ccx));
         trans_closure(sub_cx, sp, f, llfn, none, [], id, {|_fcx|});
       }