From 29003c799f41cce948bc043cdd1350ca4bee949e Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Mon, 10 Sep 2012 16:34:31 -0700 Subject: [PATCH] Rename the poorly named Managed type to Mut. The Mut 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` 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. --- src/libcore/core.rc | 4 +-- src/libcore/{managed.rs => mutable.rs} | 36 ++++++++++++++++---------- src/libstd/map.rs | 4 +-- src/test/bench/core-map.rs | 10 +++---- 4 files changed, 31 insertions(+), 23 deletions(-) rename src/libcore/{managed.rs => mutable.rs} (78%) 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 similarity index 78% rename from src/libcore/managed.rs rename to 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 { priv mut mode: Mode } -type Managed = @Data; +type Mut = Data; -fn Managed(+t: T) -> Managed { - @Data {value: t, mode: ReadOnly} +fn Mut(+t: T) -> Mut { + Data {value: t, mode: ReadOnly} +} + +fn unwrap(+m: Mut) -> 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 Data { fn borrow_mut(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 Data { #[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| { diff --git a/src/libstd/map.rs b/src/libstd/map.rs index 5436ea1a803..cd19da61ab6 100644 --- a/src/libstd/map.rs +++ b/src/libstd/map.rs @@ -5,7 +5,7 @@ use io::WriterUtil; use to_str::ToStr; -use managed::Managed; +use mutable::Mut; use send_map::linear::LinearMap; use core::cmp::Eq; @@ -463,7 +463,7 @@ fn hash_from_uints(items: &[(uint, V)]) -> hashmap { } // XXX Transitional -impl Managed>: +impl @Mut>: map { pure fn size() -> uint { unchecked { diff --git a/src/test/bench/core-map.rs b/src/test/bench/core-map.rs index 4901a85369a..112c25d5146 100644 --- a/src/test/bench/core-map.rs +++ b/src/test/bench/core-map.rs @@ -6,7 +6,7 @@ use std; use std::map; -use managed::Managed; +use mutable::Mut; use send_map::linear::*; use io::WriterUtil; @@ -166,11 +166,11 @@ fn main(args: ~[~str]) { { let rng = rand::seeded_rng(copy seed); let mut results = empty_results(); - int_benchmarks::>>( - || Managed(LinearMap()), + int_benchmarks::<@Mut>>( + || @Mut(LinearMap()), rng, num_keys, &mut results); - str_benchmarks::>>( - || Managed(LinearMap()), + str_benchmarks::<@Mut>>( + || @Mut(LinearMap()), rng, num_keys, &mut results); write_results("libstd::map::hashmap", &results); }