Skip to content

Commit fea5aa6

Browse files
committed
auto merge of rust-lang#20160 : nick29581/rust/ranges2, r=nikomatsakis
The first six commits are from an earlier PR (rust-lang#19858) and have already been reviewed. This PR makes an awful hack in the compiler to accommodate slices both natively and in the index a range form. After a snapshot we can hopefully add the new Index impls and then we can remove these awful hacks. r? @nikomatsakis (or anyone who knows the compiler, really)
2 parents 7112390 + 113f8aa commit fea5aa6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+421
-443
lines changed

src/libcollections/ring_buf.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ impl<T> RingBuf<T> {
453453

454454
if contiguous {
455455
let (empty, buf) = buf.split_at_mut(0);
456-
(buf[mut tail..head], empty)
456+
(buf.slice_mut(tail, head), empty)
457457
} else {
458458
let (mid, right) = buf.split_at_mut(tail);
459459
let (left, _) = mid.split_at_mut(head);

src/libcollections/slice.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ use core::iter::{range_step, MultiplicativeIterator};
9494
use core::kinds::Sized;
9595
use core::mem::size_of;
9696
use core::mem;
97-
use core::ops::FnMut;
97+
use core::ops::{FnMut,SliceMut};
9898
use core::prelude::{Clone, Greater, Iterator, IteratorExt, Less, None, Option};
9999
use core::prelude::{Ord, Ordering, RawPtr, Some, range};
100100
use core::ptr;
@@ -1110,7 +1110,7 @@ impl<T> SliceExt<T> for [T] {
11101110

11111111
#[inline]
11121112
fn move_from(&mut self, mut src: Vec<T>, start: uint, end: uint) -> uint {
1113-
for (a, b) in self.iter_mut().zip(src[mut start..end].iter_mut()) {
1113+
for (a, b) in self.iter_mut().zip(src.slice_mut(start, end).iter_mut()) {
11141114
mem::swap(a, b);
11151115
}
11161116
cmp::min(self.len(), end-start)
@@ -1326,7 +1326,7 @@ impl<T> BorrowFrom<Vec<T>> for [T] {
13261326

13271327
#[unstable = "trait is unstable"]
13281328
impl<T> BorrowFromMut<Vec<T>> for [T] {
1329-
fn borrow_from_mut(owned: &mut Vec<T>) -> &mut [T] { owned[mut] }
1329+
fn borrow_from_mut(owned: &mut Vec<T>) -> &mut [T] { owned.as_mut_slice_() }
13301330
}
13311331

13321332
#[unstable = "trait is unstable"]
@@ -2491,14 +2491,14 @@ mod tests {
24912491
assert!(a == [7i,2,3,4]);
24922492
let mut a = [1i,2,3,4,5];
24932493
let b = vec![5i,6,7,8,9,0];
2494-
assert_eq!(a[mut 2..4].move_from(b,1,6), 2);
2494+
assert_eq!(a.slice_mut(2, 4).move_from(b,1,6), 2);
24952495
assert!(a == [1i,2,6,7,5]);
24962496
}
24972497

24982498
#[test]
24992499
fn test_reverse_part() {
25002500
let mut values = [1i,2,3,4,5];
2501-
values[mut 1..4].reverse();
2501+
values.slice_mut(1, 4).reverse();
25022502
assert!(values == [1,4,3,2,5]);
25032503
}
25042504

@@ -2545,9 +2545,9 @@ mod tests {
25452545
fn test_bytes_set_memory() {
25462546
use slice::bytes::MutableByteVector;
25472547
let mut values = [1u8,2,3,4,5];
2548-
values[mut 0..5].set_memory(0xAB);
2548+
values.slice_mut(0, 5).set_memory(0xAB);
25492549
assert!(values == [0xAB, 0xAB, 0xAB, 0xAB, 0xAB]);
2550-
values[mut 2..4].set_memory(0xFF);
2550+
values.slice_mut(2, 4).set_memory(0xFF);
25512551
assert!(values == [0xAB, 0xAB, 0xFF, 0xFF, 0xAB]);
25522552
}
25532553

src/libcore/fmt/float.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ pub fn float_to_str_bytes_common<T: Float, U, F>(
179179
_ => ()
180180
}
181181

182-
buf[mut ..end].reverse();
182+
buf.slice_to_mut(end).reverse();
183183

184184
// Remember start of the fractional digits.
185185
// Points one beyond end of buf if none get generated,
@@ -316,7 +316,7 @@ pub fn float_to_str_bytes_common<T: Float, U, F>(
316316

317317
impl<'a> fmt::FormatWriter for Filler<'a> {
318318
fn write(&mut self, bytes: &[u8]) -> fmt::Result {
319-
slice::bytes::copy_memory(self.buf[mut *self.end..],
319+
slice::bytes::copy_memory(self.buf.slice_from_mut(*self.end),
320320
bytes);
321321
*self.end += bytes.len();
322322
Ok(())

src/libcore/ops.rs

+8
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,14 @@ impl<Idx: Clone + Step> Iterator<Idx> for RangeFrom<Idx> {
908908
}
909909
}
910910

911+
/// A range which is only bounded above.
912+
#[deriving(Copy)]
913+
#[lang="range_to"]
914+
pub struct RangeTo<Idx> {
915+
/// The upper bound of the range (exclusive).
916+
pub end: Idx,
917+
}
918+
911919

912920
/// The `Deref` trait is used to specify the functionality of dereferencing
913921
/// operations like `*v`.

src/libcore/slice.rs

+12-11
Original file line numberDiff line numberDiff line change
@@ -264,24 +264,26 @@ impl<T> SliceExt<T> for [T] {
264264
fn as_mut_slice(&mut self) -> &mut [T] { self }
265265

266266
fn slice_mut(&mut self, start: uint, end: uint) -> &mut [T] {
267-
self[mut start..end]
267+
ops::SliceMut::slice_or_fail_mut(self, &start, &end)
268268
}
269269

270270
#[inline]
271271
fn slice_from_mut(&mut self, start: uint) -> &mut [T] {
272-
self[mut start..]
272+
ops::SliceMut::slice_from_or_fail_mut(self, &start)
273273
}
274274

275275
#[inline]
276276
fn slice_to_mut(&mut self, end: uint) -> &mut [T] {
277-
self[mut ..end]
277+
ops::SliceMut::slice_to_or_fail_mut(self, &end)
278278
}
279279

280280
#[inline]
281281
fn split_at_mut(&mut self, mid: uint) -> (&mut [T], &mut [T]) {
282282
unsafe {
283283
let self2: &mut [T] = mem::transmute_copy(&self);
284-
(self[mut ..mid], self2[mut mid..])
284+
285+
(ops::SliceMut::slice_to_or_fail_mut(self, &mid),
286+
ops::SliceMut::slice_from_or_fail_mut(self2, &mid))
285287
}
286288
}
287289

@@ -315,14 +317,13 @@ impl<T> SliceExt<T> for [T] {
315317

316318
#[inline]
317319
fn tail_mut(&mut self) -> &mut [T] {
318-
let len = self.len();
319-
self[mut 1..len]
320+
self.slice_from_mut(1)
320321
}
321322

322323
#[inline]
323324
fn init_mut(&mut self) -> &mut [T] {
324325
let len = self.len();
325-
self[mut 0..len - 1]
326+
self.slice_to_mut(len-1)
326327
}
327328

328329
#[inline]
@@ -560,7 +561,7 @@ impl<T: Ord> OrdSliceExt<T> for [T] {
560561
self.swap(j, i-1);
561562

562563
// Step 4: Reverse the (previously) weakly decreasing part
563-
self[mut i..].reverse();
564+
self.slice_from_mut(i).reverse();
564565

565566
true
566567
}
@@ -582,7 +583,7 @@ impl<T: Ord> OrdSliceExt<T> for [T] {
582583
}
583584

584585
// Step 2: Reverse the weakly increasing part
585-
self[mut i..].reverse();
586+
self.slice_from_mut(i).reverse();
586587

587588
// Step 3: Find the rightmost element equal to or bigger than the pivot (i-1)
588589
let mut j = self.len() - 1;
@@ -990,7 +991,7 @@ impl<'a, T, P> Iterator<&'a mut [T]> for MutSplits<'a, T, P> where P: FnMut(&T)
990991
Some(idx) => {
991992
let tmp = mem::replace(&mut self.v, &mut []);
992993
let (head, tail) = tmp.split_at_mut(idx);
993-
self.v = tail[mut 1..];
994+
self.v = tail.slice_from_mut(1);
994995
Some(head)
995996
}
996997
}
@@ -1026,7 +1027,7 @@ impl<'a, T, P> DoubleEndedIterator<&'a mut [T]> for MutSplits<'a, T, P> where
10261027
let tmp = mem::replace(&mut self.v, &mut []);
10271028
let (head, tail) = tmp.split_at_mut(idx);
10281029
self.v = head;
1029-
Some(tail[mut 1..])
1030+
Some(tail.slice_from_mut(1))
10301031
}
10311032
}
10321033
}

src/libcore/str/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,7 @@ impl<'a> Iterator<&'a str> for SplitStr<'a> {
897897
}
898898
}
899899

900+
900901
/*
901902
Section: Comparing strings
902903
*/

src/libcoretest/ops.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// except according to those terms.
1010

1111
use test::Bencher;
12-
use core::ops::{Range, FullRange, RangeFrom};
12+
use core::ops::{Range, FullRange, RangeFrom, RangeTo};
1313

1414
// Overhead of dtors
1515

@@ -55,6 +55,12 @@ fn test_range_from() {
5555
assert!(count == 10);
5656
}
5757

58+
#[test]
59+
fn test_range_to() {
60+
// Not much to test.
61+
let _ = RangeTo { end: 42u };
62+
}
63+
5864
#[test]
5965
fn test_full_range() {
6066
// Not much to test.

src/libgraphviz/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ mod tests {
735735
fn test_input(g: LabelledGraph) -> IoResult<String> {
736736
let mut writer = Vec::new();
737737
render(&g, &mut writer).unwrap();
738-
(&mut writer[]).read_to_string()
738+
(&mut writer.as_slice()).read_to_string()
739739
}
740740

741741
// All of the tests use raw-strings as the format for the expected outputs,
@@ -847,7 +847,7 @@ r#"digraph hasse_diagram {
847847
edge(1, 3, ";"), edge(2, 3, ";" )));
848848

849849
render(&g, &mut writer).unwrap();
850-
let r = (&mut writer[]).read_to_string();
850+
let r = (&mut writer.as_slice()).read_to_string();
851851

852852
assert_eq!(r.unwrap(),
853853
r#"digraph syntax_tree {

src/librbml/io.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ impl Writer for SeekableMemWriter {
102102

103103
// Do the necessary writes
104104
if left.len() > 0 {
105-
slice::bytes::copy_memory(self.buf[mut self.pos..], left);
105+
slice::bytes::copy_memory(self.buf.slice_from_mut(self.pos), left);
106106
}
107107
if right.len() > 0 {
108108
self.buf.push_all(right);

src/librustc/middle/cfg/construct.rs

+1-8
Original file line numberDiff line numberDiff line change
@@ -432,15 +432,8 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
432432
self.call(expr, pred, &**l, Some(&**r).into_iter())
433433
}
434434

435-
ast::ExprSlice(ref base, ref start, ref end, _) => {
436-
self.call(expr,
437-
pred,
438-
&**base,
439-
start.iter().chain(end.iter()).map(|x| &**x))
440-
}
441-
442435
ast::ExprRange(ref start, ref end) => {
443-
let fields = Some(&**start).into_iter()
436+
let fields = start.as_ref().map(|e| &**e).into_iter()
444437
.chain(end.as_ref().map(|e| &**e).into_iter());
445438
self.straightline(expr, pred, fields)
446439
}

src/librustc/middle/expr_use_visitor.rs

+23-16
Original file line numberDiff line numberDiff line change
@@ -431,26 +431,33 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
431431
}
432432

433433
ast::ExprIndex(ref lhs, ref rhs) => { // lhs[rhs]
434-
if !self.walk_overloaded_operator(expr, &**lhs, vec![&**rhs], PassArgs::ByRef) {
435-
self.select_from_expr(&**lhs);
436-
self.consume_expr(&**rhs);
434+
match rhs.node {
435+
ast::ExprRange(ref start, ref end) => {
436+
// Hacked slicing syntax (KILLME).
437+
let args = match (start, end) {
438+
(&Some(ref e1), &Some(ref e2)) => vec![&**e1, &**e2],
439+
(&Some(ref e), &None) => vec![&**e],
440+
(&None, &Some(ref e)) => vec![&**e],
441+
(&None, &None) => Vec::new()
442+
};
443+
let overloaded =
444+
self.walk_overloaded_operator(expr, &**lhs, args, PassArgs::ByRef);
445+
assert!(overloaded);
446+
}
447+
_ => {
448+
if !self.walk_overloaded_operator(expr,
449+
&**lhs,
450+
vec![&**rhs],
451+
PassArgs::ByRef) {
452+
self.select_from_expr(&**lhs);
453+
self.consume_expr(&**rhs);
454+
}
455+
}
437456
}
438457
}
439458

440-
ast::ExprSlice(ref base, ref start, ref end, _) => { // base[start..end]
441-
let args = match (start, end) {
442-
(&Some(ref e1), &Some(ref e2)) => vec![&**e1, &**e2],
443-
(&Some(ref e), &None) => vec![&**e],
444-
(&None, &Some(ref e)) => vec![&**e],
445-
(&None, &None) => Vec::new()
446-
};
447-
let overloaded =
448-
self.walk_overloaded_operator(expr, &**base, args, PassArgs::ByRef);
449-
assert!(overloaded);
450-
}
451-
452459
ast::ExprRange(ref start, ref end) => {
453-
self.consume_expr(&**start);
460+
start.as_ref().map(|e| self.consume_expr(&**e));
454461
end.as_ref().map(|e| self.consume_expr(&**e));
455462
}
456463

src/librustc/middle/lang_items.rs

+1
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ lets_do_this! {
269269
SliceMutTraitLangItem, "slice_mut", slice_mut_trait;
270270
RangeStructLangItem, "range", range_struct;
271271
RangeFromStructLangItem, "range_from", range_from_struct;
272+
RangeToStructLangItem, "range_to", range_to_struct;
272273
FullRangeStructLangItem, "full_range", full_range_struct;
273274

274275
UnsafeTypeLangItem, "unsafe", unsafe_type;

src/librustc/middle/liveness.rs

+3-9
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ fn visit_expr(ir: &mut IrMaps, expr: &Expr) {
514514
ast::ExprBlock(..) | ast::ExprAssign(..) | ast::ExprAssignOp(..) |
515515
ast::ExprMac(..) | ast::ExprStruct(..) | ast::ExprRepeat(..) |
516516
ast::ExprParen(..) | ast::ExprInlineAsm(..) | ast::ExprBox(..) |
517-
ast::ExprSlice(..) | ast::ExprRange(..) => {
517+
ast::ExprRange(..) => {
518518
visit::walk_expr(ir, expr);
519519
}
520520
}
@@ -1191,15 +1191,9 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
11911191
self.propagate_through_expr(&**l, r_succ)
11921192
}
11931193

1194-
ast::ExprSlice(ref e1, ref e2, ref e3, _) => {
1195-
let succ = e3.as_ref().map_or(succ, |e| self.propagate_through_expr(&**e, succ));
1196-
let succ = e2.as_ref().map_or(succ, |e| self.propagate_through_expr(&**e, succ));
1197-
self.propagate_through_expr(&**e1, succ)
1198-
}
1199-
12001194
ast::ExprRange(ref e1, ref e2) => {
12011195
let succ = e2.as_ref().map_or(succ, |e| self.propagate_through_expr(&**e, succ));
1202-
self.propagate_through_expr(&**e1, succ)
1196+
e1.as_ref().map_or(succ, |e| self.propagate_through_expr(&**e, succ))
12031197
}
12041198

12051199
ast::ExprBox(None, ref e) |
@@ -1495,7 +1489,7 @@ fn check_expr(this: &mut Liveness, expr: &Expr) {
14951489
ast::ExprBlock(..) | ast::ExprMac(..) | ast::ExprAddrOf(..) |
14961490
ast::ExprStruct(..) | ast::ExprRepeat(..) | ast::ExprParen(..) |
14971491
ast::ExprClosure(..) | ast::ExprPath(..) | ast::ExprBox(..) |
1498-
ast::ExprSlice(..) | ast::ExprRange(..) => {
1492+
ast::ExprRange(..) => {
14991493
visit::walk_expr(this, expr);
15001494
}
15011495
ast::ExprIfLet(..) => {

0 commit comments

Comments
 (0)