Skip to content

Commit 573a31d

Browse files
committed
libsyntax: Forbid mutable vectors. rs=demuting
1 parent 8d7e6ef commit 573a31d

File tree

9 files changed

+31
-61
lines changed

9 files changed

+31
-61
lines changed

src/libcore/dvec.rs

+1-13
Original file line numberDiff line numberDiff line change
@@ -133,18 +133,6 @@ impl<A> DVec<A> {
133133
self.check_out(|v| self.give_back(f(v)))
134134
}
135135
136-
/**
137-
* Swaps out the current vector and hands it off to a user-provided
138-
* function `f`. The function should transform it however is desired
139-
* and return a new vector to replace it with.
140-
*/
141-
#[inline(always)]
142-
fn swap_mut(f: &fn(v: ~[mut A]) -> ~[mut A]) {
143-
do self.swap |v| {
144-
vec::cast_from_mut(f(vec::cast_to_mut(v)))
145-
}
146-
}
147-
148136
/// Returns the number of elements currently in the dvec
149137
#[inline(always)]
150138
pure fn len() -> uint {
@@ -217,7 +205,7 @@ impl<A> DVec<A> {
217205
}
218206
219207
/// Gives access to the vector as a slice with mutable contents
220-
fn borrow_mut<R>(op: fn(x: &[mut A]) -> R) -> R {
208+
fn borrow_mut<R>(op: &fn(x: &mut [A]) -> R) -> R {
221209
do self.check_out |v| {
222210
let mut v = v;
223211
let result = op(v);

src/libcore/os.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ pub mod win32 {
109109
let mut done = false;
110110
while !done {
111111
let mut k: DWORD = 0;
112-
let buf = vec::cast_to_mut(vec::from_elem(n as uint, 0u16));
112+
let mut buf = vec::from_elem(n as uint, 0u16);
113113
do vec::as_mut_buf(buf) |b, _sz| {
114114
k = f(b, TMPBUF_SZ as DWORD);
115115
if k == (0 as DWORD) {

src/libcore/vec.rs

+8-37
Original file line numberDiff line numberDiff line change
@@ -209,16 +209,6 @@ pub pure fn build_sized_opt<A>(size: Option<uint>,
209209
build_sized(size.get_or_default(4), builder)
210210
}
211211

212-
/// Produces a mut vector from an immutable vector.
213-
pub pure fn cast_to_mut<T>(v: ~[T]) -> ~[mut T] {
214-
unsafe { ::cast::transmute(v) }
215-
}
216-
217-
/// Produces an immutable vector from a mut vector.
218-
pub pure fn cast_from_mut<T>(v: ~[mut T]) -> ~[T] {
219-
unsafe { ::cast::transmute(v) }
220-
}
221-
222212
// Accessors
223213

224214
/// 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] {
274264
275265
/// Return a slice that points into another slice.
276266
#[inline(always)]
277-
pub pure fn mut_slice<T>(v: &r/[mut T], start: uint,
278-
end: uint) -> &r/[mut T] {
279-
267+
pub pure fn mut_slice<T>(v: &r/mut [T],
268+
start: uint,
269+
end: uint)
270+
-> &r/mut [T] {
280271
assert (start <= end);
281272
assert (end <= len(v));
282273
do as_mut_buf(v) |p, _len| {
@@ -290,8 +281,10 @@ pub pure fn mut_slice<T>(v: &r/[mut T], start: uint,
290281
291282
/// Return a slice that points into another slice.
292283
#[inline(always)]
293-
pub pure fn const_slice<T>(v: &r/[const T], start: uint,
294-
end: uint) -> &r/[const T] {
284+
pub pure fn const_slice<T>(v: &r/[const T],
285+
start: uint,
286+
end: uint)
287+
-> &r/[const T] {
295288
assert (start <= end);
296289
assert (end <= len(v));
297290
do as_const_buf(v) |p, _len| {
@@ -3337,28 +3330,6 @@ mod tests {
33373330
let _x = windowed (0u, ~[1u,2u,3u,4u,5u,6u]);
33383331
}
33393332

3340-
#[test]
3341-
fn cast_to_mut_no_copy() {
3342-
unsafe {
3343-
let x = ~[1, 2, 3];
3344-
let addr = raw::to_ptr(x);
3345-
let x_mut = cast_to_mut(x);
3346-
let addr_mut = raw::to_ptr(x_mut);
3347-
assert addr == addr_mut;
3348-
}
3349-
}
3350-
3351-
#[test]
3352-
fn cast_from_mut_no_copy() {
3353-
unsafe {
3354-
let x = ~[mut 1, 2, 3];
3355-
let addr = raw::to_ptr(x);
3356-
let x_imm = cast_from_mut(x);
3357-
let addr_imm = raw::to_ptr(x_imm);
3358-
assert addr == addr_imm;
3359-
}
3360-
}
3361-
33623333
#[test]
33633334
fn test_unshift() {
33643335
let mut x = ~[1, 2, 3];

src/libstd/sort.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -455,8 +455,7 @@ impl<T:Copy + Ord> MergeState<T> {
455455
base2: uint, len2: uint) {
456456
assert len1 != 0 && len2 != 0 && base1+len1 == base2;
457457

458-
let tmp = vec::cast_to_mut(
459-
vec::slice(array, base1, base1+len1).to_vec());
458+
let mut tmp = vec::slice(array, base1, base1+len1).to_vec();
460459

461460
let mut c1 = 0;
462461
let mut c2 = base2;
@@ -559,8 +558,7 @@ impl<T:Copy + Ord> MergeState<T> {
559558
base2: uint, len2: uint) {
560559
assert len1 != 1 && len2 != 0 && base1 + len1 == base2;
561560
562-
let tmp = vec::cast_to_mut(
563-
vec::slice(array, base2, base2+len2).to_vec());
561+
let mut tmp = vec::slice(array, base2, base2+len2).to_vec();
564562
565563
let mut c1 = base1 + len1 - 1;
566564
let mut c2 = len2 - 1;

src/libstd/stats.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ impl Stats for &[f64] {
5252

5353
fn median(self) -> f64 {
5454
assert self.len() != 0;
55-
let tmp = vec::cast_to_mut(vec::from_slice(self));
55+
let mut tmp = vec::from_slice(self);
5656
sort::tim_sort(tmp);
5757
if tmp.len() & 1 == 0 {
5858
let m = tmp.len() / 2;

src/libstd/test.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ pub fn run_tests_console(opts: &TestOpts,
377377
378378
fn print_failures(st: @ConsoleTestState) {
379379
st.out.write_line(~"\nfailures:");
380-
let failures = vec::cast_to_mut(st.failures.map(|t| t.name.to_str()));
380+
let mut failures = st.failures.map(|t| t.name.to_str());
381381
sort::tim_sort(failures);
382382
for vec::each(failures) |name| {
383383
st.out.write_line(fmt!(" %s", name.to_str()));

src/libsyntax/parse/obsolete.rs

+7
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ pub enum ObsoleteSyntax {
4949
ObsoleteImplSyntax,
5050
ObsoleteTraitBoundSeparator,
5151
ObsoleteMutOwnedPointer,
52+
ObsoleteMutVector,
5253
}
5354

5455
pub impl to_bytes::IterBytes for ObsoleteSyntax {
@@ -133,6 +134,12 @@ pub impl Parser {
133134
in a mutable location, like a mutable local variable or an \
134135
`@mut` box"
135136
),
137+
ObsoleteMutVector => (
138+
"const or mutable vector",
139+
"mutability inherits through `~` pointers; place the vector \
140+
in a mutable location, like a mutable local variable or an \
141+
`@mut` box"
142+
),
136143
};
137144

138145
self.report(sp, kind, kind_str, desc);

src/libsyntax/parse/parser.rs

+8
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ use parse::obsolete::{ObsoleteStructCtor, ObsoleteWith};
7676
use parse::obsolete::{ObsoleteSyntax, ObsoleteLowerCaseKindBounds};
7777
use parse::obsolete::{ObsoleteUnsafeBlock, ObsoleteImplSyntax};
7878
use parse::obsolete::{ObsoleteTraitBoundSeparator, ObsoleteMutOwnedPointer};
79+
use parse::obsolete::{ObsoleteMutVector};
7980
use parse::prec::{as_prec, token_to_binop};
8081
use parse::token::{can_begin_expr, is_ident, is_ident_or_path};
8182
use parse::token::{is_plain_ident, INTERPOLATED, special_idents};
@@ -624,6 +625,9 @@ pub impl Parser {
624625
} else if *self.token == token::LBRACKET {
625626
self.expect(token::LBRACKET);
626627
let mt = self.parse_mt();
628+
if mt.mutbl == m_mutbl { // `m_const` too after snapshot
629+
self.obsolete(*self.last_span, ObsoleteMutVector);
630+
}
627631

628632
// Parse the `* 3` in `[ int * 3 ]`
629633
let t = match self.maybe_parse_fixed_vstore_with_star() {
@@ -1134,6 +1138,10 @@ pub impl Parser {
11341138
} else if *self.token == token::LBRACKET {
11351139
self.bump();
11361140
let mutbl = self.parse_mutability();
1141+
if mutbl == m_mutbl { // `m_const` too after snapshot
1142+
self.obsolete(*self.last_span, ObsoleteMutVector);
1143+
}
1144+
11371145
if *self.token == token::RBRACKET {
11381146
// Empty vector.
11391147
self.bump();

src/test/run-pass/import-in-block.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@
99
// except according to those terms.
1010

1111
pub fn main() {
12-
// Once cast_to_mut is removed, pick a better function to import
13-
// for this test!
14-
use vec::cast_to_mut;
15-
log(debug, vec::len(cast_to_mut(~[1, 2])));
12+
use vec::from_fn;
13+
log(debug, vec::len(from_fn(2, |i| i)));
1614
{
1715
use vec::*;
1816
log(debug, len(~[2]));

0 commit comments

Comments
 (0)