Skip to content

Commit 51ccdb4

Browse files
committed
---
yaml --- r: 273481 b: refs/heads/beta c: d7bf3d3 h: refs/heads/master i: 273479: 657cd3b
1 parent 591f248 commit 51ccdb4

File tree

69 files changed

+3208
-571
lines changed

Some content is hidden

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

69 files changed

+3208
-571
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
2323
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
2424
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
2525
refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
26-
refs/heads/beta: 45c72d5f5bdec4827d539fc12e52297248f1d1ec
26+
refs/heads/beta: d7bf3d328457d6b49b1c92d752ef2022c0b0bded
2727
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
2828
refs/heads/tmp: e06d2ad9fcd5027bcaac5b08fc9aa39a49d0ecd3
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f

branches/beta/configure

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,7 @@ then
10341034
if [ -n "$CFG_OSX_CLANG_VERSION" ]
10351035
then
10361036
case $CFG_OSX_CLANG_VERSION in
1037-
(7.0* | 7.1* | 7.2*)
1037+
(7.0* | 7.1* | 7.2* | 7.3*)
10381038
step_msg "found ok version of APPLE CLANG: $CFG_OSX_CLANG_VERSION"
10391039
;;
10401040
(*)

branches/beta/mk/crates.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ DEPS_rustc := syntax fmt_macros flate arena serialize getopts rbml rustc_front\
9797
log graphviz rustc_llvm rustc_back rustc_data_structures\
9898
rustc_const_eval
9999
DEPS_rustc_back := std syntax rustc_llvm rustc_front flate log libc
100-
DEPS_rustc_borrowck := rustc rustc_front log graphviz syntax
100+
DEPS_rustc_borrowck := rustc rustc_front rustc_mir log graphviz syntax
101101
DEPS_rustc_data_structures := std log serialize
102102
DEPS_rustc_driver := arena flate getopts graphviz libc rustc rustc_back rustc_borrowck \
103103
rustc_typeck rustc_mir rustc_resolve log syntax serialize rustc_llvm \

branches/beta/src/bootstrap/build/check.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,11 @@ pub fn linkcheck(build: &Build, stage: u32, host: &str) {
1616
build.run(build.tool_cmd(&compiler, "linkchecker")
1717
.arg(build.out.join(host).join("doc")));
1818
}
19+
20+
pub fn cargotest(build: &Build, stage: u32, host: &str) {
21+
let ref compiler = Compiler::new(stage, host);
22+
build.run(build.tool_cmd(compiler, "cargotest")
23+
.env("RUSTC", build.compiler_path(compiler))
24+
.env("RUSTDOC", build.rustdoc(compiler))
25+
.arg(&build.cargo));
26+
}

branches/beta/src/bootstrap/build/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,9 @@ impl Build {
183183
compile::tool(self, stage, target.target,
184184
"error_index_generator");
185185
}
186+
ToolCargoTest { stage } => {
187+
compile::tool(self, stage, target.target, "cargotest");
188+
}
186189
DocBook { stage } => {
187190
doc::rustbook(self, stage, target.target, "book", &doc_out);
188191
}
@@ -210,6 +213,9 @@ impl Build {
210213
CheckLinkcheck { stage } => {
211214
check::linkcheck(self, stage, target.target);
212215
}
216+
CheckCargoTest { stage } => {
217+
check::cargotest(self, stage, target.target);
218+
}
213219

214220
DistDocs { stage } => dist::docs(self, stage, target.target),
215221
DistMingw { _dummy } => dist::mingw(self, target.target),

branches/beta/src/bootstrap/build/step.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ macro_rules! targets {
4747
(tool_linkchecker, ToolLinkchecker { stage: u32 }),
4848
(tool_rustbook, ToolRustbook { stage: u32 }),
4949
(tool_error_index, ToolErrorIndex { stage: u32 }),
50+
(tool_cargotest, ToolCargoTest { stage: u32 }),
5051

5152
// Steps for long-running native builds. Ideally these wouldn't
5253
// actually exist and would be part of build scripts, but for now
@@ -73,6 +74,7 @@ macro_rules! targets {
7374
// target to depend on a bunch of others.
7475
(check, Check { stage: u32, compiler: Compiler<'a> }),
7576
(check_linkcheck, CheckLinkcheck { stage: u32 }),
77+
(check_cargotest, CheckCargoTest { stage: u32 }),
7678

7779
// Distribution targets, creating tarballs
7880
(dist, Dist { stage: u32 }),
@@ -292,6 +294,9 @@ impl<'a> Step<'a> {
292294
Source::CheckLinkcheck { stage } => {
293295
vec![self.tool_linkchecker(stage), self.doc(stage)]
294296
}
297+
Source::CheckCargoTest { stage } => {
298+
vec![self.tool_cargotest(stage)]
299+
}
295300

296301
Source::ToolLinkchecker { stage } => {
297302
vec![self.libstd(self.compiler(stage))]
@@ -300,6 +305,9 @@ impl<'a> Step<'a> {
300305
Source::ToolRustbook { stage } => {
301306
vec![self.librustc(self.compiler(stage))]
302307
}
308+
Source::ToolCargoTest { stage } => {
309+
vec![self.libstd(self.compiler(stage))]
310+
}
303311

304312
Source::DistDocs { stage } => vec![self.doc(stage)],
305313
Source::DistMingw { _dummy: _ } => Vec::new(),

branches/beta/src/bootstrap/mk/Makefile.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ standalone-docs:
3838
$(Q)$(BOOTSTRAP) --step doc-standalone
3939
check:
4040
$(Q)$(BOOTSTRAP) --step check
41+
cargotest:
42+
$(Q)$(BOOTSTRAP) --step cargotest
4143
dist:
4244
$(Q)$(BOOTSTRAP) --step dist
4345

branches/beta/src/doc/reference.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1905,6 +1905,8 @@ type int8_t = i8;
19051905
- `should_panic` - indicates that this test function should panic, inverting the success condition.
19061906
- `cold` - The function is unlikely to be executed, so optimize it (and calls
19071907
to it) differently.
1908+
- `naked` - The function utilizes a custom ABI or custom inline ASM that requires
1909+
epilogue and prologue to be skipped.
19081910

19091911
### Static-only attributes
19101912

branches/beta/src/libcollections/string.rs

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ use core::iter::FromIterator;
6161
use core::mem;
6262
use core::ops::{self, Add, Index, IndexMut};
6363
use core::ptr;
64-
use core::slice;
6564
use core::str::pattern::Pattern;
6665
use rustc_unicode::char::{decode_utf16, REPLACEMENT_CHARACTER};
6766
use rustc_unicode::str as unicode_str;
@@ -970,22 +969,7 @@ impl String {
970969
pub fn push(&mut self, ch: char) {
971970
match ch.len_utf8() {
972971
1 => self.vec.push(ch as u8),
973-
ch_len => {
974-
let cur_len = self.len();
975-
// This may use up to 4 bytes.
976-
self.vec.reserve(ch_len);
977-
978-
unsafe {
979-
// Attempt to not use an intermediate buffer by just pushing bytes
980-
// directly onto this string.
981-
let slice = slice::from_raw_parts_mut(self.vec
982-
.as_mut_ptr()
983-
.offset(cur_len as isize),
984-
ch_len);
985-
let used = ch.encode_utf8(slice).unwrap_or(0);
986-
self.vec.set_len(cur_len + used);
987-
}
988-
}
972+
_ => self.vec.extend_from_slice(ch.encode_utf8().as_slice()),
989973
}
990974
}
991975

@@ -1136,9 +1120,10 @@ impl String {
11361120
let len = self.len();
11371121
assert!(idx <= len);
11381122
assert!(self.is_char_boundary(idx));
1139-
self.vec.reserve(4);
1140-
let mut bits = [0; 4];
1141-
let amt = ch.encode_utf8(&mut bits).unwrap();
1123+
let bits = ch.encode_utf8();
1124+
let bits = bits.as_slice();
1125+
let amt = bits.len();
1126+
self.vec.reserve(amt);
11421127

11431128
unsafe {
11441129
ptr::copy(self.vec.as_ptr().offset(idx as isize),

branches/beta/src/libcollectionstest/str.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -794,10 +794,9 @@ fn test_rev_iterator() {
794794

795795
#[test]
796796
fn test_chars_decoding() {
797-
let mut bytes = [0; 4];
798797
for c in (0..0x110000).filter_map(::std::char::from_u32) {
799-
let len = c.encode_utf8(&mut bytes).unwrap_or(0);
800-
let s = ::std::str::from_utf8(&bytes[..len]).unwrap();
798+
let bytes = c.encode_utf8();
799+
let s = ::std::str::from_utf8(bytes.as_slice()).unwrap();
801800
if Some(c) != s.chars().next() {
802801
panic!("character {:x}={} does not decode correctly", c as u32, c);
803802
}
@@ -806,10 +805,9 @@ fn test_chars_decoding() {
806805

807806
#[test]
808807
fn test_chars_rev_decoding() {
809-
let mut bytes = [0; 4];
810808
for c in (0..0x110000).filter_map(::std::char::from_u32) {
811-
let len = c.encode_utf8(&mut bytes).unwrap_or(0);
812-
let s = ::std::str::from_utf8(&bytes[..len]).unwrap();
809+
let bytes = c.encode_utf8();
810+
let s = ::std::str::from_utf8(bytes.as_slice()).unwrap();
813811
if Some(c) != s.chars().rev().next() {
814812
panic!("character {:x}={} does not decode correctly", c as u32, c);
815813
}

branches/beta/src/libcore/char.rs

Lines changed: 119 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -269,10 +269,10 @@ pub trait CharExt {
269269
fn len_utf8(self) -> usize;
270270
#[stable(feature = "core", since = "1.6.0")]
271271
fn len_utf16(self) -> usize;
272-
#[stable(feature = "core", since = "1.6.0")]
273-
fn encode_utf8(self, dst: &mut [u8]) -> Option<usize>;
274-
#[stable(feature = "core", since = "1.6.0")]
275-
fn encode_utf16(self, dst: &mut [u16]) -> Option<usize>;
272+
#[unstable(feature = "unicode", issue = "27784")]
273+
fn encode_utf8(self) -> EncodeUtf8;
274+
#[unstable(feature = "unicode", issue = "27784")]
275+
fn encode_utf16(self) -> EncodeUtf16;
276276
}
277277

278278
#[stable(feature = "core", since = "1.6.0")]
@@ -336,75 +336,47 @@ impl CharExt for char {
336336
}
337337

338338
#[inline]
339-
fn encode_utf8(self, dst: &mut [u8]) -> Option<usize> {
340-
encode_utf8_raw(self as u32, dst)
339+
fn encode_utf8(self) -> EncodeUtf8 {
340+
let code = self as u32;
341+
let mut buf = [0; 4];
342+
let pos = if code < MAX_ONE_B {
343+
buf[3] = code as u8;
344+
3
345+
} else if code < MAX_TWO_B {
346+
buf[2] = (code >> 6 & 0x1F) as u8 | TAG_TWO_B;
347+
buf[3] = (code & 0x3F) as u8 | TAG_CONT;
348+
2
349+
} else if code < MAX_THREE_B {
350+
buf[1] = (code >> 12 & 0x0F) as u8 | TAG_THREE_B;
351+
buf[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT;
352+
buf[3] = (code & 0x3F) as u8 | TAG_CONT;
353+
1
354+
} else {
355+
buf[0] = (code >> 18 & 0x07) as u8 | TAG_FOUR_B;
356+
buf[1] = (code >> 12 & 0x3F) as u8 | TAG_CONT;
357+
buf[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT;
358+
buf[3] = (code & 0x3F) as u8 | TAG_CONT;
359+
0
360+
};
361+
EncodeUtf8 { buf: buf, pos: pos }
341362
}
342363

343364
#[inline]
344-
fn encode_utf16(self, dst: &mut [u16]) -> Option<usize> {
345-
encode_utf16_raw(self as u32, dst)
346-
}
347-
}
348-
349-
/// Encodes a raw u32 value as UTF-8 into the provided byte buffer,
350-
/// and then returns the number of bytes written.
351-
///
352-
/// If the buffer is not large enough, nothing will be written into it
353-
/// and a `None` will be returned.
354-
#[inline]
355-
#[unstable(feature = "char_internals",
356-
reason = "this function should not be exposed publicly",
357-
issue = "0")]
358-
#[doc(hidden)]
359-
pub fn encode_utf8_raw(code: u32, dst: &mut [u8]) -> Option<usize> {
360-
// Marked #[inline] to allow llvm optimizing it away
361-
if code < MAX_ONE_B && !dst.is_empty() {
362-
dst[0] = code as u8;
363-
Some(1)
364-
} else if code < MAX_TWO_B && dst.len() >= 2 {
365-
dst[0] = (code >> 6 & 0x1F) as u8 | TAG_TWO_B;
366-
dst[1] = (code & 0x3F) as u8 | TAG_CONT;
367-
Some(2)
368-
} else if code < MAX_THREE_B && dst.len() >= 3 {
369-
dst[0] = (code >> 12 & 0x0F) as u8 | TAG_THREE_B;
370-
dst[1] = (code >> 6 & 0x3F) as u8 | TAG_CONT;
371-
dst[2] = (code & 0x3F) as u8 | TAG_CONT;
372-
Some(3)
373-
} else if dst.len() >= 4 {
374-
dst[0] = (code >> 18 & 0x07) as u8 | TAG_FOUR_B;
375-
dst[1] = (code >> 12 & 0x3F) as u8 | TAG_CONT;
376-
dst[2] = (code >> 6 & 0x3F) as u8 | TAG_CONT;
377-
dst[3] = (code & 0x3F) as u8 | TAG_CONT;
378-
Some(4)
379-
} else {
380-
None
381-
}
382-
}
383-
384-
/// Encodes a raw u32 value as UTF-16 into the provided `u16` buffer,
385-
/// and then returns the number of `u16`s written.
386-
///
387-
/// If the buffer is not large enough, nothing will be written into it
388-
/// and a `None` will be returned.
389-
#[inline]
390-
#[unstable(feature = "char_internals",
391-
reason = "this function should not be exposed publicly",
392-
issue = "0")]
393-
#[doc(hidden)]
394-
pub fn encode_utf16_raw(mut ch: u32, dst: &mut [u16]) -> Option<usize> {
395-
// Marked #[inline] to allow llvm optimizing it away
396-
if (ch & 0xFFFF) == ch && !dst.is_empty() {
397-
// The BMP falls through (assuming non-surrogate, as it should)
398-
dst[0] = ch as u16;
399-
Some(1)
400-
} else if dst.len() >= 2 {
401-
// Supplementary planes break into surrogates.
402-
ch -= 0x1_0000;
403-
dst[0] = 0xD800 | ((ch >> 10) as u16);
404-
dst[1] = 0xDC00 | ((ch as u16) & 0x3FF);
405-
Some(2)
406-
} else {
407-
None
365+
fn encode_utf16(self) -> EncodeUtf16 {
366+
let mut buf = [0; 2];
367+
let mut code = self as u32;
368+
let pos = if (code & 0xFFFF) == code {
369+
// The BMP falls through (assuming non-surrogate, as it should)
370+
buf[1] = code as u16;
371+
1
372+
} else {
373+
// Supplementary planes break into surrogates.
374+
code -= 0x1_0000;
375+
buf[0] = 0xD800 | ((code >> 10) as u16);
376+
buf[1] = 0xDC00 | ((code as u16) & 0x3FF);
377+
0
378+
};
379+
EncodeUtf16 { buf: buf, pos: pos }
408380
}
409381
}
410382

@@ -583,3 +555,80 @@ impl Iterator for EscapeDefault {
583555
}
584556
}
585557
}
558+
559+
/// An iterator over `u8` entries represending the UTF-8 encoding of a `char`
560+
/// value.
561+
///
562+
/// Constructed via the `.encode_utf8()` method on `char`.
563+
#[unstable(feature = "unicode", issue = "27784")]
564+
#[derive(Debug)]
565+
pub struct EncodeUtf8 {
566+
buf: [u8; 4],
567+
pos: usize,
568+
}
569+
570+
impl EncodeUtf8 {
571+
/// Returns the remaining bytes of this iterator as a slice.
572+
#[unstable(feature = "unicode", issue = "27784")]
573+
pub fn as_slice(&self) -> &[u8] {
574+
&self.buf[self.pos..]
575+
}
576+
}
577+
578+
#[unstable(feature = "unicode", issue = "27784")]
579+
impl Iterator for EncodeUtf8 {
580+
type Item = u8;
581+
582+
fn next(&mut self) -> Option<u8> {
583+
if self.pos == self.buf.len() {
584+
None
585+
} else {
586+
let ret = Some(self.buf[self.pos]);
587+
self.pos += 1;
588+
ret
589+
}
590+
}
591+
592+
fn size_hint(&self) -> (usize, Option<usize>) {
593+
self.as_slice().iter().size_hint()
594+
}
595+
}
596+
597+
/// An iterator over `u16` entries represending the UTF-16 encoding of a `char`
598+
/// value.
599+
///
600+
/// Constructed via the `.encode_utf16()` method on `char`.
601+
#[unstable(feature = "unicode", issue = "27784")]
602+
#[derive(Debug)]
603+
pub struct EncodeUtf16 {
604+
buf: [u16; 2],
605+
pos: usize,
606+
}
607+
608+
impl EncodeUtf16 {
609+
/// Returns the remaining bytes of this iterator as a slice.
610+
#[unstable(feature = "unicode", issue = "27784")]
611+
pub fn as_slice(&self) -> &[u16] {
612+
&self.buf[self.pos..]
613+
}
614+
}
615+
616+
617+
#[unstable(feature = "unicode", issue = "27784")]
618+
impl Iterator for EncodeUtf16 {
619+
type Item = u16;
620+
621+
fn next(&mut self) -> Option<u16> {
622+
if self.pos == self.buf.len() {
623+
None
624+
} else {
625+
let ret = Some(self.buf[self.pos]);
626+
self.pos += 1;
627+
ret
628+
}
629+
}
630+
631+
fn size_hint(&self) -> (usize, Option<usize>) {
632+
self.as_slice().iter().size_hint()
633+
}
634+
}

0 commit comments

Comments
 (0)