Skip to content

Commit e552f60

Browse files
committed
---
yaml --- r: 128871 b: refs/heads/try c: 13079c1 h: refs/heads/master i: 128869: 414bbff 128867: 1701ede 128863: 173705b v: v3
1 parent 08c329f commit e552f60

File tree

101 files changed

+492
-700
lines changed

Some content is hidden

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

101 files changed

+492
-700
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
refs/heads/master: 07d86b46a949a94223da714e35b343243e4ecce4
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: a86d9ad15e339ab343a12513f9c90556f677b9ca
5-
refs/heads/try: 4a5654f960ca1f979e2ddf1efa57fa750dbd1dff
5+
refs/heads/try: 13079c1a85c2f3391966cc108a48f2313596d78d
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c

branches/try/src/doc/guide-unsafe.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -537,12 +537,11 @@ extern crate core;
537537
use core::prelude::*;
538538
539539
use core::mem;
540+
use core::raw::Slice;
540541
541542
#[no_mangle]
542543
pub extern fn dot_product(a: *const u32, a_len: u32,
543544
b: *const u32, b_len: u32) -> u32 {
544-
use core::raw::Slice;
545-
546545
// Convert the provided arrays into Rust slices.
547546
// The core::raw module guarantees that the Slice
548547
// structure has the same memory layout as a &[T]

branches/try/src/libcollections/bitv.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,12 @@ use core::default::Default;
6868
use core::fmt;
6969
use core::iter::Take;
7070
use core::iter;
71+
use core::ops::Index;
7172
use core::slice;
7273
use core::uint;
7374
use std::hash;
7475

75-
use {Mutable, Set, MutableSet, MutableSeq};
76+
use {Collection, Mutable, Set, MutableSet, MutableSeq};
7677
use vec::Vec;
7778

7879

branches/try/src/libcollections/btree.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use alloc::boxed::Box;
2424
use core::fmt;
2525
use core::fmt::Show;
2626

27-
use MutableSeq;
27+
use {Collection, MutableSeq};
2828
use vec::Vec;
2929

3030
#[allow(missing_doc)]

branches/try/src/libcollections/dlist.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use core::mem;
3131
use core::ptr;
3232
use std::hash::{Writer, Hash};
3333

34-
use {Mutable, Deque, MutableSeq};
34+
use {Collection, Mutable, Deque, MutableSeq};
3535

3636
/// A doubly-linked list.
3737
pub struct DList<T> {

branches/try/src/libcollections/lib.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,9 @@
2222
html_playground_url = "http://play.rust-lang.org/")]
2323

2424
#![feature(macro_rules, managed_boxes, default_type_params, phase, globs)]
25-
#![feature(unsafe_destructor, import_shadowing)]
25+
#![feature(unsafe_destructor)]
2626
#![no_std]
2727

28-
// NOTE(stage0, pcwalton): Remove after snapshot.
29-
#![allow(unknown_features)]
30-
3128
#[phase(plugin, link)] extern crate core;
3229
extern crate unicode;
3330
extern crate alloc;
@@ -39,11 +36,11 @@ extern crate alloc;
3936
#[cfg(test)] #[phase(plugin, link)] extern crate std;
4037
#[cfg(test)] #[phase(plugin, link)] extern crate log;
4138

42-
use core::prelude::Option;
39+
use core::prelude::*;
4340

41+
pub use core::collections::Collection;
4442
pub use bitv::{Bitv, BitvSet};
4543
pub use btree::BTree;
46-
pub use core::prelude::Collection;
4744
pub use dlist::DList;
4845
pub use enum_set::EnumSet;
4946
pub use priority_queue::PriorityQueue;

branches/try/src/libcollections/priority_queue.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ use core::default::Default;
154154
use core::mem::{zeroed, replace, swap};
155155
use core::ptr;
156156

157-
use {Mutable, MutableSeq};
157+
use {Collection, Mutable, MutableSeq};
158158
use slice;
159159
use vec::Vec;
160160

branches/try/src/libcollections/ringbuf.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ use core::prelude::*;
1818
use core::cmp;
1919
use core::default::Default;
2020
use core::fmt;
21+
use core::iter::RandomAccessIterator;
2122
use core::iter;
2223
use std::hash::{Writer, Hash};
2324

24-
use {Deque, Mutable, MutableSeq};
25+
use {Deque, Collection, Mutable, MutableSeq};
2526
use vec::Vec;
2627

2728
static INITIAL_CAPACITY: uint = 8u; // 2^3

branches/try/src/libcollections/slice.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,22 +86,23 @@ for &x in numbers.iter() {
8686

8787
#![doc(primitive = "slice")]
8888

89+
use core::prelude::*;
90+
8991
use core::cmp;
9092
use core::mem::size_of;
9193
use core::mem;
92-
use core::prelude::{Clone, Collection, Greater, Iterator, Less, None, Option};
93-
use core::prelude::{Ord, Ordering, RawPtr, Some, range};
9494
use core::ptr;
9595
use core::iter::{range_step, MultiplicativeIterator};
9696

97-
use MutableSeq;
97+
use {Collection, MutableSeq};
9898
use vec::Vec;
9999

100+
pub use core::slice::{ref_slice, mut_ref_slice, Splits, Windows};
100101
pub use core::slice::{Chunks, Slice, ImmutableSlice, ImmutablePartialEqSlice};
101102
pub use core::slice::{ImmutableOrdSlice, MutableSlice, Items, MutItems};
102-
pub use core::slice::{MutSplits, MutChunks, Splits};
103-
pub use core::slice::{bytes, ref_slice, MutableCloneableSlice};
104-
pub use core::slice::{Found, NotFound};
103+
pub use core::slice::{MutSplits, MutChunks};
104+
pub use core::slice::{bytes, MutableCloneableSlice};
105+
pub use core::slice::{BinarySearchResult, Found, NotFound};
105106

106107
// Functional utilities
107108

branches/try/src/libcollections/smallintmap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use core::iter;
2121
use core::iter::{Enumerate, FilterMap};
2222
use core::mem::replace;
2323

24-
use {Mutable, Map, MutableMap, MutableSeq};
24+
use {Collection, Mutable, Map, MutableMap, MutableSeq};
2525
use {vec, slice};
2626
use vec::Vec;
2727
use hash;

branches/try/src/libcollections/str.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,17 +69,15 @@ is the same as `&[u8]`.
6969

7070
#![doc(primitive = "str")]
7171

72+
use core::prelude::*;
73+
7274
use core::default::Default;
7375
use core::fmt;
7476
use core::cmp;
7577
use core::iter::AdditiveIterator;
7678
use core::mem;
77-
use core::prelude::{Char, Clone, Collection, Eq, Equiv, ImmutableSlice};
78-
use core::prelude::{Iterator, MutableSlice, None, Option, Ord, Ordering};
79-
use core::prelude::{PartialEq, PartialOrd, Result, Slice, Some, Tuple2};
80-
use core::prelude::{range};
8179

82-
use {Deque, MutableSeq};
80+
use {Collection, Deque, MutableSeq};
8381
use hash;
8482
use ringbuf::RingBuf;
8583
use string::String;
@@ -1682,7 +1680,7 @@ mod tests {
16821680
fn test_chars_decoding() {
16831681
let mut bytes = [0u8, ..4];
16841682
for c in range(0u32, 0x110000).filter_map(|c| ::core::char::from_u32(c)) {
1685-
let len = c.encode_utf8(bytes);
1683+
let len = c.encode_utf8(bytes).unwrap_or(0);
16861684
let s = ::core::str::from_utf8(bytes.slice_to(len)).unwrap();
16871685
if Some(c) != s.chars().next() {
16881686
fail!("character {:x}={} does not decode correctly", c as u32, c);
@@ -1694,7 +1692,7 @@ mod tests {
16941692
fn test_chars_rev_decoding() {
16951693
let mut bytes = [0u8, ..4];
16961694
for c in range(0u32, 0x110000).filter_map(|c| ::core::char::from_u32(c)) {
1697-
let len = c.encode_utf8(bytes);
1695+
let len = c.encode_utf8(bytes).unwrap_or(0);
16981696
let s = ::core::str::from_utf8(bytes.slice_to(len)).unwrap();
16991697
if Some(c) != s.chars().rev().next() {
17001698
fail!("character {:x}={} does not decode correctly", c as u32, c);

branches/try/src/libcollections/string.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ use core::mem;
2020
use core::ptr;
2121
// FIXME: ICE's abound if you import the `Slice` type while importing `Slice` trait
2222
use RawSlice = core::raw::Slice;
23+
use core::slice::Slice;
2324

24-
use {Mutable, MutableSeq};
25+
use {Collection, Mutable, MutableSeq};
2526
use hash;
2627
use str;
2728
use str::{CharRange, StrAllocating, MaybeOwned, Owned};
@@ -502,7 +503,7 @@ impl String {
502503
data: self.vec.as_ptr().offset(cur_len as int),
503504
len: 4,
504505
};
505-
let used = ch.encode_utf8(mem::transmute(slice));
506+
let used = ch.encode_utf8(mem::transmute(slice)).unwrap_or(0);
506507
self.vec.set_len(cur_len + used);
507508
}
508509
}

branches/try/src/libcollections/treemap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ use core::mem::{replace, swap};
4040
use core::ptr;
4141
use std::hash::{Writer, Hash};
4242

43-
use {Mutable, Set, MutableSet, MutableMap, Map, MutableSeq};
43+
use {Collection, Mutable, Set, MutableSet, MutableMap, Map, MutableSeq};
4444
use vec::Vec;
4545

4646
/// This is implemented as an AA tree, which is a simplified variation of

branches/try/src/libcollections/trie.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use core::uint;
2323
use core::iter;
2424
use std::hash::{Writer, Hash};
2525

26-
use {Mutable, Map, MutableMap, Set, MutableSet};
26+
use {Collection, Mutable, Map, MutableMap, Set, MutableSet};
2727
use slice::{Items, MutItems};
2828
use slice;
2929

branches/try/src/libcollections/vec.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@ use core::prelude::*;
1414

1515
use alloc::heap::{allocate, reallocate, deallocate};
1616
use RawSlice = core::raw::Slice;
17+
use core::slice::Slice;
1718
use core::cmp::max;
1819
use core::default::Default;
1920
use core::fmt;
2021
use core::mem;
22+
use core::num::{CheckedMul, CheckedAdd};
2123
use core::num;
2224
use core::ptr;
2325
use core::uint;
2426

25-
use {Mutable, MutableSeq};
27+
use {Collection, Mutable, MutableSeq};
2628
use slice::{MutableOrdSlice, MutableSliceAllocating, CloneableVector};
2729
use slice::{Items, MutItems};
2830

branches/try/src/libcore/char.rs

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use mem::transmute;
1919
use option::{None, Option, Some};
2020
use iter::range_step;
21+
use collections::Collection;
2122

2223
// UTF-8 ranges and tags for encoding characters
2324
static TAG_CONT: u8 = 0b1000_0000u8;
@@ -27,7 +28,6 @@ static TAG_FOUR_B: u8 = 0b1111_0000u8;
2728
static MAX_ONE_B: u32 = 0x80u32;
2829
static MAX_TWO_B: u32 = 0x800u32;
2930
static MAX_THREE_B: u32 = 0x10000u32;
30-
static MAX_FOUR_B: u32 = 0x200000u32;
3131

3232
/*
3333
Lu Uppercase_Letter an uppercase letter
@@ -217,14 +217,14 @@ pub fn escape_default(c: char, f: |char|) {
217217
}
218218

219219
/// Returns the amount of bytes this `char` would need if encoded in UTF-8
220+
#[inline]
220221
pub fn len_utf8_bytes(c: char) -> uint {
221222
let code = c as u32;
222223
match () {
223224
_ if code < MAX_ONE_B => 1u,
224225
_ if code < MAX_TWO_B => 2u,
225226
_ if code < MAX_THREE_B => 3u,
226-
_ if code < MAX_FOUR_B => 4u,
227-
_ => fail!("invalid character!"),
227+
_ => 4u,
228228
}
229229
}
230230

@@ -297,21 +297,19 @@ pub trait Char {
297297
/// UTF-8.
298298
fn len_utf8_bytes(&self) -> uint;
299299

300-
/// Encodes this character as UTF-8 into the provided byte buffer.
301-
///
302-
/// The buffer must be at least 4 bytes long or a runtime failure may
303-
/// occur.
300+
/// Encodes this character as UTF-8 into the provided byte buffer,
301+
/// and then returns the number of bytes written.
304302
///
305-
/// This will then return the number of bytes written to the slice.
306-
fn encode_utf8(&self, dst: &mut [u8]) -> uint;
303+
/// If the buffer is not large enough, nothing will be written into it
304+
/// and a `None` will be returned.
305+
fn encode_utf8(&self, dst: &mut [u8]) -> Option<uint>;
307306

308-
/// Encodes this character as UTF-16 into the provided `u16` buffer.
307+
/// Encodes this character as UTF-16 into the provided `u16` buffer,
308+
/// and then returns the number of `u16`s written.
309309
///
310-
/// The buffer must be at least 2 elements long or a runtime failure may
311-
/// occur.
312-
///
313-
/// This will then return the number of `u16`s written to the slice.
314-
fn encode_utf16(&self, dst: &mut [u16]) -> uint;
310+
/// If the buffer is not large enough, nothing will be written into it
311+
/// and a `None` will be returned.
312+
fn encode_utf16(&self, dst: &mut [u16]) -> Option<uint>;
315313
}
316314

317315
impl Char for char {
@@ -325,45 +323,52 @@ impl Char for char {
325323

326324
fn escape_default(&self, f: |char|) { escape_default(*self, f) }
327325

326+
#[inline]
328327
fn len_utf8_bytes(&self) -> uint { len_utf8_bytes(*self) }
329328

330-
fn encode_utf8<'a>(&self, dst: &'a mut [u8]) -> uint {
329+
#[inline]
330+
fn encode_utf8<'a>(&self, dst: &'a mut [u8]) -> Option<uint> {
331+
// Marked #[inline] to allow llvm optimizing it away
331332
let code = *self as u32;
332-
if code < MAX_ONE_B {
333+
if code < MAX_ONE_B && dst.len() >= 1 {
333334
dst[0] = code as u8;
334-
1
335-
} else if code < MAX_TWO_B {
335+
Some(1)
336+
} else if code < MAX_TWO_B && dst.len() >= 2 {
336337
dst[0] = (code >> 6u & 0x1F_u32) as u8 | TAG_TWO_B;
337338
dst[1] = (code & 0x3F_u32) as u8 | TAG_CONT;
338-
2
339-
} else if code < MAX_THREE_B {
339+
Some(2)
340+
} else if code < MAX_THREE_B && dst.len() >= 3 {
340341
dst[0] = (code >> 12u & 0x0F_u32) as u8 | TAG_THREE_B;
341342
dst[1] = (code >> 6u & 0x3F_u32) as u8 | TAG_CONT;
342343
dst[2] = (code & 0x3F_u32) as u8 | TAG_CONT;
343-
3
344-
} else {
344+
Some(3)
345+
} else if dst.len() >= 4 {
345346
dst[0] = (code >> 18u & 0x07_u32) as u8 | TAG_FOUR_B;
346347
dst[1] = (code >> 12u & 0x3F_u32) as u8 | TAG_CONT;
347348
dst[2] = (code >> 6u & 0x3F_u32) as u8 | TAG_CONT;
348349
dst[3] = (code & 0x3F_u32) as u8 | TAG_CONT;
349-
4
350+
Some(4)
351+
} else {
352+
None
350353
}
351354
}
352355

353-
fn encode_utf16(&self, dst: &mut [u16]) -> uint {
356+
#[inline]
357+
fn encode_utf16(&self, dst: &mut [u16]) -> Option<uint> {
358+
// Marked #[inline] to allow llvm optimizing it away
354359
let mut ch = *self as u32;
355-
if (ch & 0xFFFF_u32) == ch {
360+
if (ch & 0xFFFF_u32) == ch && dst.len() >= 1 {
356361
// The BMP falls through (assuming non-surrogate, as it should)
357-
assert!(ch <= 0xD7FF_u32 || ch >= 0xE000_u32);
358362
dst[0] = ch as u16;
359-
1
360-
} else {
363+
Some(1)
364+
} else if dst.len() >= 2 {
361365
// Supplementary planes break into surrogates.
362-
assert!(ch >= 0x1_0000_u32 && ch <= 0x10_FFFF_u32);
363366
ch -= 0x1_0000_u32;
364367
dst[0] = 0xD800_u16 | ((ch >> 10) as u16);
365368
dst[1] = 0xDC00_u16 | ((ch as u16) & 0x3FF_u16);
366-
2
369+
Some(2)
370+
} else {
371+
None
367372
}
368373
}
369374
}

0 commit comments

Comments
 (0)