about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-09-10 16:34:31 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-09-10 16:50:07 -0700
commit29003c799f41cce948bc043cdd1350ca4bee949e (patch)
tree0e879812117977b10d42558588f952b792fa5f99 /src/libcore
parent20263595185590c8c2705b92bddbd00e3fc56713 (diff)
downloadrust-29003c799f41cce948bc043cdd1350ca4bee949e.tar.gz
rust-29003c799f41cce948bc043cdd1350ca4bee949e.zip
Rename the poorly named Managed<T> type to Mut<T>.
The Mut<T> type is intended to allow freezable data stuctures to be stored in
`@mut` boxes. Currently this causes borrowck to be very conserivative since it
cannot prove that you are not modifying such a structure while iterating over
it, for example.  But if you do `@Mut<T>` instead of `@mut T`, you will
effectively convert borrowck's static checks into dynamic ones.  This lets
you use the e.g. send_map just like a Java Map or something else.
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/core.rc4
-rw-r--r--src/libcore/mutable.rs (renamed from src/libcore/managed.rs)36
2 files changed, 24 insertions, 16 deletions
diff --git a/src/libcore/core.rc b/src/libcore/core.rc
index 25bdcea0bb2..c0c9cf5f9b6 100644
--- a/src/libcore/core.rc
+++ b/src/libcore/core.rc
@@ -57,7 +57,7 @@ export hash;
 export cmp;
 export num;
 export path;
-export managed;
+export mutable;
 export flate;
 export unit;
 export uniq;
@@ -225,7 +225,7 @@ mod run;
 mod sys;
 mod unsafe;
 
-mod managed;
+mod mutable;
 
 mod flate;
 
diff --git a/src/libcore/managed.rs b/src/libcore/mutable.rs
index b3119b9d24d..eca9ff6fada 100644
--- a/src/libcore/managed.rs
+++ b/src/libcore/mutable.rs
@@ -15,7 +15,7 @@ mutation when the data structure should be immutable.
 use util::with;
 use unsafe::transmute_immut;
 
-export Managed;
+export Mut;
 
 enum Mode { ReadOnly, Mutable, Immutable }
 
@@ -24,18 +24,26 @@ struct Data<T> {
     priv mut mode: Mode
 }
 
-type Managed<T> = @Data<T>;
+type Mut<T> = Data<T>;
 
-fn Managed<T>(+t: T) -> Managed<T> {
-    @Data {value: t, mode: ReadOnly}
+fn Mut<T>(+t: T) -> Mut<T> {
+    Data {value: t, mode: ReadOnly}
+}
+
+fn unwrap<T>(+m: Mut<T>) -> T {
+    // Borrowck should prevent us from calling unwrap while the value
+    // is in use, as that would be a move from a borrowed value.
+    assert (m.mode as uint) == (ReadOnly as uint);
+    let Data {value, mode: _} = m;
+    return move value;
 }
 
 impl<T> Data<T> {
     fn borrow_mut<R>(op: &fn(t: &mut T) -> R) -> R {
         match self.mode {
-          Immutable => fail fmt!("%? currently immutable",
-                                 self.value),
-          ReadOnly | Mutable => {}
+            Immutable => fail fmt!("%? currently immutable",
+                                   self.value),
+            ReadOnly | Mutable => {}
         }
 
         do with(&mut self.mode, Mutable) {
@@ -64,7 +72,7 @@ impl<T> Data<T> {
 #[ignore(cfg(windows))]
 #[should_fail]
 fn test_mut_in_imm() {
-    let m = Managed(1);
+    let m = @Mut(1);
     do m.borrow_imm |_p| {
         do m.borrow_mut |_q| {
             // should not be permitted
@@ -76,7 +84,7 @@ fn test_mut_in_imm() {
 #[ignore(cfg(windows))]
 #[should_fail]
 fn test_imm_in_mut() {
-    let m = Managed(1);
+    let m = @Mut(1);
     do m.borrow_mut |_p| {
         do m.borrow_imm |_q| {
             // should not be permitted
@@ -86,7 +94,7 @@ fn test_imm_in_mut() {
 
 #[test]
 fn test_const_in_mut() {
-    let m = Managed(1);
+    let m = @Mut(1);
     do m.borrow_mut |p| {
         do m.borrow_const |q| {
             assert *p == *q;
@@ -98,7 +106,7 @@ fn test_const_in_mut() {
 
 #[test]
 fn test_mut_in_const() {
-    let m = Managed(1);
+    let m = @Mut(1);
     do m.borrow_const |p| {
         do m.borrow_mut |q| {
             assert *p == *q;
@@ -110,7 +118,7 @@ fn test_mut_in_const() {
 
 #[test]
 fn test_imm_in_const() {
-    let m = Managed(1);
+    let m = @Mut(1);
     do m.borrow_const |p| {
         do m.borrow_imm |q| {
             assert *p == *q;
@@ -120,7 +128,7 @@ fn test_imm_in_const() {
 
 #[test]
 fn test_const_in_imm() {
-    let m = Managed(1);
+    let m = @Mut(1);
     do m.borrow_imm |p| {
         do m.borrow_const |q| {
             assert *p == *q;
@@ -133,7 +141,7 @@ fn test_const_in_imm() {
 #[ignore(cfg(windows))]
 #[should_fail]
 fn test_mut_in_imm_in_const() {
-    let m = Managed(1);
+    let m = @Mut(1);
     do m.borrow_const |_p| {
         do m.borrow_imm |_q| {
             do m.borrow_mut |_r| {