diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2013-02-26 14:50:09 -0800 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2013-02-27 09:40:16 -0800 |
| commit | 573a31dfa769887f4be77a621ef4cab2d92a74e5 (patch) | |
| tree | bfbed5ea785d70a71467cd8a66d53c719ab43d12 | |
| parent | 8d7e6ef7725f8a11de940892a74398fc1911dfc7 (diff) | |
| download | rust-573a31dfa769887f4be77a621ef4cab2d92a74e5.tar.gz rust-573a31dfa769887f4be77a621ef4cab2d92a74e5.zip | |
libsyntax: Forbid mutable vectors. rs=demuting
| -rw-r--r-- | src/libcore/dvec.rs | 14 | ||||
| -rw-r--r-- | src/libcore/os.rs | 2 | ||||
| -rw-r--r-- | src/libcore/vec.rs | 45 | ||||
| -rw-r--r-- | src/libstd/sort.rs | 6 | ||||
| -rw-r--r-- | src/libstd/stats.rs | 2 | ||||
| -rw-r--r-- | src/libstd/test.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/parse/obsolete.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 8 | ||||
| -rw-r--r-- | src/test/run-pass/import-in-block.rs | 6 |
9 files changed, 31 insertions, 61 deletions
diff --git a/src/libcore/dvec.rs b/src/libcore/dvec.rs index 7651b737bf3..9f2036c5f41 100644 --- a/src/libcore/dvec.rs +++ b/src/libcore/dvec.rs @@ -133,18 +133,6 @@ impl<A> DVec<A> { self.check_out(|v| self.give_back(f(v))) } - /** - * Swaps out the current vector and hands it off to a user-provided - * function `f`. The function should transform it however is desired - * and return a new vector to replace it with. - */ - #[inline(always)] - fn swap_mut(f: &fn(v: ~[mut A]) -> ~[mut A]) { - do self.swap |v| { - vec::cast_from_mut(f(vec::cast_to_mut(v))) - } - } - /// Returns the number of elements currently in the dvec #[inline(always)] pure fn len() -> uint { @@ -217,7 +205,7 @@ impl<A> DVec<A> { } /// Gives access to the vector as a slice with mutable contents - fn borrow_mut<R>(op: fn(x: &[mut A]) -> R) -> R { + fn borrow_mut<R>(op: &fn(x: &mut [A]) -> R) -> R { do self.check_out |v| { let mut v = v; let result = op(v); diff --git a/src/libcore/os.rs b/src/libcore/os.rs index 9cd5e8f4965..2522e9c2cda 100644 --- a/src/libcore/os.rs +++ b/src/libcore/os.rs @@ -109,7 +109,7 @@ pub mod win32 { let mut done = false; while !done { let mut k: DWORD = 0; - let buf = vec::cast_to_mut(vec::from_elem(n as uint, 0u16)); + let mut buf = vec::from_elem(n as uint, 0u16); do vec::as_mut_buf(buf) |b, _sz| { k = f(b, TMPBUF_SZ as DWORD); if k == (0 as DWORD) { diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs index 31c837e7e8a..687ad2f7938 100644 --- a/src/libcore/vec.rs +++ b/src/libcore/vec.rs @@ -209,16 +209,6 @@ pub pure fn build_sized_opt<A>(size: Option<uint>, build_sized(size.get_or_default(4), builder) } -/// Produces a mut vector from an immutable vector. -pub pure fn cast_to_mut<T>(v: ~[T]) -> ~[mut T] { - unsafe { ::cast::transmute(v) } -} - -/// Produces an immutable vector from a mut vector. -pub pure fn cast_from_mut<T>(v: ~[mut T]) -> ~[T] { - unsafe { ::cast::transmute(v) } -} - // Accessors /// Returns the first element of a vector @@ -274,9 +264,10 @@ pub pure fn slice<T>(v: &r/[T], start: uint, end: uint) -> &r/[T] { /// Return a slice that points into another slice. #[inline(always)] -pub pure fn mut_slice<T>(v: &r/[mut T], start: uint, - end: uint) -> &r/[mut T] { - +pub pure fn mut_slice<T>(v: &r/mut [T], + start: uint, + end: uint) + -> &r/mut [T] { assert (start <= end); assert (end <= len(v)); do as_mut_buf(v) |p, _len| { @@ -290,8 +281,10 @@ pub pure fn mut_slice<T>(v: &r/[mut T], start: uint, /// Return a slice that points into another slice. #[inline(always)] -pub pure fn const_slice<T>(v: &r/[const T], start: uint, - end: uint) -> &r/[const T] { +pub pure fn const_slice<T>(v: &r/[const T], + start: uint, + end: uint) + -> &r/[const T] { assert (start <= end); assert (end <= len(v)); do as_const_buf(v) |p, _len| { @@ -3338,28 +3331,6 @@ mod tests { } #[test] - fn cast_to_mut_no_copy() { - unsafe { - let x = ~[1, 2, 3]; - let addr = raw::to_ptr(x); - let x_mut = cast_to_mut(x); - let addr_mut = raw::to_ptr(x_mut); - assert addr == addr_mut; - } - } - - #[test] - fn cast_from_mut_no_copy() { - unsafe { - let x = ~[mut 1, 2, 3]; - let addr = raw::to_ptr(x); - let x_imm = cast_from_mut(x); - let addr_imm = raw::to_ptr(x_imm); - assert addr == addr_imm; - } - } - - #[test] fn test_unshift() { let mut x = ~[1, 2, 3]; x.unshift(0); diff --git a/src/libstd/sort.rs b/src/libstd/sort.rs index d2515df3e1b..75f38da5a19 100644 --- a/src/libstd/sort.rs +++ b/src/libstd/sort.rs @@ -455,8 +455,7 @@ impl<T:Copy + Ord> MergeState<T> { base2: uint, len2: uint) { assert len1 != 0 && len2 != 0 && base1+len1 == base2; - let tmp = vec::cast_to_mut( - vec::slice(array, base1, base1+len1).to_vec()); + let mut tmp = vec::slice(array, base1, base1+len1).to_vec(); let mut c1 = 0; let mut c2 = base2; @@ -559,8 +558,7 @@ impl<T:Copy + Ord> MergeState<T> { base2: uint, len2: uint) { assert len1 != 1 && len2 != 0 && base1 + len1 == base2; - let tmp = vec::cast_to_mut( - vec::slice(array, base2, base2+len2).to_vec()); + let mut tmp = vec::slice(array, base2, base2+len2).to_vec(); let mut c1 = base1 + len1 - 1; let mut c2 = len2 - 1; diff --git a/src/libstd/stats.rs b/src/libstd/stats.rs index fb6f80a6500..7dafdec95e0 100644 --- a/src/libstd/stats.rs +++ b/src/libstd/stats.rs @@ -52,7 +52,7 @@ impl Stats for &[f64] { fn median(self) -> f64 { assert self.len() != 0; - let tmp = vec::cast_to_mut(vec::from_slice(self)); + let mut tmp = vec::from_slice(self); sort::tim_sort(tmp); if tmp.len() & 1 == 0 { let m = tmp.len() / 2; diff --git a/src/libstd/test.rs b/src/libstd/test.rs index e14e9665216..bfeaf8400bc 100644 --- a/src/libstd/test.rs +++ b/src/libstd/test.rs @@ -377,7 +377,7 @@ pub fn run_tests_console(opts: &TestOpts, fn print_failures(st: @ConsoleTestState) { st.out.write_line(~"\nfailures:"); - let failures = vec::cast_to_mut(st.failures.map(|t| t.name.to_str())); + let mut failures = st.failures.map(|t| t.name.to_str()); sort::tim_sort(failures); for vec::each(failures) |name| { st.out.write_line(fmt!(" %s", name.to_str())); diff --git a/src/libsyntax/parse/obsolete.rs b/src/libsyntax/parse/obsolete.rs index 0c5c0f3d513..33d959a7753 100644 --- a/src/libsyntax/parse/obsolete.rs +++ b/src/libsyntax/parse/obsolete.rs @@ -49,6 +49,7 @@ pub enum ObsoleteSyntax { ObsoleteImplSyntax, ObsoleteTraitBoundSeparator, ObsoleteMutOwnedPointer, + ObsoleteMutVector, } pub impl to_bytes::IterBytes for ObsoleteSyntax { @@ -133,6 +134,12 @@ pub impl Parser { in a mutable location, like a mutable local variable or an \ `@mut` box" ), + ObsoleteMutVector => ( + "const or mutable vector", + "mutability inherits through `~` pointers; place the vector \ + in a mutable location, like a mutable local variable or an \ + `@mut` box" + ), }; self.report(sp, kind, kind_str, desc); diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index c9102cbb86b..b4bd28cbfe2 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -76,6 +76,7 @@ use parse::obsolete::{ObsoleteStructCtor, ObsoleteWith}; use parse::obsolete::{ObsoleteSyntax, ObsoleteLowerCaseKindBounds}; use parse::obsolete::{ObsoleteUnsafeBlock, ObsoleteImplSyntax}; use parse::obsolete::{ObsoleteTraitBoundSeparator, ObsoleteMutOwnedPointer}; +use parse::obsolete::{ObsoleteMutVector}; use parse::prec::{as_prec, token_to_binop}; use parse::token::{can_begin_expr, is_ident, is_ident_or_path}; use parse::token::{is_plain_ident, INTERPOLATED, special_idents}; @@ -624,6 +625,9 @@ pub impl Parser { } else if *self.token == token::LBRACKET { self.expect(token::LBRACKET); let mt = self.parse_mt(); + if mt.mutbl == m_mutbl { // `m_const` too after snapshot + self.obsolete(*self.last_span, ObsoleteMutVector); + } // Parse the `* 3` in `[ int * 3 ]` let t = match self.maybe_parse_fixed_vstore_with_star() { @@ -1134,6 +1138,10 @@ pub impl Parser { } else if *self.token == token::LBRACKET { self.bump(); let mutbl = self.parse_mutability(); + if mutbl == m_mutbl { // `m_const` too after snapshot + self.obsolete(*self.last_span, ObsoleteMutVector); + } + if *self.token == token::RBRACKET { // Empty vector. self.bump(); diff --git a/src/test/run-pass/import-in-block.rs b/src/test/run-pass/import-in-block.rs index 6ad33445997..72f6d23cacc 100644 --- a/src/test/run-pass/import-in-block.rs +++ b/src/test/run-pass/import-in-block.rs @@ -9,10 +9,8 @@ // except according to those terms. pub fn main() { - // Once cast_to_mut is removed, pick a better function to import - // for this test! - use vec::cast_to_mut; - log(debug, vec::len(cast_to_mut(~[1, 2]))); + use vec::from_fn; + log(debug, vec::len(from_fn(2, |i| i))); { use vec::*; log(debug, len(~[2])); |
